You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pig.apache.org by da...@apache.org on 2013/03/19 00:45:01 UTC

svn commit: r1458063 - in /pig/trunk: ./ src/docs/src/documentation/content/xdocs/ src/org/apache/pig/scripting/groovy/ test/org/apache/pig/test/

Author: daijy
Date: Mon Mar 18 23:45:01 2013
New Revision: 1458063

URL: http://svn.apache.org/r1458063
Log:
PIG-3218: Add support for biginteger/bigdecimal type in Groovy UDFs

Modified:
    pig/trunk/CHANGES.txt
    pig/trunk/src/docs/src/documentation/content/xdocs/udf.xml
    pig/trunk/src/org/apache/pig/scripting/groovy/GroovyAlgebraicEvalFunc.java
    pig/trunk/src/org/apache/pig/scripting/groovy/GroovyScriptEngine.java
    pig/trunk/src/org/apache/pig/scripting/groovy/GroovyUtils.java
    pig/trunk/test/org/apache/pig/test/TestUDFGroovy.java

Modified: pig/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/pig/trunk/CHANGES.txt?rev=1458063&r1=1458062&r2=1458063&view=diff
==============================================================================
--- pig/trunk/CHANGES.txt (original)
+++ pig/trunk/CHANGES.txt Mon Mar 18 23:45:01 2013
@@ -28,6 +28,8 @@ PIG-3174:  Remove rpm and deb artifacts 
 
 IMPROVEMENTS
 
+PIG-3218: Add support for biginteger/bigdecimal type in Groovy UDFs (herberts via daijy)
+
 PIG-3248: Upgrade hadoop-2.0.0-alpha to hadoop-2.0.3-alpha (daijy)
 
 PIG-3235: Add log4j.properties for unit tests (cheolsoo)

Modified: pig/trunk/src/docs/src/documentation/content/xdocs/udf.xml
URL: http://svn.apache.org/viewvc/pig/trunk/src/docs/src/documentation/content/xdocs/udf.xml?rev=1458063&r1=1458062&r2=1458063&view=diff
==============================================================================
--- pig/trunk/src/docs/src/documentation/content/xdocs/udf.xml (original)
+++ pig/trunk/src/docs/src/documentation/content/xdocs/udf.xml Mon Mar 18 23:45:01 2013
@@ -1838,6 +1838,8 @@ class GroovyUDFs {",
   <li>chararray: String</li>
   <li>bytearray: byte[] (content is copied)</li>
   <li>boolean: boolean</li>
+  <li>biginteger: BigInteger</li>
+  <li>bigdecimal: BigDecimal</li>
   <li>null: null </li>
 </ul>
 <p>Anything else raises an exception</p>
@@ -1851,12 +1853,14 @@ class GroovyUDFs {",
   <li>java.util.Map: Map</li>
   <li>java.util.List: DataBag</li>
   <li>Byte/Short/Integer: int</li>
-  <li>Long/BigInteger: long</li>
+  <li>Long: long</li>
   <li>Float: float</li>
-  <li>Double/BigDecimal: double</li>
+  <li>Double: double</li>
   <li>String: chararray</li>
   <li>byte[]: DataByteArray (content is copied)</li>
   <li>Boolean: boolean</li>
+  <li>BigInteger: biginteger</li>
+  <li>BigDecimal: bigdecimal</li>
   <li>null: null</li>
 </ul>
 <p>Anything else raises an exception</p>

Modified: pig/trunk/src/org/apache/pig/scripting/groovy/GroovyAlgebraicEvalFunc.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/scripting/groovy/GroovyAlgebraicEvalFunc.java?rev=1458063&r1=1458062&r2=1458063&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/scripting/groovy/GroovyAlgebraicEvalFunc.java (original)
+++ pig/trunk/src/org/apache/pig/scripting/groovy/GroovyAlgebraicEvalFunc.java Mon Mar 18 23:45:01 2013
@@ -18,6 +18,8 @@
 
 package org.apache.pig.scripting.groovy;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.util.Map;
@@ -288,4 +290,42 @@ public abstract class GroovyAlgebraicEva
       }
     }
   }
