1 10 package mondrian.olap.fun; 11 12 import mondrian.calc.Calc; 13 import mondrian.calc.ExpCompiler; 14 import mondrian.calc.HierarchyCalc; 15 import mondrian.calc.impl.AbstractMemberCalc; 16 import mondrian.mdx.ResolvedFunCall; 17 import mondrian.olap.*; 18 19 26 public class HierarchyCurrentMemberFunDef extends FunDefBase { 27 static final HierarchyCurrentMemberFunDef instance = 28 new HierarchyCurrentMemberFunDef(); 29 30 private HierarchyCurrentMemberFunDef() { 31 super("CurrentMember", "<Hierarchy>.CurrentMember", 32 "Returns the current member along a hierarchy during an iteration.", 33 "pmh"); 34 } 35 36 public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { 37 final HierarchyCalc hierarchyCalc = 38 compiler.compileHierarchy(call.getArg(0)); 39 return new CalcImpl(call, hierarchyCalc); 40 } 41 42 public static class CalcImpl extends AbstractMemberCalc { 43 private final HierarchyCalc hierarchyCalc; 44 45 public CalcImpl(Exp exp, HierarchyCalc hierarchyCalc) { 46 super(exp, new Calc[] {hierarchyCalc}); 47 this.hierarchyCalc = hierarchyCalc; 48 } 49 50 protected String getName() { 51 return "CurrentMember"; 52 } 53 54 public Member evaluateMember(Evaluator evaluator) { 55 Hierarchy hierarchy = 56 hierarchyCalc.evaluateHierarchy(evaluator); 57 Member member = evaluator.getContext(hierarchy.getDimension()); 58 if (member.getHierarchy() != hierarchy) { 67 member = hierarchy.getDefaultMember(); 68 } 69 return member; 70 } 71 72 public boolean dependsOn(Dimension dimension) { 73 return hierarchyCalc.getType().usesDimension(dimension, true); 74 } 75 } 76 } 77 78 | Popular Tags |