blob: bce719dbe8f6b4dd79b2a9c8f8b271e4f70a628e [file] [log] [blame]
/*
* 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;
}
}