private void doAggregate(AggregateFunctionImpl aggFn, String varName, Type ty, List<Integer> argList) {
List<String> args = new ArrayList<>();
Class<?> accumulatorType = aggFn.accumulatorType;
if (!aggFn.isStatic) {
String aggObjName = String.format("%s_obj", varName);
String aggObjClassName = aggFn.initMethod.getDeclaringClass().getCanonicalName();
pw.println(String.format(" if (!accumulators.containsKey(\"%s\")) { ", aggObjName));
pw.println(String.format(" accumulators.put(\"%s\", new %s());", aggObjName, aggObjClassName));
pw.println(" }");
pw.println(" @SuppressWarnings(\"unchecked\")");
pw.println(String.format(" final %1$s %2$s = (%1$s) accumulators.get(\"%2$s\");", aggObjClassName,
aggObjName));
args.add(aggObjName);
}
args.add(String.format("%1$s == null ? %2$s : (%3$s) %1$s",
"accumulators.get(\"" + varName + "\")",
printMethodCall(aggFn.initMethod, args),
accumulatorType.getCanonicalName()));
if (argList.isEmpty()) {
args.add("EMPTY_VALUES");
} else {
for (int i = 0; i < aggFn.valueTypes.size(); i++) {
args.add(String.format("(%s) %s", aggFn.valueTypes.get(i).getCanonicalName(), "_data.get(" + argList.get(i) + ")"));
}
}
pw.print(String.format(" accumulators.put(\"%s\", %s);\n",
varName,
printMethodCall(aggFn.addMethod, args)));
}