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.AbstractStringCalc; 16 import mondrian.mdx.ResolvedFunCall; 17 import mondrian.olap.Evaluator; 18 import mondrian.olap.Member; 19 import mondrian.olap.Exp; 20 import mondrian.olap.type.SetType; 21 22 import java.util.List ; 23 24 31 class SetToStrFunDef extends FunDefBase { 32 public static final FunDefBase instance = new SetToStrFunDef(); 33 34 private SetToStrFunDef() { 35 super("SetToStr", "SetToStr(<Set>)", "Constructs a string from a set.", "fSx"); 36 } 37 38 public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { 39 Exp arg = call.getArg(0); 40 final ListCalc listCalc = compiler.compileList(arg); 41 if (((SetType) arg.getType()).getArity() == 1) { 42 return new AbstractStringCalc(call, new Calc[] {listCalc}) { 43 public String evaluateString(Evaluator evaluator) { 44 final List <Member> list = 45 (List <Member>) listCalc.evaluateList(evaluator); 46 return memberSetToStr(list); 47 } 48 }; 49 } else { 50 return new AbstractStringCalc(call, new Calc[] {listCalc}) { 51 public String evaluateString(Evaluator evaluator) { 52 final List <Member[]> list = 53 (List <Member[]>) listCalc.evaluateList(evaluator); 54 return tupleSetToStr(list); 55 } 56 }; 57 } 58 } 59 60 static String memberSetToStr(List <Member> list) { 61 StringBuilder buf = new StringBuilder (); 62 buf.append("{"); 63 int k = 0; 64 for (Member member : list) { 65 if (k++ > 0) { 66 buf.append(", "); 67 } 68 buf.append(member.getUniqueName()); 69 } 70 buf.append("}"); 71 return buf.toString(); 72 } 73 74 static String tupleSetToStr(List <Member[]> list) { 75 StringBuilder buf = new StringBuilder (); 76 buf.append("{"); 77 int k = 0; 78 for (Member[] members : list) { 79 if (k++ > 0) { 80 buf.append(", "); 81 } 82 appendTuple(buf, members); 83 } 84 buf.append("}"); 85 return buf.toString(); 86 } 87 } 88 89 | Popular Tags |