Uploaded image for project: 'Calcite'
  1. Calcite
  2. CALCITE-1434

User-defined aggregate function that uses a generic interface

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 1.11.0
    • Component/s: None
    • Labels:
      None

      Description

      AggregateFunctionImpl doesn't work if the class implements a generic interface. We have an interface like below which we want to expose to users for writing aggregate functions.

      public interface UDAF<A, V, R> {
          A init();
          A add(A aggregate, V val);
          R result(A aggregate);
      }
      

      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,

      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) {...}
      }
      

      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.

        Attachments

          Activity

            People

            • Assignee:
              julianhyde Julian Hyde
              Reporter:
              arunmahadevan Arun Mahadevan
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: