KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > mondrian > olap > fun > LeadLagFunDef


1 /*
2 // $Id: //open/mondrian/src/main/mondrian/olap/fun/LeadLagFunDef.java#1 $
3 // This software is subject to the terms of the Common Public License
4 // Agreement, available at the following URL:
5 // http://www.opensource.org/licenses/cpl.html.
6 // Copyright (C) 2006-2006 Julian Hyde
7 // All Rights Reserved.
8 // You must accept the terms of that agreement to use this software.
9 */

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 /**
23  * Definition of the <code>Lead</code> and <code>Lag</code> MDX functions.
24  *
25  * @author jhyde
26  * @version $Id: //open/mondrian/src/main/mondrian/olap/fun/LeadLagFunDef.java#1 $
27  * @since Mar 23, 2006
28  */

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 JavaDoc[]{"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 JavaDoc[]{"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 // End LagFunDef.java
68
Popular Tags