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.calc.Calc; 16 import mondrian.calc.ExpCompiler; 17 import mondrian.calc.MemberCalc; 18 import mondrian.calc.IntegerCalc; 19 import mondrian.calc.impl.AbstractMemberCalc; 20 import mondrian.mdx.ResolvedFunCall; 21 22 29 class LeadLagFunDef extends FunDefBase { 30 static final ReflectiveMultiResolver LagResolver = new ReflectiveMultiResolver( 31 "Lag", 32 "<Member>.Lag(<Numeric Expression>)", 33 "Returns a member further along the specified member's dimension.", 34 new String []{"mmmn"}, 35 LeadLagFunDef.class); 36 37 static final ReflectiveMultiResolver LeadResolver = new ReflectiveMultiResolver( 38 "Lead", 39 "<Member>.Lead(<Numeric Expression>)", 40 "Returns a member further along the specified member's dimension.", 41 new String []{"mmmn"}, 42 LeadLagFunDef.class); 43 44 public LeadLagFunDef(FunDef dummyFunDef) { 45 super(dummyFunDef); 46 } 47 48 public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { 49 final MemberCalc memberCalc = 50 compiler.compileMember(call.getArg(0)); 51 final IntegerCalc integerCalc = 52 compiler.compileInteger(call.getArg(1)); 53 final boolean lag = call.getFunName().equals("Lag"); 54 return new AbstractMemberCalc(call, new Calc[] {memberCalc, integerCalc}) { 55 public Member evaluateMember(Evaluator evaluator) { 56 Member member = memberCalc.evaluateMember(evaluator); 57 int n = integerCalc.evaluateInteger(evaluator); 58 if (lag) { 59 n = -n; 60 } 61 return evaluator.getSchemaReader().getLeadMember(member, n); 62 } 63 }; 64 } 65 } 66 67 | Popular Tags |