You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by na...@apache.org on 2009/08/14 09:48:09 UTC

svn commit: r804106 [24/24] - in /hadoop/hive/trunk: ./ contrib/src/java/org/apache/hadoop/hive/contrib/udaf/ contrib/src/java/org/apache/hadoop/hive/contrib/udaf/example/ contrib/src/java/org/apache/hadoop/hive/contrib/udf/ contrib/src/java/org/apache...

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java Fri Aug 14 07:48:02 2009
@@ -42,13 +42,12 @@
     }
 
     @Override
-    public Object convert(Object o) {
-      if (o == null) {
+    public Object convert(Object input) {
+      if (input == null) {
         return null;
       }
       try {
-        outputOI.set(r, PrimitiveObjectInspectorUtils.getBoolean(o, inputOI));
-        return r;
+        return outputOI.set(r, PrimitiveObjectInspectorUtils.getBoolean(input, inputOI));
       } catch (NumberFormatException e) {
         return null;
       }
@@ -70,13 +69,12 @@
     }
 
     @Override
-    public Object convert(Object o) {
-      if (o == null) {
+    public Object convert(Object input) {
+      if (input == null) {
         return null;
       }
       try {
-        outputOI.set(r, PrimitiveObjectInspectorUtils.getByte(o, inputOI));
-        return r;
+        return outputOI.set(r, PrimitiveObjectInspectorUtils.getByte(input, inputOI));
       } catch (NumberFormatException e) {
         return null;
       }
@@ -98,13 +96,12 @@
     }
 
     @Override
-    public Object convert(Object o) {
-      if (o == null) {
+    public Object convert(Object input) {
+      if (input == null) {
         return null;
       }
       try {
-        outputOI.set(r, PrimitiveObjectInspectorUtils.getShort(o, inputOI));
-        return r;
+        return outputOI.set(r, PrimitiveObjectInspectorUtils.getShort(input, inputOI));
       } catch (NumberFormatException e) {
         return null;
       }
@@ -126,13 +123,12 @@
     }
 
     @Override
-    public Object convert(Object o) {
-      if (o == null) {
+    public Object convert(Object input) {
+      if (input == null) {
         return null;
       }
       try {
-        outputOI.set(r, PrimitiveObjectInspectorUtils.getInt(o, inputOI));
-        return r;
+        return outputOI.set(r, PrimitiveObjectInspectorUtils.getInt(input, inputOI));
       } catch (NumberFormatException e) {
         return null;
       }
@@ -154,13 +150,12 @@
     }
 
     @Override
-    public Object convert(Object o) {
-      if (o == null) {
+    public Object convert(Object input) {
+      if (input == null) {
         return null;
       }
       try {
-        outputOI.set(r, PrimitiveObjectInspectorUtils.getLong(o, inputOI));
-        return r;
+        return outputOI.set(r, PrimitiveObjectInspectorUtils.getLong(input, inputOI));
       } catch (NumberFormatException e) {
         return null;
       }
@@ -182,13 +177,12 @@
     }
 
     @Override
-    public Object convert(Object o) {
-      if (o == null) {
+    public Object convert(Object input) {
+      if (input == null) {
         return null;
       }
       try {
-        outputOI.set(r, PrimitiveObjectInspectorUtils.getFloat(o, inputOI));
-        return r;
+        return outputOI.set(r, PrimitiveObjectInspectorUtils.getFloat(input, inputOI));
       } catch (NumberFormatException e) {
         return null;
       }
@@ -210,13 +204,12 @@
     }
 
     @Override
-    public Object convert(Object o) {
-      if (o == null) {
+    public Object convert(Object input) {
+      if (input == null) {
         return null;
       }
       try {
-        outputOI.set(r, PrimitiveObjectInspectorUtils.getDouble(o, inputOI));
-        return r;
+        return outputOI.set(r, PrimitiveObjectInspectorUtils.getDouble(input, inputOI));
       } catch (NumberFormatException e) {
         return null;
       }
@@ -235,11 +228,12 @@
     static byte[] falseBytes = {'F', 'A', 'L', 'S', 'E'};
     
     public TextConverter(PrimitiveObjectInspector inputOI) {
+      // The output ObjectInspector is writableStringObjectInspector.
       this.inputOI = inputOI;
     }
     
-    public Text convert(Object o)  {
-      if (o == null) {
+    public Text convert(Object input)  {
+      if (input == null) {
         return null;
       }
       
@@ -248,43 +242,43 @@
           return null;
         }
         case BOOLEAN: {
-          t.set(((BooleanObjectInspector)inputOI).get(o) ? trueBytes : falseBytes);
+          t.set(((BooleanObjectInspector)inputOI).get(input) ? trueBytes : falseBytes);
           return t;
         }
         case BYTE: {
           out.reset();
-          LazyInteger.writeUTF8NoException(out, ((ByteObjectInspector)inputOI).get(o));
+          LazyInteger.writeUTF8NoException(out, ((ByteObjectInspector)inputOI).get(input));
           t.set(out.getData(), 0, out.getCount());
           return t;
         }
         case SHORT: {
           out.reset();
-          LazyInteger.writeUTF8NoException(out, ((ShortObjectInspector)inputOI).get(o));
+          LazyInteger.writeUTF8NoException(out, ((ShortObjectInspector)inputOI).get(input));
           t.set(out.getData(), 0, out.getCount());
           return t;
         }
         case INT: {
           out.reset();
-          LazyInteger.writeUTF8NoException(out, ((IntObjectInspector)inputOI).get(o));
+          LazyInteger.writeUTF8NoException(out, ((IntObjectInspector)inputOI).get(input));
           t.set(out.getData(), 0, out.getCount());
           return t;
         }
         case LONG:{
           out.reset();
-          LazyLong.writeUTF8NoException(out, ((LongObjectInspector)inputOI).get(o));
+          LazyLong.writeUTF8NoException(out, ((LongObjectInspector)inputOI).get(input));
           t.set(out.getData(), 0, out.getCount());
           return t;
         }
         case FLOAT: {
-          t.set(String.valueOf(((FloatObjectInspector)inputOI).get(o)));
+          t.set(String.valueOf(((FloatObjectInspector)inputOI).get(input)));
           return t;
         }
         case DOUBLE: {
-          t.set(String.valueOf(((DoubleObjectInspector)inputOI).get(o)));
+          t.set(String.valueOf(((DoubleObjectInspector)inputOI).get(input)));
           return t;
         }
         case STRING: {
-          t.set(((StringObjectInspector)inputOI).getPrimitiveJavaObject(o));
+          t.set(((StringObjectInspector)inputOI).getPrimitiveJavaObject(input));
           return t;
         }
         default: {
@@ -293,5 +287,23 @@
         }
       }
     }
-  }  
+  }
+  
+  /**
+   * A helper class to convert any primitive to String. 
+   */
+  public static class StringConverter implements Converter {
+    PrimitiveObjectInspector inputOI;
+    
+    public StringConverter(PrimitiveObjectInspector inputOI) {
+      // The output ObjectInspector is writableStringObjectInspector.
+      this.inputOI = inputOI;
+    }
+
+    @Override
+    public Object convert(Object input) {
+      return PrimitiveObjectInspectorUtils.getString(input, inputOI);
+    }
+  }    
+  
 }

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java Fri Aug 14 07:48:02 2009
@@ -124,10 +124,8 @@
   public static final PrimitiveTypeEntry byteTypeEntry = new PrimitiveTypeEntry(PrimitiveCategory.BYTE, Constants.TINYINT_TYPE_NAME, Byte.TYPE, Byte.class, ByteWritable.class);
   public static final PrimitiveTypeEntry shortTypeEntry = new PrimitiveTypeEntry(PrimitiveCategory.SHORT, Constants.SMALLINT_TYPE_NAME, Short.TYPE, Short.class, ShortWritable.class);
 
-  // Following 3 are complex types for special handling
+  // The following is a complex type for special handling
   public static final PrimitiveTypeEntry unknownTypeEntry = new PrimitiveTypeEntry(PrimitiveCategory.UNKNOWN, "unknown", null, Object.class, null);
-  public static final PrimitiveTypeEntry unknownMapTypeEntry = new PrimitiveTypeEntry(PrimitiveCategory.UNKNOWN, Constants.MAP_TYPE_NAME, null, Map.class, null);
-  public static final PrimitiveTypeEntry unknownListTypeEntry = new PrimitiveTypeEntry(PrimitiveCategory.UNKNOWN, Constants.LIST_TYPE_NAME, null, List.class, null);
   
   static {
     registerType(stringTypeEntry);
@@ -140,8 +138,6 @@
     registerType(byteTypeEntry);
     registerType(shortTypeEntry);
     registerType(unknownTypeEntry);
-    registerType(unknownMapTypeEntry);
-    registerType(unknownListTypeEntry);
   }
 
   /**
@@ -604,4 +600,62 @@
   }
 
 
+  /**
+   * Get the String value out of a primitive object. 
+   * Note that NullPointerException will be thrown if o is null.
+   * Note that NumberFormatException will be thrown if o is not a valid number.
+   */
+  public static String getString(Object o, PrimitiveObjectInspector oi) throws NumberFormatException {
+    
+    if (o == null) {
+      return null;
+    }
+    
+    String result = null;
+    switch (oi.getPrimitiveCategory()) {
+      case VOID: {
+        result = null;
+        break;
+      }
+      case BOOLEAN: {
+        result = String.valueOf((((BooleanObjectInspector)oi).get(o)));
+        break;
+      }
+      case BYTE: {
+        result = String.valueOf((((ByteObjectInspector)oi).get(o)));
+        break;
+      }
+      case SHORT: {
+        result = String.valueOf((((ShortObjectInspector)oi).get(o)));
+        break;
+      }
+      case INT: {
+        result = String.valueOf((((IntObjectInspector)oi).get(o)));
+        break;
+      }
+      case LONG: {
+        result = String.valueOf((((LongObjectInspector)oi).get(o)));
+        break;
+      }
+      case FLOAT: {
+        result = String.valueOf((((FloatObjectInspector)oi).get(o)));
+        break;
+      }
+      case DOUBLE: {
+        result = String.valueOf((((DoubleObjectInspector)oi).get(o)));
+        break;
+      }
+      case STRING: {
+        StringObjectInspector soi = (StringObjectInspector)oi;
+        result = soi.getPrimitiveJavaObject(o);
+        break;
+      }
+      default: {
+        throw new RuntimeException("Hive 2 Internal error: unknown type: "
+            + oi.getTypeName());
+      }
+    }
+    return result;
+  }    
+  
 }

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableBooleanObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableBooleanObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableBooleanObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableBooleanObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -24,9 +24,12 @@
 public interface SettableBooleanObjectInspector extends BooleanObjectInspector {
 
   /**
-   * Set the object with the value. 
+   * Set the object with the value. Return the object that has the new value.
+   * 
+   * In most cases the returned value should be the same as o, but in case 
+   * o is unmodifiable, this will return a new object with new value.    
    */
-  public void set(Object o, boolean value);
+  public Object set(Object o, boolean value);
   
   /**
    * Create an object with the value.

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableByteObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableByteObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableByteObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableByteObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -24,9 +24,12 @@
 public interface SettableByteObjectInspector extends ByteObjectInspector {
 
   /**
-   * Set the object with the value. 
+   * Set the object with the value. Return the object that has the new value.
+   * 
+   * In most cases the returned value should be the same as o, but in case 
+   * o is unmodifiable, this will return a new object with new value.    
    */
-  public void set(Object o, byte value);
+  public Object set(Object o, byte value);
   
   /**
    * Create an object with the value.

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableDoubleObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableDoubleObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableDoubleObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableDoubleObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -24,9 +24,12 @@
 public interface SettableDoubleObjectInspector extends DoubleObjectInspector {
 
   /**
-   * Set the object with the value. 
+   * Set the object with the value. Return the object that has the new value.
+   * 
+   * In most cases the returned value should be the same as o, but in case 
+   * o is unmodifiable, this will return a new object with new value.    
    */
-  public void set(Object o, double value);
+  public Object set(Object o, double value);
   
   /**
    * Create an object with the value.

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableFloatObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableFloatObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableFloatObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableFloatObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -24,9 +24,12 @@
 public interface SettableFloatObjectInspector extends FloatObjectInspector {
 
   /**
-   * Set the object with the value. 
+   * Set the object with the value. Return the object that has the new value.
+   * 
+   * In most cases the returned value should be the same as o, but in case 
+   * o is unmodifiable, this will return a new object with new value.    
    */
-  public void set(Object o, float value);
+  public Object set(Object o, float value);
   
   /**
    * Create an object with the value.

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableIntObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableIntObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableIntObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableIntObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -24,9 +24,12 @@
 public interface SettableIntObjectInspector extends IntObjectInspector {
 
   /**
-   * Set the object with the value. 
+   * Set the object with the value. Return the object that has the new value.
+   * 
+   * In most cases the returned value should be the same as o, but in case 
+   * o is unmodifiable, this will return a new object with new value.    
    */
-  public void set(Object o, int value);
+  public Object set(Object o, int value);
   
   /**
    * Create an object with the value.

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableLongObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableLongObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableLongObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableLongObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -24,9 +24,12 @@
 public interface SettableLongObjectInspector extends LongObjectInspector {
 
   /**
-   * Set the object with the value. 
+   * Set the object with the value. Return the object that has the new value.
+   * 
+   * In most cases the returned value should be the same as o, but in case 
+   * o is unmodifiable, this will return a new object with new value.    
    */
-  public void set(Object o, long value);
+  public Object set(Object o, long value);
   
   /**
    * Create an object with the value.

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableShortObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableShortObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableShortObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableShortObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -24,9 +24,12 @@
 public interface SettableShortObjectInspector extends ShortObjectInspector {
 
   /**
-   * Set the object with the value. 
+   * Set the object with the value. Return the object that has the new value.
+   * 
+   * In most cases the returned value should be the same as o, but in case 
+   * o is unmodifiable, this will return a new object with new value.    
    */
-  public void set(Object o, short value);
+  public Object set(Object o, short value);
   
   /**
    * Create an object with the value.

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableStringObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableStringObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableStringObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableStringObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -26,14 +26,20 @@
 public interface SettableStringObjectInspector extends StringObjectInspector {
 
   /**
-   * Set the object with the value. 
+   * Set the object with the value. Return the object that has the new value.
+   * 
+   * In most cases the returned value should be the same as o, but in case 
+   * o is unmodifiable, this will return a new object with new value.    
    */
-  public void set(Object o, Text value);
+  public Object set(Object o, Text value);
   
   /**
-   * Set the object with the value. 
+   * Set the object with the value. Return the object that has the new value.
+   * 
+   * In most cases the returned value should be the same as o, but in case 
+   * o is unmodifiable, this will return a new object with new value.    
    */
-  public void set(Object o, String value);
+  public Object set(Object o, String value);
   
   /**
    * Create an object with the value.

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableBooleanObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableBooleanObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableBooleanObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableBooleanObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -51,7 +51,8 @@
   }
 
   @Override
-  public void set(Object o, boolean value) {
+  public Object set(Object o, boolean value) {
     ((BooleanWritable)o).set(value);
+    return o;
   }
 }

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableByteObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableByteObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableByteObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableByteObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -52,7 +52,8 @@
   }
 
   @Override
-  public void set(Object o, byte value) {
+  public Object set(Object o, byte value) {
     ((ByteWritable)o).set(value);
+    return o;
   }
 }

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableDoubleObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableDoubleObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableDoubleObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableDoubleObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -52,8 +52,9 @@
   }
 
   @Override
-  public void set(Object o, double value) {
+  public Object set(Object o, double value) {
     ((DoubleWritable)o).set(value);
+    return o;
   }
   
 }

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableFloatObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableFloatObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableFloatObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableFloatObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -51,7 +51,8 @@
   }
 
   @Override
-  public void set(Object o, float value) {
+  public Object set(Object o, float value) {
     ((FloatWritable)o).set(value);
+    return o;
   }
 }

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableIntObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableIntObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableIntObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableIntObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -52,7 +52,8 @@
   }
 
   @Override
-  public void set(Object o, int value) {
+  public Object set(Object o, int value) {
     ((IntWritable)o).set(value);
+    return o;
   }
 }

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableLongObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableLongObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableLongObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableLongObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -52,8 +52,9 @@
   }
 
   @Override
-  public void set(Object o, long value) {
+  public Object set(Object o, long value) {
     ((LongWritable)o).set(value);
+    return o;
   }
   
 }

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableShortObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableShortObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableShortObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableShortObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -18,8 +18,6 @@
 package org.apache.hadoop.hive.serde2.objectinspector.primitive;
 
 import org.apache.hadoop.hive.serde2.io.ShortWritable;
-import org.apache.hadoop.io.LongWritable;
-
 
 /**
  * A WritableShortObjectInspector inspects a ShortWritable Object.
@@ -52,8 +50,9 @@
   }
 
   @Override
-  public void set(Object o, short value) {
+  public Object set(Object o, short value) {
     ((ShortWritable)o).set(value);
+    return o;
   }
   
 }

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableStringObjectInspector.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableStringObjectInspector.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableStringObjectInspector.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableStringObjectInspector.java Fri Aug 14 07:48:02 2009
@@ -64,19 +64,21 @@
   }
 
   @Override
-  public void set(Object o, Text value) {
+  public Object set(Object o, Text value) {
     Text r = (Text)o;
     if (value != null) {
       r.set(value);
     }
+    return o;
   }
 
   @Override
-  public void set(Object o, String value) {
+  public Object set(Object o, String value) {
     Text r = (Text)o;
     if (value != null) {
       r.set(value);
     }
+    return o;
   }
 
 }

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoFactory.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoFactory.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoFactory.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoFactory.java Fri Aug 14 07:48:02 2009
@@ -63,8 +63,6 @@
   public static final TypeInfo shortTypeInfo = getPrimitiveTypeInfo(Constants.SMALLINT_TYPE_NAME);
 
   public static final TypeInfo unknownTypeInfo = getPrimitiveTypeInfo("unknown");
-  public static final TypeInfo unknownMapTypeInfo = getPrimitiveTypeInfo(Constants.MAP_TYPE_NAME);
-  public static final TypeInfo unknownListTypeInfo = getPrimitiveTypeInfo(Constants.LIST_TYPE_NAME);
   
   public static TypeInfo getPrimitiveTypeInfoFromPrimitiveWritable(Class<?> clazz) {
     String typeName = PrimitiveObjectInspectorUtils.getTypeNameFromPrimitiveWritable(clazz);

Modified: hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java (original)
+++ hadoop/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java Fri Aug 14 07:48:02 2009
@@ -1,6 +1,10 @@
 package org.apache.hadoop.hive.serde2.typeinfo;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.GenericArrayType;
 import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -22,24 +26,131 @@
 
 public class TypeInfoUtils {
   
+  /**
+   * Return the extended TypeInfo from a Java type.
+   * By extended TypeInfo, we allow unknownType for java.lang.Object.
+   * @param t  The Java type.
+   * @param m  The method, only used for generating error messages.
+   */
+  private static TypeInfo getExtendedTypeInfoFromJavaType(Type t, Method m) {
+
+    if (t == Object.class) {
+      return TypeInfoFactory.unknownTypeInfo; 
+    }
+    
+    if (t instanceof ParameterizedType) {
+      ParameterizedType pt = (ParameterizedType)t;
+      // List?
+      if (List.class == (Class<?>)pt.getRawType()
+          || ArrayList.class == (Class<?>)pt.getRawType()) {
+        return TypeInfoFactory.getListTypeInfo(
+            getExtendedTypeInfoFromJavaType(pt.getActualTypeArguments()[0], m)); 
+      }
+      // Map?
+      if (Map.class == (Class<?>)pt.getRawType()
+          || HashMap.class == (Class<?>)pt.getRawType()) {
+        return TypeInfoFactory.getMapTypeInfo( 
+            getExtendedTypeInfoFromJavaType(pt.getActualTypeArguments()[0], m),
+            getExtendedTypeInfoFromJavaType(pt.getActualTypeArguments()[1], m));
+      }
+      // Otherwise convert t to RawType so we will fall into the following if block.
+      t = pt.getRawType();
+    }
+    
+    // Must be a class.
+    if (!(t instanceof Class)) {
+      throw new RuntimeException("Hive does not understand type " + t + " from " + m); 
+    }
+    Class<?> c = (Class<?>)t;
+    
+    // Java Primitive Type?
+    if (PrimitiveObjectInspectorUtils.isPrimitiveJavaType(c)) {
+      return TypeInfoUtils.getTypeInfoFromObjectInspector(
+          PrimitiveObjectInspectorFactory.getPrimitiveJavaObjectInspector(
+          PrimitiveObjectInspectorUtils.getTypeEntryFromPrimitiveJavaType(c).primitiveCategory));
+    }
+
+    // Java Primitive Class?
+    if (PrimitiveObjectInspectorUtils.isPrimitiveJavaClass(c)) {
+      return TypeInfoUtils.getTypeInfoFromObjectInspector(
+          PrimitiveObjectInspectorFactory.getPrimitiveJavaObjectInspector(
+          PrimitiveObjectInspectorUtils.getTypeEntryFromPrimitiveJavaClass(c).primitiveCategory));
+    }
+    
+    // Primitive Writable class?
+    if (PrimitiveObjectInspectorUtils.isPrimitiveWritableClass(c)) {
+      return TypeInfoUtils.getTypeInfoFromObjectInspector(
+          PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector(
+          PrimitiveObjectInspectorUtils.getTypeEntryFromPrimitiveWritableClass(c).primitiveCategory));
+    }
+    
+    // Must be a struct
+    Field[] fields = ObjectInspectorUtils.getDeclaredNonStaticFields(c);
+    ArrayList<String> fieldNames = new ArrayList<String>(fields.length);
+    ArrayList<TypeInfo> fieldTypeInfos = new ArrayList<TypeInfo>(fields.length);
+    for(int i=0; i<fields.length; i++) {
+      fieldNames.add(fields[i].getName());
+      fieldTypeInfos.add(getExtendedTypeInfoFromJavaType(fields[i].getGenericType(), m));
+    }
+    return TypeInfoFactory.getStructTypeInfo(fieldNames, fieldTypeInfos);
+  }
   
-  public static List<TypeInfo> getParameterTypeInfos(Method m) {
-    Class<?>[] parameterTypes = m.getParameterTypes();
-    List<TypeInfo> typeInfos = new ArrayList<TypeInfo>(parameterTypes.length);
-    for (int i=0; i<parameterTypes.length; i++) {
-      if (PrimitiveObjectInspectorUtils.isPrimitiveWritableClass(parameterTypes[i])) {
-        typeInfos.add(TypeInfoFactory.getPrimitiveTypeInfoFromPrimitiveWritable(parameterTypes[i]));
-      } else if (PrimitiveObjectInspectorUtils.isPrimitiveJavaClass(parameterTypes[i])
-          || PrimitiveObjectInspectorUtils.isPrimitiveJavaType(parameterTypes[i])) {
-          typeInfos.add(TypeInfoFactory.getPrimitiveTypeInfoFromJavaPrimitive(parameterTypes[i]));
-      } else if (Map.class.isAssignableFrom(parameterTypes[i])) {
-        typeInfos.add(TypeInfoFactory.unknownMapTypeInfo);
-      } else if (List.class.isAssignableFrom(parameterTypes[i])) {
-        typeInfos.add(TypeInfoFactory.unknownListTypeInfo);
-      } else if (parameterTypes[i].equals(Object.class)){
-        typeInfos.add(TypeInfoFactory.unknownTypeInfo);
-      } else {
-        throw new RuntimeException("Hive does not understand type " + parameterTypes[i] + " from " + m);
+  /**
+   * Returns the array element type, if the Type is an array (Object[]),
+   * or GenericArrayType (Map<String,String>[]). Otherwise return null.
+   */
+  public static Type getArrayElementType(Type t) {
+    if (t instanceof Class
+        && ((Class<?>)t).isArray()) {
+      Class<?> arrayClass = (Class<?>)t;
+      return arrayClass.getComponentType();
+    } else if (t instanceof GenericArrayType) {
+      GenericArrayType arrayType = (GenericArrayType)t;
+      return arrayType.getGenericComponentType();
+    }
+    return null;
+  }
+  
+  /**
+   * Get the parameter TypeInfo for a method.
+   * @param size In case the last parameter of Method is an array, we will try to return a 
+   *             List<TypeInfo> with the specified size by repeating the element of the array
+   *             at the end.
+   *             In case the size is smaller than the minimum possible number of arguments 
+   *             for the method, null will be returned. 
+   */
+  public static List<TypeInfo> getParameterTypeInfos(Method m, int size) {
+    Type[] methodParameterTypes = m.getGenericParameterTypes();
+    
+    // Whether the method takes variable-length arguments
+    // Whether the method takes an array like Object[], 
+    // or String[] etc in the last argument.
+    Type lastParaElementType = TypeInfoUtils.getArrayElementType(
+        methodParameterTypes.length == 0 ? null :
+        methodParameterTypes[methodParameterTypes.length-1]);
+    boolean isVariableLengthArgument = (lastParaElementType != null);
+    
+    List<TypeInfo> typeInfos = null;
+    if (!isVariableLengthArgument) {
+      // Normal case, no variable-length arguments
+      if (size != methodParameterTypes.length) {
+        return null;
+      }
+      typeInfos = new ArrayList<TypeInfo>(methodParameterTypes.length);
+      for (int i = 0; i < methodParameterTypes.length; i++) {
+        typeInfos.add(getExtendedTypeInfoFromJavaType(methodParameterTypes[i], m));
+      }
+    } else {
+      // Variable-length arguments
+      if (size < methodParameterTypes.length - 1) {
+        return null;
+      }
+      typeInfos = new ArrayList<TypeInfo>(size);
+      for (int i = 0; i < methodParameterTypes.length - 1; i++) {
+        typeInfos.add(getExtendedTypeInfoFromJavaType(methodParameterTypes[i], m));
+      }
+      for (int i = methodParameterTypes.length - 1; i < size; i++) {
+        typeInfos.add(getExtendedTypeInfoFromJavaType(lastParaElementType, m));
       }
     }
     return typeInfos;

Modified: hadoop/hive/trunk/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestStandardObjectInspectors.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestStandardObjectInspectors.java?rev=804106&r1=804105&r2=804106&view=diff
==============================================================================
--- hadoop/hive/trunk/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestStandardObjectInspectors.java (original)
+++ hadoop/hive/trunk/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestStandardObjectInspectors.java Fri Aug 14 07:48:02 2009
@@ -151,6 +151,20 @@
       assertEquals(3, loi1.getListElement(list, 3));
       assertNull(loi1.getListElement(list, -1));
       assertNull(loi1.getListElement(list, 4));
+      
+      // Settable
+      Object list4 = loi1.create(4);
+      loi1.set(list4, 0, 0);
+      loi1.set(list4, 1, 1);
+      loi1.set(list4, 2, 2);
+      loi1.set(list4, 3, 3);
+      assertEquals(list, list4);
+      
+      loi1.resize(list4, 5);
+      loi1.set(list4, 4, 4);
+      loi1.resize(list4, 4);
+      assertEquals(list, list4);
+      
     } catch (Throwable e) {
       e.printStackTrace();
       throw e;
@@ -199,6 +213,16 @@
       assertEquals(3, moi1.getMapValueElement(map, "three"));
       assertNull(moi1.getMapValueElement(map, null));
       assertNull(moi1.getMapValueElement(map, "null"));
+      
+      // Settable
+      Object map3 = moi1.create();
+      moi1.put(map3, "one", 1);
+      moi1.put(map3, "two", 2);
+      moi1.put(map3, "three", 3);
+      assertEquals(map, map3);
+      moi1.clear(map3);
+      assertEquals(0, moi1.getMapSize(map3));
+      
     } catch (Throwable e) {
       e.printStackTrace();
       throw e;
@@ -260,6 +284,15 @@
       assertEquals(1, soi1.getStructFieldData(struct, fields.get(0)));
       assertEquals("two", soi1.getStructFieldData(struct, fields.get(1)));
       assertEquals(true, soi1.getStructFieldData(struct, fields.get(2)));
+      
+      // Settable
+      Object struct3 = soi1.create();
+      System.out.println(struct3);
+      soi1.setStructFieldData(struct3, fields.get(0), 1);
+      soi1.setStructFieldData(struct3, fields.get(1), "two");
+      soi1.setStructFieldData(struct3, fields.get(2), true);
+      assertEquals(struct, struct3);
+      
     } catch (Throwable e) {
       e.printStackTrace();
       throw e;