+
+  public static class BigIntegerGroovyAlgebraicEvalFunc extends GroovyAlgebraicEvalFunc<BigInteger> {
+    public BigIntegerGroovyAlgebraicEvalFunc(String path, String namespace, String methodName, String initialMethod,
+        String intermedMethod, String finalMethod) throws IOException {
+      super(path, namespace, methodName, initialMethod, intermedMethod, finalMethod);
+    }
+
+    @Override
+    public String getFinal() {
+      return Final.class.getName();
+    }
+
+    public static class Final extends GroovyAlgebraicEvalFunc.Final<BigInteger> {
+      public Final(String path, String namespace, String methodName, String initialMethod, String intermedMethod,
+          String finalMethod) throws IOException {
+        super(path, namespace, methodName, initialMethod, intermedMethod, finalMethod);
+      }
+    }
+  }
+
+  public static class BigDecimalGroovyAlgebraicEvalFunc extends GroovyAlgebraicEvalFunc<BigDecimal> {
+    public BigDecimalGroovyAlgebraicEvalFunc(String path, String namespace, String methodName, String initialMethod,
+        String intermedMethod, String finalMethod) throws IOException {
+      super(path, namespace, methodName, initialMethod, intermedMethod, finalMethod);
+    }
+
+    @Override
+    public String getFinal() {
+      return Final.class.getName();
+    }
+
+    public static class Final extends GroovyAlgebraicEvalFunc.Final<BigDecimal> {
+      public Final(String path, String namespace, String methodName, String initialMethod, String intermedMethod,
+          String finalMethod) throws IOException {
+        super(path, namespace, methodName, initialMethod, intermedMethod, finalMethod);
+      }
+    }
+  }
 }

Modified: pig/trunk/src/org/apache/pig/scripting/groovy/GroovyScriptEngine.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/scripting/groovy/GroovyScriptEngine.java?rev=1458063&r1=1458062&r2=1458063&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/scripting/groovy/GroovyScriptEngine.java (original)
+++ pig/trunk/src/org/apache/pig/scripting/groovy/GroovyScriptEngine.java Mon Mar 18 23:45:01 2013
@@ -44,6 +44,8 @@ import org.apache.pig.impl.logicalLayer.
 import org.apache.pig.impl.util.ObjectSerializer;
 import org.apache.pig.impl.util.Utils;
 import org.apache.pig.scripting.ScriptEngine;
+import org.apache.pig.scripting.groovy.GroovyAlgebraicEvalFunc.BigDecimalGroovyAlgebraicEvalFunc;
+import org.apache.pig.scripting.groovy.GroovyAlgebraicEvalFunc.BigIntegerGroovyAlgebraicEvalFunc;
 import org.apache.pig.scripting.groovy.GroovyAlgebraicEvalFunc.BooleanGroovyAlgebraicEvalFunc;
 import org.apache.pig.scripting.groovy.GroovyAlgebraicEvalFunc.ChararrayGroovyAlgebraicEvalFunc;
 import org.apache.pig.scripting.groovy.GroovyAlgebraicEvalFunc.DataBagGroovyAlgebraicEvalFunc;
@@ -371,6 +373,10 @@ public class GroovyScriptEngine extends 
           className = LongGroovyAlgebraicEvalFunc.class.getName();
         } else if (returnType.equals(Map.class)) {
           className = MapGroovyAlgebraicEvalFunc.class.getName();
+        } else if (returnType.equals(BigDecimal.class)) {
+          className = BigDecimalGroovyAlgebraicEvalFunc.class.getName();
+        } else if (returnType.equals(BigInteger.class)) {
+          className = BigIntegerGroovyAlgebraicEvalFunc.class.getName();
         } else {
           throw new RuntimeException(path + ": Unknown return type for Algebraic UDF '" + algebraic + "'");
         }

