KickJava   Java API By Example, From Geeks To Geeks.

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


1 /*
2 // $Id: //open/mondrian/src/main/mondrian/olap/fun/PeriodsToDateFunDef.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.olap.*;
13 import mondrian.olap.type.Type;
14 import mondrian.olap.type.SetType;
15 import mondrian.olap.type.MemberType;
16 import mondrian.resource.MondrianResource;
17 import mondrian.calc.Calc;
18 import mondrian.calc.ExpCompiler;
19 import mondrian.calc.LevelCalc;
20 import mondrian.calc.MemberCalc;
21 import mondrian.calc.impl.AbstractListCalc;
22 import mondrian.mdx.ResolvedFunCall;
23
24 import java.util.List JavaDoc;
25
26 /**
27  * Definition of the <code>PeriodsToDate</code> MDX function.
28  *
29  * @author jhyde
30  * @version $Id: //open/mondrian/src/main/mondrian/olap/fun/PeriodsToDateFunDef.java#2 $
31  * @since Mar 23, 2006
32  */

33 class PeriodsToDateFunDef extends FunDefBase {
34     static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver(
35             "PeriodsToDate",
36             "PeriodsToDate([<Level>[, <Member>]])",
37             "Returns a set of periods (members) from a specified level starting with the first period and ending with a specified member.",
38             new String JavaDoc[]{"fx", "fxl", "fxlm"},
39             PeriodsToDateFunDef.class);
40
41     public PeriodsToDateFunDef(FunDef dummyFunDef) {
42         super(dummyFunDef);
43     }
44
45     public Type getResultType(Validator validator, Exp[] args) {
46         if (args.length == 0) {
47             // With no args, the default implementation cannot
48
// guess the hierarchy.
49
Hierarchy hierarchy = validator.getQuery()
50                     .getCube().getTimeDimension()
51                     .getHierarchy();
52             return new SetType(
53                     MemberType.forHierarchy(hierarchy));
54         }
55         final Type type = args[0].getType();
56         if (type.getDimension() == null ||
57             type.getDimension().getDimensionType() !=
58                 mondrian.olap.DimensionType.TimeDimension) {
59             throw MondrianResource.instance().TimeArgNeeded.ex(getName());
60         }
61         return super.getResultType(validator, args);
62     }
63
64     public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
65         final LevelCalc levelCalc =
66                 call.getArgCount() > 0 ?
67                 compiler.compileLevel(call.getArg(0)) :
68                 null;
69         final MemberCalc memberCalc =
70                 call.getArgCount() > 1 ?
71                 compiler.compileMember(call.getArg(1)) :
72                 null;
73         final Dimension timeDimension = compiler
74                 .getEvaluator().getCube().getTimeDimension();
75         return new AbstractListCalc(call, new Calc[] {levelCalc, memberCalc}) {
76             public List JavaDoc evaluateList(Evaluator evaluator) {
77                 final Member member;
78                 final Level level;
79                 if (levelCalc == null) {
80                     member = evaluator.getContext(timeDimension);
81                     level = member.getLevel().getParentLevel();
82                 } else {
83                     level = levelCalc.evaluateLevel(evaluator);
84                     if (memberCalc == null) {
85                         member = evaluator.getContext(
86                                 level.getHierarchy().getDimension());
87                     } else {
88                         member = memberCalc.evaluateMember(evaluator);
89                     }
90                 }
91                 return periodsToDate(evaluator, level, member);
92             }
93
94             public boolean dependsOn(Dimension dimension) {
95                 if (super.dependsOn(dimension)) {
96                     return true;
97                 }
98                 if (memberCalc != null) {
99                     return false;
100                 } else if (levelCalc != null) {
101                     return levelCalc.getType().usesDimension(dimension, true) ;
102                 } else {
103                     return dimension == timeDimension;
104                 }
105             }
106         };
107     }
108 }
109
110 // End PeriodsToDateFunDef.java
111
Popular Tags