blob: 0b3126899f4b7a52cad6b352ae76ed8d1e3b69d1 [file] [log] [blame]
package edu.uci.ics.asterix.external.library;
import java.io.IOException;
import edu.uci.ics.asterix.common.exceptions.AsterixException;
import edu.uci.ics.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
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.api.dataflow.value.ISerializerDeserializer;
import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
import edu.uci.ics.hyracks.data.std.api.IDataOutputProvider;
import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage;
import edu.uci.ics.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
public abstract class ExternalFunction implements IExternalFunction {
protected final IExternalFunctionInfo finfo;
protected final IFunctionFactory externalFunctionFactory;
protected final IExternalFunction externalFunction;
protected final ICopyEvaluatorFactory[] evaluatorFactories;
protected final IDataOutputProvider out;
protected final ArrayBackedValueStorage inputVal = new ArrayBackedValueStorage();
protected final ICopyEvaluator[] argumentEvaluators;
protected final JavaFunctionHelper functionHelper;
public ExternalFunction(IExternalFunctionInfo finfo, ICopyEvaluatorFactory args[],
IDataOutputProvider outputProvider) throws AlgebricksException {
this.finfo = finfo;
this.evaluatorFactories = args;
this.out = outputProvider;
argumentEvaluators = new ICopyEvaluator[args.length];
for (int i = 0; i < args.length; i++) {
argumentEvaluators[i] = args[i].createEvaluator(inputVal);
}
functionHelper = new JavaFunctionHelper(finfo, outputProvider);
String[] fnameComponents = finfo.getFunctionIdentifier().getName().split(":");
String functionLibary = fnameComponents[0];
String dataverse = finfo.getFunctionIdentifier().getNamespace();
ClassLoader libraryClassLoader = ExternalLibraryManager.getLibraryClassLoader(dataverse, functionLibary);
String classname = finfo.getFunctionBody();
Class clazz;
try {
clazz = Class.forName(classname, true, libraryClassLoader);
externalFunctionFactory = (IFunctionFactory) clazz.newInstance();
externalFunction = externalFunctionFactory.getExternalFunction();
} catch (Exception e) {
throw new AlgebricksException(" Unable to load/instantiate class " + classname, e);
}
}
public static ISerializerDeserializer getSerDe(Object typeInfo) {
return AqlSerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(typeInfo);
}
public IExternalFunctionInfo getFinfo() {
return finfo;
}
public void setArguments(IFrameTupleReference tuple) throws AlgebricksException, IOException, AsterixException {
for (int i = 0; i < evaluatorFactories.length; i++) {
inputVal.reset();
argumentEvaluators[i].evaluate(tuple);
functionHelper.setArgument(i, inputVal.getByteArray());
}
}
@Override
public void deinitialize() {
externalFunction.deinitialize();
}
}