You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Arun Mahadevan (JIRA)" <ji...@apache.org> on 2016/10/13 11:07:20 UTC
[jira] [Commented] (CALCITE-1434) AggregateFunctionImpl doesnt work
if the class implements a generic interface
[ https://issues.apache.org/jira/browse/CALCITE-1434?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15571611#comment-15571611 ]
Arun Mahadevan commented on CALCITE-1434:
-----------------------------------------
Raised https://github.com/apache/calcite/pull/308 with potential fix.
> AggregateFunctionImpl doesnt work if the class implements a generic interface
> -----------------------------------------------------------------------------
>
> Key: CALCITE-1434
> URL: https://issues.apache.org/jira/browse/CALCITE-1434
> Project: Calcite
> Issue Type: Bug
> Reporter: Arun Mahadevan
> Assignee: Julian Hyde
>
> We have an interface like below which we want to expose to users for writing aggregate functions.
> {noformat}
> public interface UDAF<A, V, R> {
> A init();
> A add(A aggregate, V val);
> R result(A aggregate);
> }
> {noformat}
> Internally we create an instance of AggregateFunctionImpl and register the Function in SchemaPlus. However this doesn't work for example if we have an implementation like below,
> {noformat}
> public class MySum implements UDAF<Number, Number, Number> {
> @Override
> public Number init() {...}
> @Override
> public Number add(Number aggregate, Number val) {...}
> @Override
> public Number result(Number aggregate) {...}
> }
> {noformat}
> We get an Exception "java.lang.RuntimeException: In user-defined aggregate class 'x.y.z.$MySum', first parameter to 'add' method must be the accumulator (the return type of the 'init' method)"
> This happens because the ReflectiveFunctionBase.findMethod is trying to look for a method name "init" and it get a method with a different signature (that returns Object) instead of the actual method defined in MySum. This happens to be a 'bridge' method inserted by java.
> In findMethod, the bridge methods can be skipped while looking for the method by name.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)