| /* |
| * 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.pig.test; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import java.io.IOException; |
| |
| import org.apache.pig.builtin.InvokeForDouble; |
| import org.apache.pig.builtin.InvokeForFloat; |
| import org.apache.pig.builtin.InvokeForInt; |
| import org.apache.pig.builtin.InvokeForLong; |
| import org.apache.pig.builtin.InvokeForString; |
| import org.apache.pig.data.BagFactory; |
| import org.apache.pig.data.DataBag; |
| import org.apache.pig.data.Tuple; |
| import org.apache.pig.data.TupleFactory; |
| import org.junit.Test; |
| |
| /** need more tests -- non-String funcs and especially the full path through the pig interpreter. |
| * I tested manually, seems to work, but |
| * should really add more here. |
| */ |
| public class TestInvoker { |
| |
| private final TupleFactory tf_ = TupleFactory.getInstance(); |
| private final BagFactory bf_ = BagFactory.getInstance(); |
| |
| @Test |
| public void testStringInvoker() throws SecurityException, ClassNotFoundException, NoSuchMethodException, IOException { |
| |
| // Test non-static method |
| InvokeForString is = new InvokeForString("java.lang.String.toUpperCase", "String", "false"); |
| assertEquals("FOO", is.exec(tf_.newTuple("foo"))); |
| |
| // both "static" and "true" should work |
| // Test static method |
| is = new InvokeForString("java.lang.String.valueOf", "int", "true"); |
| Tuple t = tf_.newTuple(1); |
| t.set(0,231); |
| assertEquals("231", is.exec(t)); |
| |
| // test default (should be static) |
| is = new InvokeForString("java.lang.String.valueOf", "int"); |
| assertEquals("231", is.exec(t)); |
| |
| // Test method with multiple args |
| is = new InvokeForString(TestInvoker.class.getName()+".concatStrings", "String String"); |
| t = tf_.newTuple(2); |
| t.set(0, "foo"); |
| t.set(1, "bar"); |
| assertEquals("foobar", is.exec(t)); |
| } |
| |
| @Test |
| public void testNoArgInvoker() throws SecurityException, ClassNotFoundException, NoSuchMethodException, IOException { |
| InvokeForInt id = new InvokeForInt(TestInvoker.class.getName() + ".simpleStaticFunction"); |
| assertEquals(Integer.valueOf(1), id.exec(tf_.newTuple())); |
| } |
| @Test |
| public void testLongInvoker() throws SecurityException, ClassNotFoundException, NoSuchMethodException, NumberFormatException, IOException { |
| InvokeForLong il = new InvokeForLong("java.lang.Long.valueOf", "String"); |
| Tuple t = tf_.newTuple(1); |
| String arg = "245"; |
| t.set(0, arg); |
| assertEquals(Long.valueOf(arg), il.exec(t)); |
| } |
| |
| @Test |
| public void testIntInvoker() throws SecurityException, ClassNotFoundException, NoSuchMethodException, NumberFormatException, IOException { |
| InvokeForInt il = new InvokeForInt("java.lang.Integer.valueOf", "String"); |
| Tuple t = tf_.newTuple(1); |
| String arg = "245"; |
| t.set(0, arg); |
| assertEquals(Integer.valueOf(arg), il.exec(t)); |
| } |
| |
| @Test |
| public void testArrayConversion() throws SecurityException, ClassNotFoundException, NoSuchMethodException, IOException { |
| InvokeForInt ii = new InvokeForInt(TestInvoker.class.getName() + ".avg", "double[]"); |
| DataBag nums = newSimpleBag(1.0, 2.0, 3.0); |
| assertEquals(Integer.valueOf(2), ii.exec(tf_.newTuple(nums))); |
| |
| ii = new InvokeForInt(TestInvoker.class.getName() + ".avg", "long[]"); |
| nums = newSimpleBag(1L, 2L, 3L); |
| assertEquals(Integer.valueOf(2), ii.exec(tf_.newTuple(nums))); |
| |
| InvokeForString is = new InvokeForString(TestInvoker.class.getName() + ".concatStringArray", "string[]"); |
| DataBag strings = newSimpleBag("foo", "bar", "baz"); |
| assertEquals("foobarbaz", is.exec(tf_.newTuple(strings))); |
| } |
| |
| @Test |
| public void testDoubleInvoker() throws SecurityException, ClassNotFoundException, NoSuchMethodException, NumberFormatException, IOException { |
| InvokeForDouble il = new InvokeForDouble("java.lang.Double.valueOf", "String"); |
| Tuple t = tf_.newTuple(1); |
| String arg = "245"; |
| t.set(0, arg); |
| assertEquals(Double.valueOf(arg), il.exec(t)); |
| } |
| |
| @Test |
| public void testFloatInvoker() throws SecurityException, ClassNotFoundException, NoSuchMethodException, NumberFormatException, IOException { |
| InvokeForFloat il = new InvokeForFloat("java.lang.Float.valueOf", "String"); |
| Tuple t = tf_.newTuple(1); |
| String arg = "245.3"; |
| t.set(0, arg); |
| assertEquals(Float.valueOf(arg), il.exec(t)); |
| } |
| |
| public static String concatStrings(String str1, String str2) { |
| return str1.concat(str2); |
| } |
| |
| public static String concatStringArray(String[] strings) { |
| StringBuilder sb = new StringBuilder(); |
| for (String s : strings) { |
| sb.append(s); |
| } |
| return sb.toString(); |
| } |
| |
| public static int simpleStaticFunction() { |
| return 1; |
| } |
| |
| public static int avg(long[] nums) { |
| long sum = 0; |
| for (long d: nums) { |
| sum += d; |
| } |
| return (int) sum/nums.length; |
| } |
| |
| public static int avg(double[] nums) { |
| double sum = 0; |
| for (double d: nums) { |
| sum += d; |
| } |
| return (int) sum/nums.length; |
| } |
| |
| private DataBag newSimpleBag(Object... objects) { |
| DataBag bag = bf_.newDefaultBag(); |
| for (Object o : objects) { |
| bag.add(tf_.newTuple(o)); |
| } |
| return bag; |
| } |
| } |