001 /*
002 // $Id: DrillReplaceTransform.java 246 2009-06-11 00:35:21Z 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.CellSet;
014 import org.olap4j.mdx.ParseTreeNode;
015 import org.olap4j.metadata.Member;
016
017 /**
018 * Drill replace transformation
019 *
020 * <p>Description: Replaces a member at a specific position on an axis by its
021 * children. The member to drill is identified from a CellSet with the axis,
022 * positionOrdinalInAxis and memberOrdinalInPosition arguments.
023 *
024 * <p>Example of use: the user clicks on a member in a crosstab axis, in order
025 * to see its children.
026 *
027 * <p>Applicability: this transform is applicable only to members in a query
028 * that are drillable, i.e. non-leaf members. The CellSet resulting from the
029 * execution of the initial MDX query must also be available.
030 *
031 * @author etdub
032 * @version $Id: DrillReplaceTransform.java 246 2009-06-11 00:35:21Z jhyde $
033 * @since Jul 30, 2008
034 */
035 public class DrillReplaceTransform extends AxisTransform {
036
037 // private final int positionOrdinalInAxis;
038 // private final int memberOrdinalInPosition;
039 // private final CellSet cellSet;
040
041 // private final Position positionToDrill;
042 private final Member memberToDrill;
043 // private final List<Member> pathToMember;
044
045 /**
046 * ctor
047 *
048 * @param axis axis (of the resulting CellSet) the member to be drilled
049 * @param positionOrdinalInAxis position ordinal in axis of the member to
050 * be drilled
051 * @param memberOrdinalInPosition ordinal in position of the member to be
052 * drilled
053 * @param cellSet the CellSet resulting from execution of the query to be
054 * transformed
055 */
056 public DrillReplaceTransform(
057 Axis axis,
058 int positionOrdinalInAxis,
059 int memberOrdinalInPosition,
060 CellSet cellSet)
061 {
062 super(axis);
063
064 // this.positionOrdinalInAxis = positionOrdinalInAxis;
065 // this.memberOrdinalInPosition = memberOrdinalInPosition;
066 // this.cellSet = cellSet;
067
068 // Position positionToDrill =
069 // TransformUtil.getPositionFromCellSet(axis, positionOrdinalInAxis,
070 // cellSet);
071 memberToDrill = TransformUtil.getMemberFromCellSet(
072 axis, positionOrdinalInAxis, memberOrdinalInPosition, cellSet);
073 // pathToMember = getPathToMember(positionToDrill,
074 // memberOrdinalInPosition);
075 }
076
077 public String getName() {
078 return "Drill Replace On Member";
079 }
080
081 public String getDescription() {
082 return "Drills and replace (by its children) a member on an axis";
083 }
084
085 @Override
086 protected ParseTreeNode processAxisExp(ParseTreeNode exp) {
087 // FIXME: for now only 1 dimension on an axis is supported,
088 // (naive implementation only used for proof of concept)
089 return MdxHelper.makeSetCallNode(
090 MdxHelper.makeChildrenCallNode(
091 MdxHelper.makeMemberNode(memberToDrill)));
092 }
093
094 }
095
096 // End DrillReplaceTransform.java