001 /* 002 // $Id: AxisTransform.java 229 2009-05-08 19:11:29Z jhyde $ 003 // This software is subject to the terms of the Eclipse Public License v1.0 004 // Agreement, available at the following URL: 005 // http://www.eclipse.org/legal/epl-v10.html. 006 // Copyright (C) 2008-2008 Julian Hyde 007 // All Rights Reserved. 008 // You must accept the terms of that agreement to use this software. 009 */ 010 package org.olap4j.transform; 011 012 import org.olap4j.Axis; 013 import org.olap4j.mdx.AxisNode; 014 import org.olap4j.mdx.ParseTreeNode; 015 import org.olap4j.mdx.SelectNode; 016 017 /** 018 * Abstract representation of an MDX query transform acting on 019 * a single query axis (e.g. drill-down on member, roll-up, ...) 020 * 021 * @author etdub 022 * @version $Id: AxisTransform.java 229 2009-05-08 19:11:29Z jhyde $ 023 * @since Aug 7, 2008 024 * 025 */ 026 public abstract class AxisTransform implements MdxQueryTransform { 027 028 protected final Axis axis; 029 030 protected AxisTransform(Axis axis) { 031 this.axis = axis; 032 } 033 034 public SelectNode apply(SelectNode sn) { 035 // do a deep copy of the existing query SelectNode before 036 // modifying it: 037 SelectNode newSelectNode = sn.deepCopy(); 038 039 for (AxisNode an : newSelectNode.getAxisList()) { 040 if (an.getAxis() == axis) { 041 // this is the axis we're drilling 042 043 ParseTreeNode initialAxisExp = an.getExpression(); 044 045 // apply the drill operation 046 ParseTreeNode newAxisExp = 047 processAxisExp(initialAxisExp); 048 049 // replace the expression in the axis by the new generated one 050 an.setExpression(newAxisExp); 051 } 052 } 053 return newSelectNode; 054 } 055 056 protected abstract ParseTreeNode processAxisExp(ParseTreeNode axisExp); 057 058 } 059 060 // End AxisTransform.java