001    /*
002    // $Id: DrillReplaceTransform.java 482 2012-01-05 23:27:27Z jhyde $
003    //
004    // Licensed to Julian Hyde under one or more contributor license
005    // agreements. See the NOTICE file distributed with this work for
006    // additional information regarding copyright ownership.
007    //
008    // Julian Hyde licenses this file to you under the Apache License,
009    // Version 2.0 (the "License"); you may not use this file except in
010    // compliance with the License. You may obtain a copy of the License at:
011    //
012    // http://www.apache.org/licenses/LICENSE-2.0
013    //
014    // Unless required by applicable law or agreed to in writing, software
015    // distributed under the License is distributed on an "AS IS" BASIS,
016    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017    // See the License for the specific language governing permissions and
018    // limitations under the License.
019    */
020    package org.olap4j.transform;
021    
022    import org.olap4j.Axis;
023    import org.olap4j.CellSet;
024    import org.olap4j.mdx.ParseTreeNode;
025    import org.olap4j.metadata.Member;
026    
027    /**
028     * Drill replace transformation
029     *
030     * <p>Description: Replaces a member at a specific position on an axis by its
031     * children. The member to drill is identified from a CellSet with the axis,
032     * positionOrdinalInAxis and memberOrdinalInPosition arguments.
033     *
034     * <p>Example of use: the user clicks on a member in a crosstab axis, in order
035     * to see its children.
036     *
037     * <p>Applicability: this transform is applicable only to members in a query
038     * that are drillable, i.e. non-leaf members. The CellSet resulting from the
039     * execution of the initial MDX query must also be available.
040     *
041     * @author etdub
042     * @version $Id: DrillReplaceTransform.java 482 2012-01-05 23:27:27Z jhyde $
043     * @since Jul 30, 2008
044     */
045    public class DrillReplaceTransform extends AxisTransform {
046    
047        // private final int positionOrdinalInAxis;
048        // private final int memberOrdinalInPosition;
049        // private final CellSet cellSet;
050    
051        // private final Position positionToDrill;
052        private final Member memberToDrill;
053        // private final List<Member> pathToMember;
054    
055        /**
056         * ctor
057         *
058         * @param axis axis (of the resulting CellSet) the member to be drilled
059         * @param positionOrdinalInAxis position ordinal in axis of the member to
060         *                              be drilled
061         * @param memberOrdinalInPosition ordinal in position of the member to be
062         *                                drilled
063         * @param cellSet the CellSet resulting from execution of the query to be
064         *                transformed
065         */
066        public DrillReplaceTransform(
067            Axis axis,
068            int positionOrdinalInAxis,
069            int memberOrdinalInPosition,
070            CellSet cellSet)
071        {
072            super(axis);
073    
074            // this.positionOrdinalInAxis = positionOrdinalInAxis;
075            // this.memberOrdinalInPosition = memberOrdinalInPosition;
076            // this.cellSet = cellSet;
077    
078            // Position positionToDrill =
079            //     TransformUtil.getPositionFromCellSet(axis, positionOrdinalInAxis,
080            //          cellSet);
081            memberToDrill = TransformUtil.getMemberFromCellSet(
082                axis, positionOrdinalInAxis, memberOrdinalInPosition, cellSet);
083            // pathToMember = getPathToMember(positionToDrill,
084            //        memberOrdinalInPosition);
085        }
086    
087        public String getName() {
088            return "Drill Replace On Member";
089        }
090    
091        public String getDescription() {
092            return "Drills and replace (by its children) a member on an axis";
093        }
094    
095        @Override
096        protected ParseTreeNode processAxisExp(ParseTreeNode exp) {
097            // FIXME: for now only 1 dimension on an axis is supported,
098            // (naive implementation only used for proof of concept)
099            return MdxHelper.makeSetCallNode(
100                MdxHelper.makeChildrenCallNode(
101                    MdxHelper.makeMemberNode(memberToDrill)));
102        }
103    
104    }
105    
106    // End DrillReplaceTransform.java
107    
108