1 10 package mondrian.olap.fun; 11 12 import mondrian.olap.type.Type; 13 import mondrian.olap.type.MemberType; 14 import mondrian.olap.type.TupleType; 15 import mondrian.olap.Validator; 16 import mondrian.olap.Exp; 17 import mondrian.olap.Member; 18 import mondrian.olap.Evaluator; 19 import mondrian.calc.*; 20 import mondrian.calc.impl.AbstractMemberCalc; 21 import mondrian.mdx.ResolvedFunCall; 22 23 30 class TupleItemFunDef extends FunDefBase { 31 static final TupleItemFunDef instance = new TupleItemFunDef(); 32 33 private TupleItemFunDef() { 34 super( 35 "Item", 36 "<Tuple>.Item(<Index>)", 37 "Returns a member from the tuple specified in <Tuple>. The member to be returned is specified by the zero-based position of the member in the set in <Index>.", 38 "mmtn"); 39 } 40 41 public Type getResultType(Validator validator, Exp[] args) { 42 return MemberType.Unknown; 48 } 49 50 public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { 51 final Type type = call.getArg(0).getType(); 52 if (type instanceof MemberType) { 53 final MemberCalc memberCalc = 54 compiler.compileMember(call.getArg(0)); 55 final IntegerCalc indexCalc = 56 compiler.compileInteger(call.getArg(1)); 57 return new AbstractMemberCalc(call, new Calc[] {memberCalc, indexCalc}) { 58 public Member evaluateMember(Evaluator evaluator) { 59 final Member member = 60 memberCalc.evaluateMember(evaluator); 61 final int index = 62 indexCalc.evaluateInteger(evaluator); 63 if (index != 0) { 64 return null; 65 } 66 return member; 67 } 68 }; 69 } else { 70 final TupleCalc tupleCalc = 71 compiler.compileTuple(call.getArg(0)); 72 final IntegerCalc indexCalc = 73 compiler.compileInteger(call.getArg(1)); 74 return new AbstractMemberCalc(call, new Calc[] {tupleCalc, indexCalc}) { 75 final Member[] nullTupleMembers = 76 makeNullTuple((TupleType) tupleCalc.getType()); 77 public Member evaluateMember(Evaluator evaluator) { 78 final Member[] members = 79 tupleCalc.evaluateTuple(evaluator); 80 assert members == null || 81 members.length == nullTupleMembers.length; 82 final int index = indexCalc.evaluateInteger(evaluator); 83 if (members == null) { 84 return nullTupleMembers[index]; 85 } 86 if (index >= members.length || index < 0) { 87 return null; 88 } 89 return members[index]; 90 } 91 }; 92 } 93 } 94 } 95 96 | Popular Tags |