Author: pisong Date: Thu Jun 12 04:51:03 2008 New Revision: 667052 URL: http://svn.apache.org/viewvc?rev=667052&view=rev Log: variable argument support for UDFs
Added: incubator/pig/trunk/test/org/apache/pig/test/TestInstantiateFunc.java Modified: incubator/pig/trunk/CHANGES.txt incubator/pig/trunk/src/org/apache/pig/impl/PigContext.java Modified: incubator/pig/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/incubator/pig/trunk/CHANGES.txt?rev=667052&r1=667051&r2=667052&view=diff ============================================================================== --- incubator/pig/trunk/CHANGES.txt (original) +++ incubator/pig/trunk/CHANGES.txt Thu Jun 12 04:51:03 2008 @@ -314,3 +314,5 @@ PIG-243: Fixing unit tests on windows PIG-198: Fixed pig script to pick up hadoop 17 instead of 15 (pi_song via gates). + + PIG-256: Added variable argument support for UDFs (pi_song) Modified: incubator/pig/trunk/src/org/apache/pig/impl/PigContext.java URL: http://svn.apache.org/viewvc/incubator/pig/trunk/src/org/apache/pig/impl/PigContext.java?rev=667052&r1=667051&r2=667052&view=diff ============================================================================== --- incubator/pig/trunk/src/org/apache/pig/impl/PigContext.java (original) +++ incubator/pig/trunk/src/org/apache/pig/impl/PigContext.java Thu Jun 12 04:51:03 2008 @@ -447,8 +447,17 @@ private static Object instantiateFunc(String className, String argString) { Object ret; List<String> args = parseArguments(argString); - try{ - Class objClass = resolveClassName(className); + Class objClass = null ; + + try { + objClass = resolveClassName(className); + } + catch(IOException ioe) { + throw new RuntimeException("Cannot instantiate:" + className, ioe) ; + } + + try { + // Do normal instantiation if (args != null && args.size() > 0) { Class paramTypes[] = new Class[args.size()]; for (int i = 0; i < paramTypes.length; i++) { @@ -459,7 +468,29 @@ } else { ret = objClass.newInstance(); } - }catch(Throwable e){ + } + catch(NoSuchMethodException nme) { + // Second channce. Try with var arg constructor + try { + Constructor c = objClass.getConstructor(String[].class); + String[] argArr = args.toArray(new String[0]) ; + Object[] wrappedArgs = new Object[1] ; + wrappedArgs[0] = argArr ; + ret = c.newInstance(wrappedArgs); + } + catch(Throwable e){ + // bad luck + StringBuilder sb = new StringBuilder(); + sb.append("could not instantiate '"); + sb.append(className); + sb.append("' with arguments '"); + sb.append(args); + sb.append("'"); + throw new RuntimeException(sb.toString(), e); + } + } + catch(Throwable e){ + // bad luck StringBuilder sb = new StringBuilder(); sb.append("could not instantiate '"); sb.append(className); Added: incubator/pig/trunk/test/org/apache/pig/test/TestInstantiateFunc.java URL: http://svn.apache.org/viewvc/incubator/pig/trunk/test/org/apache/pig/test/TestInstantiateFunc.java?rev=667052&view=auto ============================================================================== --- incubator/pig/trunk/test/org/apache/pig/test/TestInstantiateFunc.java (added) +++ incubator/pig/trunk/test/org/apache/pig/test/TestInstantiateFunc.java Thu Jun 12 04:51:03 2008 @@ -0,0 +1,90 @@ +/* + * 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 junit.framework.TestCase; +import org.junit.Test; +import org.apache.pig.impl.PigContext; + +public class TestInstantiateFunc extends TestCase { + + static final String TEST_CLASS + = "org.apache.pig.test.TestInstantiateFunc$TestClass" ; + + static final String TEST_CLASS2 + = "org.apache.pig.test.TestInstantiateFunc$TestClass2" ; + + // Positive case + @Test + public void testInstantiate1() throws Throwable { + PigContext.instantiateFuncFromSpec(TEST_CLASS) ; + } + + // Positive case + @Test + public void testInstantiate2() throws Throwable { + PigContext.instantiateFuncFromSpec(TEST_CLASS + "('a','b')") ; + } + + // Positive case + @Test + public void testInstantiate3() throws Throwable { + PigContext.instantiateFuncFromSpec(TEST_CLASS + "('a','b','c')") ; + } + + // Negative case + @Test + public void testInstantiate4() throws Throwable { + try { + PigContext.instantiateFuncFromSpec(TEST_CLASS2) ; + fail("expect error here") ; + } catch(Exception e) { + // good + } + } + + // Negative case + @Test + public void testInstantiate5() throws Throwable { + try { + PigContext.instantiateFuncFromSpec(TEST_CLASS2 + "('a','b','c')") ; + fail("expect error here") ; + } catch(Exception e) { + // good + } + } + + public static class TestClass{ + public TestClass() { + + } + public TestClass(String a, String b) { + + } + public TestClass(String... strList) { + + } + } + + public static class TestClass2{ + public TestClass2(String a, String b) { + + } + } +}