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