blob: d895ddedb879d981f5ce29c4e34e5592bf4dfd4f [file] [log] [blame]
package edu.uci.ics.asterix.external.library;
import java.util.HashMap;
import java.util.Map;
import edu.uci.ics.asterix.om.functions.IExternalFunctionInfo;
import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
import edu.uci.ics.hyracks.algebricks.runtime.base.ICopyEvaluator;
import edu.uci.ics.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
import edu.uci.ics.hyracks.data.std.api.IDataOutputProvider;
import edu.uci.ics.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
public class ExternalFunctionProvider {
private static Map<IExternalFunctionInfo, ExternalScalarFunction> functionRepo = new HashMap<IExternalFunctionInfo, ExternalScalarFunction>();
public static IExternalFunction getExternalFunctionEvaluator(IExternalFunctionInfo finfo,
ICopyEvaluatorFactory args[], IDataOutputProvider outputProvider) throws AlgebricksException {
switch (finfo.getKind()) {
case SCALAR:
ExternalScalarFunction function = functionRepo.get(finfo);
function = new ExternalScalarFunction(finfo, args, outputProvider);
// functionRepo.put(finfo, function);
return function;
case AGGREGATE:
case UNNEST:
throw new IllegalArgumentException(" not supported function kind" + finfo.getKind());
default:
throw new IllegalArgumentException(" unknown function kind" + finfo.getKind());
}
}
}
class ExternalScalarFunction extends ExternalFunction implements IExternalScalarFunction, ICopyEvaluator {
public ExternalScalarFunction(IExternalFunctionInfo finfo, ICopyEvaluatorFactory args[],
IDataOutputProvider outputProvider) throws AlgebricksException {
super(finfo, args, outputProvider);
initialize(functionHelper);
}
@Override
public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
try {
setArguments(tuple);
evaluate(functionHelper);
} catch (Exception e) {
throw new AlgebricksException(e);
}
}
public void evaluate(IFunctionHelper argumentProvider) throws Exception {
((IExternalScalarFunction) externalFunction).evaluate(argumentProvider);
}
@Override
public void initialize(IFunctionHelper functionHelper) {
((IExternalScalarFunction) externalFunction).initialize(functionHelper);
}
}