KickJava   Java API By Example, From Geeks To Geeks.

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


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

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