KickJava   Java API By Example, From Geeks To Geeks.

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


1 /*
2 // $Id: //open/mondrian/src/main/mondrian/olap/fun/TupleItemFunDef.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.type.Type;
13 import mondrian.olap.type.MemberType;
14 import mondrian.olap.type.TupleType;
15 import mondrian.olap.Validator;
16 import mondrian.olap.Exp;
17 import mondrian.olap.Member;
18 import mondrian.olap.Evaluator;
19 import mondrian.calc.*;
20 import mondrian.calc.impl.AbstractMemberCalc;
21 import mondrian.mdx.ResolvedFunCall;
22
23 /**
24  * Definition of the <code>&lt;Tuple&gt;.Item(&lt;Index&gt;)</code> MDX function.
25  *
26  * @author jhyde
27  * @version $Id: //open/mondrian/src/main/mondrian/olap/fun/TupleItemFunDef.java#1 $
28  * @since Mar 23, 2006
29  */

30 class TupleItemFunDef extends FunDefBase {
31     static final TupleItemFunDef instance = new TupleItemFunDef();
32
33     private TupleItemFunDef() {
34         super(
35                 "Item",
36                 "<Tuple>.Item(<Index>)",
37                 "Returns a member from the tuple specified in <Tuple>. The member to be returned is specified by the zero-based position of the member in the set in <Index>.",
38                 "mmtn");
39     }
40
41     public Type getResultType(Validator validator, Exp[] args) {
42         // Suppose we are called as follows:
43
// ([Gender].CurrentMember, [Store].CurrentMember).Item(n)
44
//
45
// We know that our result is a member type, but we don't
46
// know which dimension.
47
return MemberType.Unknown;
48     }
49
50     public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
51         final Type type = call.getArg(0).getType();
52         if (type instanceof MemberType) {
53             final MemberCalc memberCalc =
54                     compiler.compileMember(call.getArg(0));
55             final IntegerCalc indexCalc =
56                     compiler.compileInteger(call.getArg(1));
57             return new AbstractMemberCalc(call, new Calc[] {memberCalc, indexCalc}) {
58                 public Member evaluateMember(Evaluator evaluator) {
59                     final Member member =
60                             memberCalc.evaluateMember(evaluator);
61                     final int index =
62                             indexCalc.evaluateInteger(evaluator);
63                     if (index != 0) {
64                         return null;
65                     }
66                     return member;
67                 }
68             };
69         } else {
70             final TupleCalc tupleCalc =
71                     compiler.compileTuple(call.getArg(0));
72             final IntegerCalc indexCalc =
73                     compiler.compileInteger(call.getArg(1));
74             return new AbstractMemberCalc(call, new Calc[] {tupleCalc, indexCalc}) {
75                 final Member[] nullTupleMembers =
76                         makeNullTuple((TupleType) tupleCalc.getType());
77                 public Member evaluateMember(Evaluator evaluator) {
78                     final Member[] members =
79                             tupleCalc.evaluateTuple(evaluator);
80                     assert members == null ||
81                             members.length == nullTupleMembers.length;
82                     final int index = indexCalc.evaluateInteger(evaluator);
83                     if (members == null) {
84                         return nullTupleMembers[index];
85                     }
86                     if (index >= members.length || index < 0) {
87                         return null;
88                     }
89                     return members[index];
90                 }
91             };
92         }
93     }
94 }
95
96 // End TupleItemFunDef.java
97
Popular Tags