/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.hadoop.hive.ql.udf.generic; import java.sql.Date; import junit.framework.TestCase; 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.DeferredJavaObject; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject; import org.apache.hadoop.hive.serde2.io.ByteWritable; import org.apache.hadoop.hive.serde2.io.DateWritable; import org.apache.hadoop.hive.serde2.io.DoubleWritable; import org.apache.hadoop.hive.serde2.io.ShortWritable; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; public class TestGenericUDFLeast extends TestCase { public void testOneArg() throws HiveException { @SuppressWarnings("resource") GenericUDFLeast udf = new GenericUDFLeast(); ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory.writableStringObjectInspector; ObjectInspector[] arguments = { valueOI1 }; UDFArgumentException ex = null; try { udf.initialize(arguments); } catch (UDFArgumentException e) { ex = e; } assertNotNull("least() test ", ex); } public void testVoids() throws HiveException { GenericUDFGreatest udf = new GenericUDFGreatest(); ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory.writableVoidObjectInspector; ObjectInspector valueOI2 = PrimitiveObjectInspectorFactory.writableIntObjectInspector; ObjectInspector valueOI3 = PrimitiveObjectInspectorFactory.writableStringObjectInspector; ObjectInspector[] arguments = { valueOI1, valueOI2, valueOI3 }; udf.initialize(arguments); runAndVerify(new Object[] { null, 1, "test"}, null, udf); } public void testLeastTypes() throws HiveException { GenericUDFGreatest udf = new GenericUDFGreatest(); ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory.writableIntObjectInspector; ObjectInspector valueOI2 = PrimitiveObjectInspectorFactory.writableDoubleObjectInspector; ObjectInspector valueOI3 = PrimitiveObjectInspectorFactory.writableDateObjectInspector; ObjectInspector valueOI4 = PrimitiveObjectInspectorFactory.writableStringObjectInspector; ObjectInspector[] arguments = { valueOI1, valueOI2, valueOI3, valueOI4 }; udf.initialize(arguments); runAndVerify(new Object[] { 1, 11.1, Date.valueOf("2015-03-20"), "test"}, "test", udf); //string comparisons } public void testLeastStr() throws HiveException { GenericUDFLeast udf = new GenericUDFLeast(); ObjectInspector[] arguments = new ObjectInspector[3]; for (int i = 0; i < arguments.length; i++) { arguments[i] = PrimitiveObjectInspectorFactory.writableStringObjectInspector; } udf.initialize(arguments); runAndVerify(new String[] { "a", "b", "c" }, "a", udf); runAndVerify(new String[] { "C", "a", "B" }, "B", udf); runAndVerify(new String[] { "AAA", "AaA", "AAa" }, "AAA", udf); runAndVerify(new String[] { "A", "AA", "AAA" }, "A", udf); runAndVerify(new String[] { "11", "13", "12" }, "11", udf); runAndVerify(new String[] { "11", "2", "12" }, "11", udf); runAndVerify(new String[] { "01", "03", "02" }, "01", udf); runAndVerify(new String[] { "01", "1", "02" }, "01", udf); runAndVerify(new String[] { null, "b", "c" }, null, udf); runAndVerify(new String[] { "a", null, "c" }, null, udf); runAndVerify(new String[] { "a", "b", null }, null, udf); runAndVerify(new String[] { "a", null, null }, null, udf); runAndVerify(new String[] { null, "b", null }, null, udf); runAndVerify(new String[] { null, null, null }, null, udf); } public void testLeastInt() throws HiveException { GenericUDFLeast udf = new GenericUDFLeast(); ObjectInspector[] arguments = new ObjectInspector[3]; for (int i = 0; i < arguments.length; i++) { arguments[i] = PrimitiveObjectInspectorFactory.writableIntObjectInspector; } udf.initialize(arguments); runAndVerify(new Integer[] { 11, 13, 12 }, 11, udf); runAndVerify(new Integer[] { 1, 13, 2 }, 1, udf); runAndVerify(new Integer[] { -11, -13, -12 }, -13, udf); runAndVerify(new Integer[] { 1, -13, 2 }, -13, udf); runAndVerify(new Integer[] { null, 1, 2 }, null, udf); runAndVerify(new Integer[] { 1, null, 2 }, null, udf); runAndVerify(new Integer[] { 1, 2, null }, null, udf); runAndVerify(new Integer[] { null, null, null }, null, udf); } public void testLeastDouble() throws HiveException { GenericUDFLeast udf = new GenericUDFLeast(); ObjectInspector[] arguments = new ObjectInspector[3]; for (int i = 0; i < arguments.length; i++) { arguments[i] = PrimitiveObjectInspectorFactory.writableDoubleObjectInspector; } udf.initialize(arguments); runAndVerify(new Double[] { 11.4, 11.5, 11.2 }, 11.2, udf); runAndVerify(new Double[] { 1.0, 13.3, 2.0 }, 1.0, udf); runAndVerify(new Double[] { -11.4, -13.1, -12.2 }, -13.1, udf); runAndVerify(new Double[] { 1.0, -13.3, 2.2 }, -13.3, udf); runAndVerify(new Double[] { null, 1.1, 2.2 }, null, udf); runAndVerify(new Double[] { 1.1, null, 2.2 }, null, udf); runAndVerify(new Double[] { 1.1, 2.2, null }, null, udf); runAndVerify(new Double[] { null, null, null }, null, udf); } public void testLeastDate() throws HiveException { GenericUDFLeast udf = new GenericUDFLeast(); ObjectInspector[] arguments = new ObjectInspector[3]; for (int i = 0; i < arguments.length; i++) { arguments[i] = PrimitiveObjectInspectorFactory.writableDateObjectInspector; } udf.initialize(arguments); Date d1 = Date.valueOf("2015-03-20"); Date d2 = Date.valueOf("2015-03-21"); Date d3 = Date.valueOf("2014-03-20"); runAndVerify(new Date[] { d1, d2, d3 }, d3, udf); runAndVerify(new Date[] { null, d2, d3 }, null, udf); runAndVerify(new Date[] { d1, null, d3 }, null, udf); runAndVerify(new Date[] { d1, d2, null }, null, udf); runAndVerify(new Date[] { null, null, null }, null, udf); } public void testLeastIntTypes() throws HiveException { GenericUDFLeast udf = new GenericUDFLeast(); ObjectInspector[] arguments = new ObjectInspector[4]; arguments[0] = PrimitiveObjectInspectorFactory.writableByteObjectInspector; arguments[1] = PrimitiveObjectInspectorFactory.writableShortObjectInspector; arguments[2] = PrimitiveObjectInspectorFactory.writableIntObjectInspector; arguments[3] = PrimitiveObjectInspectorFactory.writableLongObjectInspector; udf.initialize(arguments); runAndVerify(new Object[] { (byte) 11, (short) 13, 12, 14L }, 11L, udf); runAndVerify(new Object[] { (byte) 1, (short) 13, 2, 0L }, 0L, udf); runAndVerify(new Object[] { (byte) -11, (short) -13, -12, 0L }, -13L, udf); runAndVerify(new Object[] { (byte) 1, (short) -13, 2, 0L}, -13L, udf); runAndVerify(new Object[] { null, (short) 1, 2, 0L }, null, udf); runAndVerify(new Object[] { (byte) 1, null, 2, -1L }, null, udf); runAndVerify(new Object[] { (byte) 1, (short) 2, null, -1L }, null, udf); runAndVerify(new Integer[] { null, null, null, null }, null, udf); } private void runAndVerify(Object[] v, Object expResult, GenericUDF udf) throws HiveException { DeferredObject[] args = new DeferredObject[v.length]; for (int i = 0; i < v.length; i++) { args[i] = new DeferredJavaObject(getWritable(v[i])); } Object output = udf.evaluate(args); output = parseOutput(output); assertEquals("greatest() test ", expResult, output != null ? output : null); } private Object getWritable(Object o) { if (o instanceof String) { return o != null ? new Text((String) o) : null; } else if (o instanceof Integer) { return o != null ? new IntWritable((Integer) o) : null; } else if (o instanceof Double) { return o != null ? new DoubleWritable((Double) o) : null; } else if (o instanceof Date) { return o != null ? new DateWritable((Date) o) : null; } else if (o instanceof Byte) { return o != null ? new ByteWritable((Byte) o): null; } else if (o instanceof Short) { return o != null ? new ShortWritable((Short) o) : null; } else if (o instanceof Long) { return o != null ? new LongWritable((Long) o) : null; } return null; } private Object parseOutput(Object o) { if (o == null) { return null; } if (o instanceof Text) { return o.toString(); } else if (o instanceof IntWritable) { return ((IntWritable) o).get(); } else if (o instanceof DoubleWritable) { return ((DoubleWritable) o).get(); } else if (o instanceof DateWritable) { return ((DateWritable) o).get(); } else if (o instanceof ByteWritable) { return ((ByteWritable) o).get(); } else if (o instanceof ShortWritable) { return ((ShortWritable) o).get(); } else if (o instanceof LongWritable) { return ((LongWritable) o).get(); } return null; } }