1 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 ; 28 import java.util.List ; 29 30 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 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 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 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 | Popular Tags |