001/* 002// This software is subject to the terms of the Eclipse Public License v1.0 003// Agreement, available at the following URL: 004// http://www.eclipse.org/legal/epl-v10.html. 005// You must accept the terms of that agreement to use this software. 006// 007// Copyright (C) 2006-2011 Pentaho 008// All Rights Reserved. 009*/ 010package mondrian.olap.fun; 011 012import mondrian.calc.*; 013import mondrian.calc.impl.AbstractStringCalc; 014import mondrian.mdx.ResolvedFunCall; 015import mondrian.olap.*; 016 017import java.util.List; 018 019/** 020 * Definition of the <code>SetToStr</code> MDX function. 021 * 022 * @author jhyde 023 * @since Aug 3, 2006 024 */ 025class SetToStrFunDef extends FunDefBase { 026 public static final FunDefBase instance = new SetToStrFunDef(); 027 028 private SetToStrFunDef() { 029 super("SetToStr", "Constructs a string from a set.", "fSx"); 030 } 031 032 public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) { 033 Exp arg = call.getArg(0); 034 final ListCalc listCalc = compiler.compileList(arg); 035 return new AbstractStringCalc(call, new Calc[]{listCalc}) { 036 public String evaluateString(Evaluator evaluator) { 037 final TupleList list = listCalc.evaluateList(evaluator); 038 if (list.getArity() == 1) { 039 return memberSetToStr(list.slice(0)); 040 } else { 041 return tupleSetToStr(list); 042 } 043 } 044 }; 045 } 046 047 static String memberSetToStr(List<Member> list) { 048 StringBuilder buf = new StringBuilder(); 049 buf.append("{"); 050 int k = 0; 051 for (Member member : list) { 052 if (k++ > 0) { 053 buf.append(", "); 054 } 055 buf.append(member.getUniqueName()); 056 } 057 buf.append("}"); 058 return buf.toString(); 059 } 060 061 static String tupleSetToStr(TupleList list) { 062 StringBuilder buf = new StringBuilder(); 063 buf.append("{"); 064 int k = 0; 065 Member[] members = new Member[list.getArity()]; 066 final TupleCursor cursor = list.tupleCursor(); 067 while (cursor.forward()) { 068 if (k++ > 0) { 069 buf.append(", "); 070 } 071 cursor.currentToArray(members, 0); 072 appendTuple(buf, members); 073 } 074 buf.append("}"); 075 return buf.toString(); 076 } 077} 078 079// End SetToStrFunDef.java