@Override
public ISerializedAggregateEvaluatorFactory createSerializableAggregateFunctionFactory(
AggregateFunctionCallExpression expr, IVariableTypeEnvironment env, IOperatorSchema[] inputSchemas,
JobGenContext context) throws AlgebricksException {
IScalarEvaluatorFactory[] args = codegenArguments(expr, env, inputSchemas, context);
IFunctionDescriptor fd = resolveFunction(expr, env, context);
switch (fd.getFunctionDescriptorTag()) {
case AGGREGATE: {
if (BuiltinFunctions.isAggregateFunctionSerializable(fd.getIdentifier())) {
AggregateFunctionCallExpression serialAggExpr = BuiltinFunctions
.makeSerializableAggregateFunctionExpression(fd.getIdentifier(), expr.getArguments());
IFunctionDescriptor afdd = resolveFunction(serialAggExpr, env, context);
return afdd.createSerializableAggregateEvaluatorFactory(args);
} else {
throw new AlgebricksException(
"Trying to create a serializable aggregate from a non-serializable aggregate function descriptor. (fi="
+ expr.getFunctionIdentifier() + ")");
}
}
case SERIALAGGREGATE: {
return fd.createSerializableAggregateEvaluatorFactory(args);
}
default:
throw new IllegalStateException(
"Invalid function descriptor " + fd.getFunctionDescriptorTag() + " expected "
+ FunctionDescriptorTag.SERIALAGGREGATE + " or " + FunctionDescriptorTag.AGGREGATE);
}
}