It is somewhat similar to https://issues.apache.org/jira/browse/CALCITE-680 
<https://issues.apache.org/jira/browse/CALCITE-680> but I think you should log 
a new JIRA case.

> On May 21, 2016, at 10:24 PM, lidong <[email protected]> wrote:
> 
> Did anyone meet this before?
> 
> 
> Thanks,
> Dong
> 
> 
> Original Message
> Sender:[email protected]
> Recipient:[email protected]
> Date:Thursday, May 19, 2016 16:10
> Subject:Error for custom agg function in generated java code
> 
> 
> Hello guys,
> 
> 
> This is Dong from Apache Kylin community.
> I’m implementing an aggregation function according 
> to:http://calcite.apache.org/docs/reference.html#user-defined-functions
> The agg function has 2 args, one for column, the other one for constant, just 
> like percentile_cont(sales, 0.5). So I put 2 Object args in the add method.
> 
> 
> Here’s the structure of my agg function class:
> public class CustomerAggFunc {
> public static CustomerAggCounter init() {
>   return null;
>  }
> public static CustomerAggCounter add(CustomerAggCounter counter, Object v, 
> Object r) {
>   CustomerAggCounter c = (CustomerAggCounter) v;
>   if (counter == null) {
>     return new CustomerAggCounter((double)r);
>    } else {
>      counter.merge(c);
>     return counter;
>    }
>  }
> public static CustomerAggCounter merge(CustomerAggCounter counter0, 
> CustomerAggCounter counter1) {    counter0.merge(counter1);
>    return counter0;
>  }
> public static double result(CustomerAggCounter counter) {
>    return counter == null ? 0: counter.getResult();
>  }
> }
> 
> 
> Then I 
> useorg.apache.calcite.schema.impl.AggregateFunctionImpl.create(CustomerAggFunc.class)
>  method to create register my implementation.
> 
> 
> But the generated java code still calls the add() method with one object arg, 
> likeadd(CustomerAggCounter counter, Object v).
> /* 69 */  return child.groupBy(new 
> org.apache.calcite.linq4j.function.Function1() {
> /* 70 */    public Long apply(Object[] a0) {
> /* 71 */     return (Long) a0[0];
> /* 72 */    }
> /* 73 */    public Object apply(Object a0) {
> /* 74 */     return apply(
> /* 75 */      (Object[]) a0);
> /* 76 */    }
> /* 77 */   }
> /* 78 */   , new org.apache.calcite.linq4j.function.Function0() {
> /* 79 */    public Object apply() {
> /* 80 */    org.apache.kylin.measure.CustomAggCounter PERCENTILEa0s0;
> /* 81 */     PERCENTILEa0s0 =org.apache.kylin.measure.CustomAggFunc.init();
> /* 82 */     return new Record1_0(
> /* 83 */       PERCENTILEa0s0);
> /* 84 */    }
> /* 85 */   }
> /* 86 */   , new org.apache.calcite.linq4j.function.Function2() {
> /* 87 */    public Record1_0 apply(Record1_0 acc, Object[] in) {
> /* 88 */     final Object inp3_ = in[3];
> /* 89 */     if (inp3_ != null) {
> /* 90 */      acc.f0 =org.apache.kylin.measure.CustomAggFunc.add(acc.f0, 
> inp3_);
> /* 91 */     }
> /* 92 */     return acc;
> /* 93 */    }
> /* 94 */    public Record1_0 apply(Object acc, Object in) {
> /* 95 */     return apply(
> /* 96 */      (Record1_0) acc,
> /* 97 */      (Object[]) in);
> /* 98 */    }
> /* 99 */   }
> /* 100 */   , new org.apache.calcite.linq4j.function.Function2() {
> /* 101 */    public Object[] apply(Long key, Record1_0 acc) {
> /* 102 */     return new Object[] {
> /* 103 */       key,
> /* 104 */       org.apache.kylin.measure.CustomAggFunc.result(acc.f0)};
> /* 105 */    }
> /* 106 */    public Object[] apply(Object key, Object acc) {
> /* 107 */     return apply(
> /* 108 */      (Long) key,
> /* 109 */      (Record1_0) acc);
> /* 110 */    }
> /* 111 */   }
> /* 112 */   );
> /* 113 */ }
> 
> 
> Then during compiling stage, there will be exceptions:
> Caused by: org.codehaus.commons.compiler.CompileException: Line 90, Column 
> 78: No applicable constructor/method found for actual parameters 
> "org.apache.kylin.measure.CustomAggCounter, java.lang.Object"; candidates 
> are: "public 
> staticorg.apache.kylin.measure.CustomAggCounterorg.apache.kylin.measure.CustomAggFuncadd(org.apache.kylin.measure.CustomAggCounter,
>  java.lang.Object, java.lang.Object)”
> 
> 
> Thanks,
> Dong

Reply via email to