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) {
+
+        }
+    }
+}


Reply via email to