diff --git hplsql/src/main/java/org/apache/hive/hplsql/Udf.java hplsql/src/main/java/org/apache/hive/hplsql/Udf.java index 9c29eeb..4901e89 100644 --- hplsql/src/main/java/org/apache/hive/hplsql/Udf.java +++ hplsql/src/main/java/org/apache/hive/hplsql/Udf.java @@ -60,15 +60,7 @@ public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumen @Override public Object evaluate(DeferredObject[] arguments) throws HiveException { if (exec == null) { - exec = new Exec(); - String query = queryOI.getPrimitiveJavaObject(arguments[0].get()); - String[] args = { "-e", query, "-trace" }; - try { - exec.setUdfRun(true); - exec.init(args); - } catch (Exception e) { - throw new HiveException(e.getMessage()); - } + initExec(arguments); } if (arguments.length > 1) { setParameters(arguments); @@ -79,6 +71,22 @@ public Object evaluate(DeferredObject[] arguments) throws HiveException { } return null; } + + /** + * init exec + */ + public void initExec(DeferredObject[] arguments) throws HiveException { + exec = new Exec(); + exec.enterGlobalScope(); + String query = queryOI.getPrimitiveJavaObject(arguments[0].get()); + String[] args = { "-e", query, "-trace" }; + try { + exec.setUdfRun(true); + exec.init(args); + } catch (Exception e) { + throw new HiveException(e.getMessage()); + } + } /** * Set parameters for the current call diff --git hplsql/src/test/java/org/apache/hive/hplsql/TestHplsqlUdf.java hplsql/src/test/java/org/apache/hive/hplsql/TestHplsqlUdf.java new file mode 100644 index 0000000..3e2ab87 --- /dev/null +++ hplsql/src/test/java/org/apache/hive/hplsql/TestHplsqlUdf.java @@ -0,0 +1,42 @@ +package org.apache.hive.hplsql; + +import org.junit.Assert; +import org.junit.Test; + +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; +import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector; +import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject; +import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredJavaObject; + +public class TestHplsqlUdf { + StringObjectInspector queryOI = PrimitiveObjectInspectorFactory.javaStringObjectInspector; + ObjectInspector argOI = PrimitiveObjectInspectorFactory.javaStringObjectInspector; + + /** + * test evaluate for exec init and setParameters + */ + @Test + public void testEvaluateWithoutRun() throws HiveException { + // init udf + Udf udf = new Udf(); + ObjectInspector[] initArguments = {queryOI, argOI}; + udf.initialize(initArguments); + //set arguments + DeferredObject queryObj = new DeferredJavaObject("hello(:1)"); + DeferredObject argObj = new DeferredJavaObject("name"); + DeferredObject[] argumentsObj = {queryObj, argObj}; + + // init exec and set parameters, included + udf.initExec(argumentsObj); + udf.setParameters(argumentsObj); + + // checking var exists and its value is right + Var var = udf.exec.findVariable(":1"); + Assert.assertNotNull(var); + String val = (String) var.value; + Assert.assertEquals(val, "name"); + } +} +