Modified: pig/trunk/src/org/apache/pig/scripting/groovy/GroovyUtils.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/scripting/groovy/GroovyUtils.java?rev=1458063&r1=1458062&r2=1458063&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/scripting/groovy/GroovyUtils.java (original)
+++ pig/trunk/src/org/apache/pig/scripting/groovy/GroovyUtils.java Mon Mar 18 23:45:01 2013
@@ -52,9 +52,11 @@ public class GroovyUtils {
    * java.util.Map Map
    * java.util.List DataBag
    * Byte/Short/Integer int
-   * Long/BigInteger long
+   * Long long
    * Float float
-   * Double/BigDecimal double
+   * Double double
+   * BigInteger BigInteger
+   * BigDecimal BigDecimal
    * String chararray
    * byte[] DataByteArray (copy)
    * Boolean boolean
@@ -161,9 +163,9 @@ public class GroovyUtils {
     } else if (groovyObject instanceof Byte || groovyObject instanceof Short) {
       pigObject = ((Number) groovyObject).intValue();
     } else if (groovyObject instanceof BigInteger) {
-      pigObject = ((Number) groovyObject).longValue();
+      pigObject = groovyObject;
     } else if (groovyObject instanceof BigDecimal) {
-      pigObject = ((Number) groovyObject).doubleValue();
+      pigObject = groovyObject;
     } else if (groovyObject instanceof byte[]) {
       //
       // Clone the byte array
@@ -204,6 +206,8 @@ public class GroovyUtils {
    * chararray String
    * bytearray byte[] (copy)
    * boolean boolean
+   * BigInteger BigInteger
+   * BigDecimal BigDecimal
    * null null
    *
    * anything else raises an exception
@@ -255,6 +259,10 @@ public class GroovyUtils {
       System.arraycopy(((DataByteArray) pigObject).get(), 0, b, 0, b.length);
 
       groovyObject = b;
+    } else if (pigObject instanceof BigInteger) {
+      groovyObject = pigObject;
+    } else if (pigObject instanceof BigDecimal) {
+      groovyObject = pigObject;
     } else if (null == pigObject) {
       groovyObject = null;
     } else {

Modified: pig/trunk/test/org/apache/pig/test/TestUDFGroovy.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestUDFGroovy.java?rev=1458063&r1=1458062&r2=1458063&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestUDFGroovy.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestUDFGroovy.java Mon Mar 18 23:45:01 2013
@@ -120,6 +120,14 @@ public class TestUDFGroovy {
     assertEquals("Henaff", ((Map) groovyObject).get("Pate"));
     assertEquals("Bordeau Chesnel", ((Map) groovyObject).get("Rillettes"));
 
+    pigObject = BigInteger.ONE;
+    groovyObject = GroovyUtils.pigToGroovy(pigObject);
+    assertSame(pigObject, groovyObject);
+
+    pigObject = new BigDecimal("42.42");
+    groovyObject = GroovyUtils.pigToGroovy(pigObject);
+    assertSame(pigObject, groovyObject);
+
     pigObject = null;
     groovyObject = GroovyUtils.pigToGroovy(pigObject);
     assertNull(groovyObject);
@@ -154,8 +162,7 @@ public class TestUDFGroovy {
 
     groovyObject = BigInteger.TEN;
     pigObject = GroovyUtils.groovyToPig(groovyObject);
-    assertTrue(pigObject instanceof Long);
-    assertEquals(10L, pigObject);
+    assertSame(groovyObject, pigObject);
 
     groovyObject = Float.MIN_NORMAL;
     pigObject = GroovyUtils.groovyToPig(groovyObject);
@@ -169,8 +176,7 @@ public class TestUDFGroovy {
 
     groovyObject = new BigDecimal("42.42");
     pigObject = GroovyUtils.groovyToPig(groovyObject);
-    assertTrue(pigObject instanceof Double);
-    assertEquals(42.42D, pigObject);
+    assertSame(groovyObject, pigObject);
 
     groovyObject = "Dans le cochon tout est bon !";
     pigObject = GroovyUtils.groovyToPig(groovyObject);