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.*; 18 import mondrian.calc.impl.AbstractListCalc; 19 import mondrian.mdx.ResolvedFunCall; 20 21 import java.util.List ; 22 23 31 class XtdFunDef extends FunDefBase { 32 private final LevelType levelType; 33 34 static final ResolverImpl MtdResolver = new ResolverImpl( 35 "Mtd", 36 "Mtd([<Member>])", 37 "A shortcut function for the PeriodsToDate function that specifies the level to be Month.", 38 new String []{"fx", "fxm"}, 39 LevelType.TimeMonths); 40 41 static final ResolverImpl QtdResolver = new ResolverImpl( 42 "Qtd", 43 "Qtd([<Member>])", 44 "A shortcut function for the PeriodsToDate function that specifies the level to be Quarter.", 45 new String []{"fx", "fxm"}, 46 LevelType.TimeQuarters); 47 48 static final ResolverImpl WtdResolver = new ResolverImpl( 49 "Wtd", 50 "Wtd([<Member>])", 51 "A shortcut function for the PeriodsToDate function that specifies the level to be Week.", 52 new String []{"fx", "fxm"}, 53 LevelType.TimeWeeks); 54 55 static final ResolverImpl YtdResolver = new ResolverImpl( 56 "Ytd", 57 "Ytd([<Member>])", 58 "A shortcut function for the PeriodsToDate function that specifies the level to be Year.", 59 new String []{"fx", "fxm"}, 60 LevelType.TimeYears); 61 62 public XtdFunDef(FunDef dummyFunDef, LevelType levelType) { 63 super(dummyFunDef); 64 this.levelType = levelType; 65 } 66 67 public Type getResultType(Validator validator, Exp[] args) { 68 if (args.length == 0) { 69 Hierarchy hierarchy = validator.getQuery() 72 .getCube().getTimeDimension() 73 .getHierarchy(); 74 return new SetType(MemberType.forHierarchy(hierarchy)); 75 } 76 final Type type = args[0].getType(); 77 if (type.getHierarchy().getDimension() 78 .getDimensionType() != 79 DimensionType.TimeDimension) { 80 throw MondrianResource.instance().TimeArgNeeded.ex(getName()); 81 } 82 return super.getResultType(validator, args); 83 } 84 85 private Level getLevel(Evaluator evaluator) { 86 switch (levelType) { 87 case TimeYears: 88 return evaluator.getCube().getYearLevel(); 89 case TimeQuarters: 90 return evaluator.getCube().getQuarterLevel(); 91 case TimeMonths: 92 return evaluator.getCube().getMonthLevel(); 93 case TimeWeeks: 94 return evaluator.getCube().getWeekLevel(); 95 case TimeDays: 96 return evaluator.getCube().getWeekLevel(); 97 default: 98 throw Util.badValue(levelType); 99 } 100 } 101 102 public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { 103 final Level level = getLevel(compiler.getEvaluator()); 104 switch (call.getArgCount()) { 105 case 0: 106 return new AbstractListCalc(call, new Calc[0]) { 107 public List evaluateList(Evaluator evaluator) { 108 return periodsToDate(evaluator, level, null); 109 } 110 111 public boolean dependsOn(Dimension dimension) { 112 return dimension.getDimensionType() == 113 mondrian.olap.DimensionType.TimeDimension; 114 } 115 }; 116 default: 117 final MemberCalc memberCalc = 118 compiler.compileMember(call.getArg(0)); 119 return new AbstractListCalc(call, new Calc[] {memberCalc}) { 120 public List evaluateList(Evaluator evaluator) { 121 return periodsToDate(evaluator, level, 122 memberCalc.evaluateMember(evaluator)); 123 } 124 }; 125 } 126 } 127 128 private static class ResolverImpl extends MultiResolver { 129 private final LevelType levelType; 130 131 public ResolverImpl( 132 String name, 133 String signature, 134 String description, 135 String [] signatures, 136 LevelType levelType) { 137 super(name, signature, description, signatures); 138 this.levelType = levelType; 139 } 140 141 protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { 142 return new XtdFunDef(dummyFunDef, levelType); 143 } 144 }; 145 } 146 147 | Popular Tags |