1 10 package mondrian.olap.fun; 11 12 import mondrian.olap.FunDef; 13 import mondrian.olap.Member; 14 import mondrian.olap.Evaluator; 15 import mondrian.olap.Level; 16 import mondrian.olap.type.Type; 17 import mondrian.olap.type.LevelType; 18 import mondrian.calc.*; 19 import mondrian.calc.impl.AbstractMemberCalc; 20 import mondrian.mdx.ResolvedFunCall; 21 22 29 class AncestorFunDef extends FunDefBase { 30 static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( 31 "Ancestor", 32 "Ancestor(<Member>, {<Level>|<Numeric Expression>})", 33 "Returns the ancestor of a member at a specified level.", 34 new String [] {"fmml", "fmmn"}, 35 AncestorFunDef.class); 36 37 public AncestorFunDef(FunDef dummyFunDef) { 38 super(dummyFunDef); 39 } 40 41 public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { 42 final MemberCalc memberCalc = 43 compiler.compileMember(call.getArg(0)); 44 final Type type1 = call.getArg(1).getType(); 45 if (type1 instanceof LevelType) { 46 final LevelCalc levelCalc = 47 compiler.compileLevel(call.getArg(1)); 48 return new AbstractMemberCalc(call, new Calc[] {memberCalc, levelCalc}) { 49 public Member evaluateMember(Evaluator evaluator) { 50 Level level = levelCalc.evaluateLevel(evaluator); 51 Member member = memberCalc.evaluateMember(evaluator); 52 int distance = member.getLevel().getDepth() - level.getDepth(); 53 return ancestor(evaluator, member, distance, level); 54 } 55 }; 56 } else { 57 final IntegerCalc distanceCalc = 58 compiler.compileInteger(call.getArg(1)); 59 return new AbstractMemberCalc(call, new Calc[] {memberCalc, distanceCalc}) { 60 public Member evaluateMember(Evaluator evaluator) { 61 int distance = distanceCalc.evaluateInteger(evaluator); 62 Member member = memberCalc.evaluateMember(evaluator); 63 return ancestor(evaluator, member, distance, null); 64 } 65 }; 66 } 67 } 68 } 69 70 | Popular Tags |