001 /*
002 // $Id: RollUpLevelTransform.java 247 2009-06-20 05:52:40Z 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 * Roll-up level transformation
019 *
020 * <p>Description: Replaces a member at a specific position on an axis by all
021 * the members of its parent's level. The member to roll-up is identified from
022 * a CellSet with the axis, positionOrdinalInAxis and memberOrdinalInPosition
023 * arguments.
024 *
025 * <p>Example of use: the user clicks on a member in a crosstab axis, in order
026 * to roll up to the members of the upper level.
027 *
028 * <p>Applicability: this transform is applicable only to members in a query
029 * that are have a parent. (Note: how would this work in parent-child
030 * hierarchies?)
031 *
032 * @author etdub
033 * @version $Id: RollUpLevelTransform.java 247 2009-06-20 05:52:40Z jhyde $
034 * @since Aug 4, 2008
035 */
036 public class RollUpLevelTransform extends AxisTransform {
037
038 // private final int positionOrdinalInAxis;
039 // private final int memberOrdinalInPosition;
040 // private final CellSet cellSet;
041
042 // private final Position positionToDrill;
043 private final Member memberToDrill;
044 // private final List<Member> pathToMember;
045
046 /**
047 * ctor
048 *
049 * @param axis
050 * @param positionOrdinalInAxis
051 * @param memberOrdinalInPosition
052 * @param cellSet
053 */
054 public RollUpLevelTransform(
055 Axis axis,
056 int positionOrdinalInAxis,
057 int memberOrdinalInPosition,
058 CellSet cellSet)
059 {
060 super(axis);
061
062 // this.positionOrdinalInAxis = positionOrdinalInAxis;
063 // this.memberOrdinalInPosition = memberOrdinalInPosition;
064 // this.cellSet = cellSet;
065
066 // Position positionToDrill =
067 // TransformUtil.getPositionFromCellSet(axis, positionOrdinalInAxis,
068 // cellSet);
069 memberToDrill = TransformUtil.getMemberFromCellSet(
070 axis, positionOrdinalInAxis, memberOrdinalInPosition, cellSet);
071 // pathToMember = getPathToMember(positionToDrill,
072 // memberOrdinalInPosition);
073 }
074
075 public String getName() {
076 return "Roll member up a level";
077 }
078
079 public String getDescription() {
080 return "Replaces the member expression on the axis by all members "
081 + "on its parent level";
082 }
083
084 @Override
085 protected ParseTreeNode processAxisExp(ParseTreeNode exp) {
086 // FIXME: for now only 1 dimension on an axis is supported,
087 // (naive implementation only used for proof of concept)
088 return MdxHelper.makeSetCallNode(
089 MdxHelper.makeMembersCallNode(
090 MdxHelper.makeLevelCallNode(
091 MdxHelper.makeParentCallNode(
092 MdxHelper.makeMemberNode(memberToDrill)))));
093 }
094
095 }
096
097 // End RollUpLevelTransform.java