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