package brickhouse.udf.collect;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredJavaObject;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.StandardListObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class ArrayUnionUDFTest {
private ArrayUnionUDF udf;
@Before
public void before() {
udf = new ArrayUnionUDF();
}
@Test(expected = UDFArgumentException.class)
public void testInitializeWithNoArguments() throws UDFArgumentException {
udf.initialize(new ObjectInspector[0]);
}
@Test(expected = UDFArgumentException.class)
public void testInitializeWithOneArgument() throws UDFArgumentException {
ObjectInspector stringOi = PrimitiveObjectInspectorFactory.javaStringObjectInspector;
ObjectInspector listOi = ObjectInspectorFactory.getStandardListObjectInspector(stringOi);
udf.initialize(new ObjectInspector[]{listOi});
}
@Test
public void testInitializeWithTwoArguments() throws UDFArgumentException {
ObjectInspector stringOi = PrimitiveObjectInspectorFactory.javaStringObjectInspector;
ObjectInspector listOi = ObjectInspectorFactory.getStandardListObjectInspector(stringOi);
udf.initialize(new ObjectInspector[]{listOi, listOi});
}
/**
* {1, 2} ∪ {1, 2} = {1, 2}
*/
@Test
public void testEvaluateWithSameElements() throws HiveException {
ObjectInspector intOi = PrimitiveObjectInspectorFactory.javaIntObjectInspector;
ObjectInspector listOi = ObjectInspectorFactory.getStandardListObjectInspector(intOi);
StandardListObjectInspector resultOi = (StandardListObjectInspector) udf.initialize(new ObjectInspector[]{listOi, listOi});
List<Integer> one = new ArrayList<Integer>();
one.add(1);
one.add(2);
List<Integer> two = new ArrayList<Integer>();
two.add(1);
two.add(2);
Object result = udf.evaluate(new GenericUDF.DeferredObject[]{new DeferredJavaObject(one), new DeferredJavaObject(two)});
assertEquals(2, resultOi.getListLength(result));
assertTrue(resultOi.getList(result).contains(1));
assertTrue(resultOi.getList(result).contains(2));
}
/**
* {1, 2} ∪ {2, 3} = {1, 2, 3}
*/
@Test
public void testEvaluateWithTwoArrays() throws HiveException {
ObjectInspector intOi = PrimitiveObjectInspectorFactory.javaIntObjectInspector;
ObjectInspector listOi = ObjectInspectorFactory.getStandardListObjectInspector(intOi);
StandardListObjectInspector resultOi = (StandardListObjectInspector) udf.initialize(new ObjectInspector[]{listOi, listOi});
List<Integer> one = new ArrayList<Integer>();
one.add(1);
one.add(2);
List<Integer> two = new ArrayList<Integer>();
two.add(2);
two.add(3);
Object result = udf.evaluate(new GenericUDF.DeferredObject[]{new DeferredJavaObject(one), new DeferredJavaObject(two)});
assertEquals(3, resultOi.getListLength(result));
assertTrue(resultOi.getList(result).contains(1));
assertTrue(resultOi.getList(result).contains(2));
assertTrue(resultOi.getList(result).contains(3));
}
/**
* {1, 2} ∪ {2, 5} u {3, 4} = {1, 2, 3, 4, 5}
*/
@Test
public void testEvaluateWithThreeArrays() throws HiveException {
ObjectInspector intOi = PrimitiveObjectInspectorFactory.javaIntObjectInspector;
ObjectInspector listOi = ObjectInspectorFactory.getStandardListObjectInspector(intOi);
StandardListObjectInspector resultOi = (StandardListObjectInspector) udf.initialize(new ObjectInspector[]{listOi, listOi, listOi});
List<Integer> one = new ArrayList<Integer>();
one.add(1);
one.add(2);
List<Integer> two = new ArrayList<Integer>();
two.add(2);
two.add(5);
List<Integer> three = new ArrayList<Integer>();
two.add(3);
two.add(4);
Object result = udf.evaluate(new GenericUDF.DeferredObject[]{new DeferredJavaObject(one), new DeferredJavaObject(two), new DeferredJavaObject(three)});
assertEquals(5, resultOi.getListLength(result));
assertTrue(resultOi.getList(result).contains(1));
assertTrue(resultOi.getList(result).contains(2));
assertTrue(resultOi.getList(result).contains(3));
assertTrue(resultOi.getList(result).contains(4));
assertTrue(resultOi.getList(result).contains(5));
}
}