KickJava   Java API By Example, From Geeks To Geeks.

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


1 /*
2 // $Id: //open/mondrian/src/main/mondrian/olap/fun/AddCalculatedMembersFunDef.java#2 $
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.calc.Calc;
13 import mondrian.calc.ExpCompiler;
14 import mondrian.calc.ListCalc;
15 import mondrian.calc.impl.AbstractListCalc;
16 import mondrian.mdx.ResolvedFunCall;
17 import mondrian.olap.*;
18 import mondrian.olap.type.SetType;
19 import mondrian.olap.type.MemberType;
20 import mondrian.olap.type.Type;
21
22 import java.util.*;
23
24 /**
25  * Definition of the <code>AddCalculatedMembers</code> MDX function.
26  *
27  * AddCalculatedMembers adds calculated members that are siblings
28  * of the members in the set. The set is limited to one dimension.
29  *
30  * @author jhyde
31  * @version $Id: //open/mondrian/src/main/mondrian/olap/fun/AddCalculatedMembersFunDef.java#2 $
32  * @since Mar 23, 2006
33  */

34 class AddCalculatedMembersFunDef extends FunDefBase {
35     private static final AddCalculatedMembersFunDef instance =
36         new AddCalculatedMembersFunDef();
37
38     public static final Resolver resolver = new ResolverImpl();
39     private static final String JavaDoc FLAG = "fxx";
40
41     private AddCalculatedMembersFunDef() {
42         super(
43             "AddCalculatedMembers",
44             "AddCalculatedMembers(<Set>)",
45             "Adds calculated members to a set.",
46             FLAG);
47     }
48
49     public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
50         final ListCalc listCalc = compiler.compileList(call.getArg(0));
51         return new AbstractListCalc(call, new Calc[] {listCalc}) {
52             public List evaluateList(Evaluator evaluator) {
53                 final List<Member> list = listCalc.evaluateList(evaluator);
54                 return addCalculatedMembers(list, evaluator);
55             }
56         };
57     }
58
59     private List<Member> addCalculatedMembers(
60         List<Member> memberList,
61         Evaluator evaluator)
62     {
63         // Determine unique levels in the set
64
Map<Level, Object JavaDoc> levelMap = new HashMap<Level, Object JavaDoc>();
65         Dimension dim = null;
66
67         for (Member member : memberList) {
68             if (dim == null) {
69                 dim = member.getDimension();
70             } else if (dim != member.getDimension()) {
71                 throw newEvalException(this,
72                     "Only members from the same dimension are allowed in the AddCalculatedMembers set: "
73                         + dim.toString() + " vs " +
74                         member.getDimension().toString());
75             }
76             if (!levelMap.containsKey(member.getLevel())) {
77                 levelMap.put(member.getLevel(), null);
78             }
79         }
80
81         // For each level, add the calculated members from both
82
// the schema and the query
83
List<Member> workingList = new ArrayList<Member>(memberList);
84         final SchemaReader schemaReader =
85                 evaluator.getQuery().getSchemaReader(true);
86         for (Level level : levelMap.keySet()) {
87             List<Member> calcMemberList =
88                 schemaReader.getCalculatedMembers(level);
89             workingList.addAll(calcMemberList);
90         }
91         memberList = workingList;
92         return memberList;
93     }
94
95     private static class ResolverImpl extends MultiResolver {
96         public ResolverImpl() {
97             super(
98                 instance.getName(),
99                 instance.getSignature(),
100                 instance.getDescription(),
101                 new String JavaDoc[] {FLAG});
102         }
103
104         protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) {
105             if (args.length == 1) {
106                 Exp arg = args[0];
107                 final Type type1 = arg.getType();
108                 if (type1 instanceof SetType) {
109                     SetType type = (SetType) type1;
110                     if (type.getElementType() instanceof MemberType) {
111                         return instance;
112                     } else {
113                         throw newEvalException(
114                             instance,
115                             "Only single dimension members allowed in set for AddCalculatedMembers");
116                     }
117                 }
118             }
119             return null;
120         }
121     }
122 }
123
124 // End AddCalculatedMembersFunDef.java
125
Popular Tags