1 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 ; 25 26 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 []{"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 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 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 | Popular Tags |