1 10 package mondrian.olap.fun; 11 12 import mondrian.olap.*; 13 import mondrian.calc.*; 14 import mondrian.calc.impl.AbstractListCalc; 15 import mondrian.mdx.ResolvedFunCall; 16 17 import java.util.HashSet ; 18 import java.util.Set ; 19 import java.util.List ; 20 import java.util.ArrayList ; 21 22 29 class DrilldownMemberFunDef extends FunDefBase { 30 static final String [] reservedWords = new String [] {"RECURSIVE"}; 31 static final ReflectiveMultiResolver Resolver = new ReflectiveMultiResolver( 32 "DrilldownMember", 33 "DrilldownMember(<Set1>, <Set2>[, RECURSIVE])", 34 "Drills down the members in a set that are present in a second specified set.", 35 new String []{"fxxx", "fxxxy"}, 36 DrilldownMemberFunDef.class, 37 reservedWords); 38 39 public DrilldownMemberFunDef(FunDef funDef) { 40 super(funDef); 41 } 42 43 public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { 44 final ListCalc listCalc1 = compiler.compileList(call.getArg(0)); 45 final ListCalc listCalc2 = compiler.compileList(call.getArg(1)); 46 final String literalArg = getLiteralArg(call, 2, "", reservedWords); 47 final boolean recursive = literalArg.equals("RECURSIVE"); 48 49 return new AbstractListCalc(call, new Calc[] {listCalc1, listCalc2}) { 50 public List evaluateList(Evaluator evaluator) { 51 final List list1 = listCalc1.evaluateList(evaluator); 52 final List list2 = listCalc2.evaluateList(evaluator); 53 return drilldownMember(list1, list2, evaluator); 54 } 55 56 68 protected void drillDownObj( 69 Evaluator evaluator, 70 Object element, 71 Set memberSet, 72 List resultList) { 73 if (null == element) { 74 return; 75 } 76 77 Member m = null; 78 int k = -1; 79 if (element instanceof Member) { 80 if (!memberSet.contains(element)) { 81 return; 82 } 83 m = (Member) element; 84 } else { 85 Util.assertTrue(element instanceof Member[]); 86 Member[] members = (Member[]) element; 87 for (int j = 0; j < members.length; j++) { 88 Member member = members[j]; 89 if (memberSet.contains(member)) { 90 k = j; 91 m = member; 92 break; 93 } 94 } 95 if (k == -1) { 96 return; 97 } 98 } 99 100 Member[] children = evaluator.getSchemaReader().getMemberChildren(m); 101 for (int j = 0; j < children.length; j++) { 102 Object objNew; 103 if (k < 0) { 104 objNew = children[j]; 105 } else { 106 Member[] members = (Member[]) ((Member[]) element).clone(); 107 members[k] = children[j]; 108 objNew = members; 109 } 110 111 resultList.add(objNew); 112 if (recursive) { 113 drillDownObj(evaluator, objNew, memberSet, resultList); 114 } 115 } 116 } 117 118 private List drilldownMember(List v0, List v1, Evaluator evaluator) { 119 if (null == v0 || 120 v0.isEmpty() || 121 null == v1 || 122 v1.isEmpty()) { 123 return v0; 124 } 125 126 Set set1 = new HashSet (); 127 set1.addAll(v1); 128 129 List result = new ArrayList (); 130 int i = 0, n = v0.size(); 131 while (i < n) { 132 Object o = v0.get(i++); 133 result.add(o); 134 drillDownObj(evaluator, o, set1, result); 135 } 136 return result; 137 } 138 }; 139 } 140 } 141 142 | Popular Tags |