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