<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>I'm having some trouble with a UDF returning a List that worked under 2.4, but fails with a parse error under 3.1.1. &nbsp;I'm not sure whether the problem is a flaw in the UDF or in how the newer version of Mondrian is attempting to use it. &nbsp;</div><div><br></div><div>Here's the function, which simply reverses the order of a set:</div><div><div><br></div><div><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">&nbsp;&nbsp;public class ReverseFunction implements UserDefinedFunction {</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">public Object execute(Evaluator eval, Argument[] args) {</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">                </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">List memberList = (List) args[0].evaluate(eval);</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">                </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">Collections.reverse(memberList);</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">                </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">return memberList;</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">}</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">public String getDescription() {</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">                </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">return "Reverses the order of a set";</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">}</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">public String getName() {</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">                </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">return "Reverse";</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">}</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">public Type[] getParameterTypes() {</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">                </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">return new Type[] {new SetType(MemberType.Unknown)};</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">}</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">public String[] getReservedWords() {</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">                </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">return null;</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">}</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">public Type getReturnType(Type[] arg0) {</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">                </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">return arg0[0];</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">}</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">public Syntax getSyntax() {</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">                </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">return Syntax.Function;</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">}</span></font></div><div><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">&nbsp;&nbsp;}</span></font></div><div><br></div><div><div>The stack trace for the underlying cause of the error is here:</div><div><br></div><div><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">Caused by: mondrian.olap.MondrianException: Mondrian Error:Internal error: Cannot convert calc to list: mondrian.olap.fun.UdfResolver$CalcImpl@315d04</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.resource.MondrianResource$_Def0.ex(MondrianResource.java:803)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.olap.Util.newInternal(Util.java:1465)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.calc.impl.AbstractExpCompiler.compileList(AbstractExpCompiler.java:286)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.calc.impl.BetterExpCompiler.compileList(BetterExpCompiler.java:77)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.calc.impl.AbstractExpCompiler.compileList(AbstractExpCompiler.java:260)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.olap.fun.SetFunDef$MemberSetListCalc.createCalc(SetFunDef.java:147)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.olap.fun.SetFunDef$MemberSetListCalc.compileSelf(SetFunDef.java:134)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.olap.fun.SetFunDef$MemberSetListCalc.&lt;init&gt;(SetFunDef.java:120)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.olap.fun.SetFunDef.compileCall(SetFunDef.java:89)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.mdx.ResolvedFunCall.accept(ResolvedFunCall.java:152)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.calc.impl.AbstractExpCompiler.compile(AbstractExpCompiler.java:79)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.calc.impl.AbstractExpCompiler.compileAs(AbstractExpCompiler.java:124)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.calc.impl.AbstractExpCompiler.compileIter(AbstractExpCompiler.java:311)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.olap.QueryAxis.compile(QueryAxis.java:122)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.olap.Query.compile(Query.java:519)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.olap.Query.resolve(Query.java:456)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.olap.Query.&lt;init&gt;(Query.java:231)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.olap.Query.&lt;init&gt;(Query.java:187)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.olap.Parser.makeQuery(Parser.java:870)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.olap.CUP$Parser$actions.CUP$Parser$do_action(Parser.java:1764)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.olap.Parser.do_action(Parser.java:699)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at java_cup.runtime.lr_parser.parse(lr_parser.java:569)</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">        </span></font></span><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 11px;">at mondrian.olap.Parser.parseInternal(Parser.java:772)</span></font></div><div><br></div><div>The immediate problem is in AbstractExpCompiler.compileList(). &nbsp;It compiles the expression "Reverse([Requested Dates])", gets a mondrian.olap.fun.UdfResolver$CalcImpl instance as a result, then complains because said calc is neither null, a ListCalc, or an IterCalc.</div><div><br></div><div>UDF documentation seems a little thin, and I've been unable to find an example of a UDF returning a list in either mondrian/udf or in UdfTest to use as a reference point.&nbsp;&nbsp;Searching the archive, I do see that Pappyn Bart asked a somewhat similar question back in 2007, but I didn't see a clear resolution.</div><div><br></div><div>Can anyone help me sort this problem out, or failing that at least point me to an example of a UDF that does successfully return a list that I can compare against?</div><div><br></div><div>&nbsp;-- Eric</div><div><br></div><div><br></div></div></div></body></html>