KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > mondrian > olap > fun > extra > CalculatedChildFunDef


1 /*
2 // $Id: //open/mondrian/src/main/mondrian/olap/fun/extra/CalculatedChildFunDef.java#3 $
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.extra;
11
12 import mondrian.olap.*;
13 import mondrian.olap.fun.FunDefBase;
14 import mondrian.calc.*;
15 import mondrian.calc.impl.AbstractMemberCalc;
16 import mondrian.mdx.ResolvedFunCall;
17
18 import java.util.List JavaDoc;
19
20 /**
21  * Definition of the
22  * <code>&lt;Member&gt;.CalculatedChild(&lt;String&gt;)</code> MDX
23  * function.
24  *
25  * @author bchow
26  * @version $Id: //open/mondrian/src/main/mondrian/olap/fun/extra/CalculatedChildFunDef.java#3 $
27  * @since 2006/4/12
28  */

29 public class CalculatedChildFunDef extends FunDefBase {
30     public static final CalculatedChildFunDef instance = new CalculatedChildFunDef();
31
32     CalculatedChildFunDef() {
33         super("CalculatedChild", "<Member>.CalculatedChild(<String>)",
34                 "Returns an existing calculated child member with name <String> from the specified <Member>.", "mmmS");
35     }
36
37     public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
38         final MemberCalc memberCalc = compiler.compileMember(call.getArg(0));
39         final StringCalc stringCalc = compiler.compileString(call.getArg(1));
40
41         return new AbstractMemberCalc(call, new Calc[] {memberCalc, stringCalc}) {
42             public Member evaluateMember(Evaluator evaluator) {
43                 Member member = memberCalc.evaluateMember(evaluator);
44                 String JavaDoc name = stringCalc.evaluateString(evaluator);
45                 return getCalculatedChild(member, name, evaluator);
46             }
47          };
48     }
49
50     private Member getCalculatedChild(
51             Member parent, String JavaDoc childName, Evaluator evaluator) {
52
53         final SchemaReader schemaReader =
54                 evaluator.getQuery().getSchemaReader(true);
55         Level childLevel = parent.getLevel().getChildLevel();
56         if (childLevel == null) {
57             return parent.getHierarchy().getNullMember();
58         }
59         List JavaDoc<Member> calcMemberList =
60             schemaReader.getCalculatedMembers(childLevel);
61
62         for (Member child : calcMemberList) {
63             // the parent check is required in case there are parallel children
64
// with the same names
65
if (child.getParentMember() == parent &&
66                 child.getName().equals(childName)) {
67                 return child;
68             }
69         }
70
71         return parent.getHierarchy().getNullMember();
72     }
73 }
74
75
76 // End CalculatedChildFunDef.java
77
Popular Tags