1 10 package mondrian.olap.fun; 11 12 import mondrian.calc.Calc; 13 import mondrian.calc.ExpCompiler; 14 import mondrian.calc.ListCalc; 15 import mondrian.calc.impl.AbstractListCalc; 16 import mondrian.mdx.ResolvedFunCall; 17 import mondrian.olap.*; 18 import mondrian.olap.type.SetType; 19 import mondrian.olap.type.MemberType; 20 import mondrian.olap.type.Type; 21 22 import java.util.*; 23 24 34 class AddCalculatedMembersFunDef extends FunDefBase { 35 private static final AddCalculatedMembersFunDef instance = 36 new AddCalculatedMembersFunDef(); 37 38 public static final Resolver resolver = new ResolverImpl(); 39 private static final String FLAG = "fxx"; 40 41 private AddCalculatedMembersFunDef() { 42 super( 43 "AddCalculatedMembers", 44 "AddCalculatedMembers(<Set>)", 45 "Adds calculated members to a set.", 46 FLAG); 47 } 48 49 public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { 50 final ListCalc listCalc = compiler.compileList(call.getArg(0)); 51 return new AbstractListCalc(call, new Calc[] {listCalc}) { 52 public List evaluateList(Evaluator evaluator) { 53 final List<Member> list = listCalc.evaluateList(evaluator); 54 return addCalculatedMembers(list, evaluator); 55 } 56 }; 57 } 58 59 private List<Member> addCalculatedMembers( 60 List<Member> memberList, 61 Evaluator evaluator) 62 { 63 Map<Level, Object > levelMap = new HashMap<Level, Object >(); 65 Dimension dim = null; 66 67 for (Member member : memberList) { 68 if (dim == null) { 69 dim = member.getDimension(); 70 } else if (dim != member.getDimension()) { 71 throw newEvalException(this, 72 "Only members from the same dimension are allowed in the AddCalculatedMembers set: " 73 + dim.toString() + " vs " + 74 member.getDimension().toString()); 75 } 76 if (!levelMap.containsKey(member.getLevel())) { 77 levelMap.put(member.getLevel(), null); 78 } 79 } 80 81 List<Member> workingList = new ArrayList<Member>(memberList); 84 final SchemaReader schemaReader = 85 evaluator.getQuery().getSchemaReader(true); 86 for (Level level : levelMap.keySet()) { 87 List<Member> calcMemberList = 88 schemaReader.getCalculatedMembers(level); 89 workingList.addAll(calcMemberList); 90 } 91 memberList = workingList; 92 return memberList; 93 } 94 95 private static class ResolverImpl extends MultiResolver { 96 public ResolverImpl() { 97 super( 98 instance.getName(), 99 instance.getSignature(), 100 instance.getDescription(), 101 new String [] {FLAG}); 102 } 103 104 protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) { 105 if (args.length == 1) { 106 Exp arg = args[0]; 107 final Type type1 = arg.getType(); 108 if (type1 instanceof SetType) { 109 SetType type = (SetType) type1; 110 if (type.getElementType() instanceof MemberType) { 111 return instance; 112 } else { 113 throw newEvalException( 114 instance, 115 "Only single dimension members allowed in set for AddCalculatedMembers"); 116 } 117 } 118 } 119 return null; 120 } 121 } 122 } 123 124 | Popular Tags |