KickJava   Java API By Example, From Geeks To Geeks.

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


1 /*
2 // $Id: //open/mondrian/src/main/mondrian/olap/fun/RangeFunDef.java#12 $
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) 2002-2002 Kana Software, Inc.
7 // Copyright (C) 2002-2006 Julian Hyde and others
8 // All Rights Reserved.
9 // You must accept the terms of that agreement to use this software.
10 //
11 // jhyde, 3 March, 2002
12 */

13 package mondrian.olap.fun;
14 import mondrian.calc.Calc;
15 import mondrian.calc.ExpCompiler;
16 import mondrian.calc.MemberCalc;
17 import mondrian.calc.impl.AbstractListCalc;
18 import mondrian.calc.impl.ConstantCalc;
19 import mondrian.mdx.ResolvedFunCall;
20 import mondrian.olap.Evaluator;
21 import mondrian.olap.Exp;
22 import mondrian.olap.Member;
23 import mondrian.olap.type.NullType;
24 import mondrian.resource.MondrianResource;
25 import mondrian.rolap.RolapMember;
26
27 import java.util.Collections JavaDoc;
28 import java.util.List JavaDoc;
29
30 /**
31  * Definition of the MDX <code>&lt;Member&gt : &lt;Member&gt;</code> operator,
32  * which returns the set of members between a given pair of members.
33  *
34  * @author jhyde
35  * @since 3 March, 2002
36  * @version $Id: //open/mondrian/src/main/mondrian/olap/fun/RangeFunDef.java#12 $
37  */

38 class RangeFunDef extends FunDefBase {
39     static final RangeFunDef instance = new RangeFunDef();
40
41     private RangeFunDef() {
42         super(":", "<Member> : <Member>",
43                 "Infix colon operator returns the set of members between a given pair of members.",
44                 "ixmm");
45     }
46
47     
48     /**
49      * return two membercalc objects, substituting null's with the hierarchy
50      * null member of the other expression.
51      *
52      * @param exp0 first expression
53      * @param exp1 second expression
54      *
55      * @return two member calcs
56      */

57     private MemberCalc[] compileMembers(Exp exp0, Exp exp1, ExpCompiler compiler) {
58         MemberCalc[] members = new MemberCalc[2];
59         
60         if (exp0.getType() instanceof NullType) {
61             members[0] = null;
62         } else {
63             members[0] = compiler.compileMember(exp0);
64         }
65         
66         if (exp1.getType() instanceof NullType) {
67             members[1] = null;
68         } else {
69             members[1] = compiler.compileMember(exp1);
70         }
71         
72         // replace any null types with hierachy null member
73
// if both objects are null, throw exception
74

75         if (members[0]== null && members[1] == null) {
76             throw MondrianResource.instance().TwoNullsNotSupported.ex();
77         } else if (members[0] == null) {
78             Member nullMember = ((RolapMember)members[1].evaluate(null)).getHierarchy().getNullMember();
79             members[0] = (MemberCalc)ConstantCalc.constantMember(nullMember);
80         } else if (members[1] == null) {
81             Member nullMember = ((RolapMember)members[0].evaluate(null)).getHierarchy().getNullMember();
82             members[1] = (MemberCalc)ConstantCalc.constantMember(nullMember);
83         }
84         
85         return members;
86     }
87     
88     public Calc compileCall(final ResolvedFunCall call, ExpCompiler compiler) {
89         final MemberCalc[] memberCalcs = compileMembers(call.getArg(0), call.getArg(1), compiler);
90         return new AbstractListCalc(call, new Calc[] {memberCalcs[0], memberCalcs[1]}) {
91             public List JavaDoc evaluateList(Evaluator evaluator) {
92                 final Member member0 = memberCalcs[0].evaluateMember(evaluator);
93                 final Member member1 = memberCalcs[1].evaluateMember(evaluator);
94                 if (member0.isNull() || member1.isNull()) {
95                     return Collections.EMPTY_LIST;
96                 }
97                 if (member0.getLevel() != member1.getLevel()) {
98                     throw evaluator.newEvalException(
99                             call.getFunDef(),
100                             "Members must belong to the same level");
101                 }
102                 return FunUtil.memberRange(evaluator, member0, member1);
103             }
104         };
105     }
106 }
107
108 // End RangeFunDef.java
109
Popular Tags