Author: jvs
Date: Tue Oct 11 03:36:50 2011
New Revision: 1181615

URL: http://svn.apache.org/viewvc?rev=1181615&view=rev
Log:
HIVE-2470. Improve support for Constant Object Inspectors
(Jonathan Chang via jvs)


Added:
    hive/trunk/ql/src/test/queries/clientpositive/constant_prop.q
    hive/trunk/ql/src/test/results/clientpositive/constant_prop.q.out
    
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantListObjectInspector.java
    
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantMapObjectInspector.java
    
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantTimestampObjectInspector.java
Removed:
    
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantVoidObjectInspector.java
Modified:
    
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeGenericFuncEvaluator.java
    
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeGenericFuncDesc.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDF.java
    
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFEWAHBitmapEmpty.java
    
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUtils.java
    hive/trunk/ql/src/test/results/clientpositive/str_to_map.q.out
    
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorFactory.java
    
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java
    
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorFactory.java
    
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantByteObjectInspector.java
    
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableVoidObjectInspector.java

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeGenericFuncEvaluator.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeGenericFuncEvaluator.java?rev=1181615&r1=1181614&r2=1181615&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeGenericFuncEvaluator.java
 (original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeGenericFuncEvaluator.java
 Tue Oct 11 03:36:50 2011
@@ -26,7 +26,9 @@ import org.apache.hadoop.hive.ql.plan.Ex
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFCase;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFWhen;
+import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
 
 /**
  * ExprNodeGenericFuncEvaluator.
@@ -41,6 +43,7 @@ public class ExprNodeGenericFuncEvaluato
 
   transient GenericUDF genericUDF;
   transient Object rowObject;
+  transient ObjectInspector outputOI;
   transient ExprNodeEvaluator[] children;
   transient GenericUDF.DeferredObject[] deferredChildren;
   transient boolean isEager;
@@ -130,12 +133,17 @@ public class ExprNodeGenericFuncEvaluato
       throw new HiveException(
         "Stateful expressions cannot be used inside of CASE");
     }
-    return genericUDF.initialize(childrenOIs);
+    this.outputOI = genericUDF.initializeAndFoldConstants(childrenOIs);
+    return this.outputOI;
   }
 
   @Override
   public Object evaluate(Object row) throws HiveException {
     rowObject = row;
+    if (ObjectInspectorUtils.isConstantObjectInspector(outputOI)) {
+      // The output of this UDF is constant, so don't even bother evaluating.
+      return ((ConstantObjectInspector)outputOI).getWritableConstantValue();
+    }
     if (isEager) {
       for (int i = 0; i < deferredChildren.length; i++) {
         ((EagerExprObject) deferredChildren[i]).evaluate();

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeGenericFuncDesc.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeGenericFuncDesc.java?rev=1181615&r1=1181614&r2=1181615&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeGenericFuncDesc.java
 (original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeGenericFuncDesc.java
 Tue Oct 11 03:36:50 2011
@@ -36,6 +36,7 @@ import org.apache.hadoop.hive.ql.udf.gen
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFBaseCompare;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
@@ -60,16 +61,34 @@ public class ExprNodeGenericFuncDesc ext
    */
   private GenericUDF genericUDF;
   private List<ExprNodeDesc> childExprs;
+  /**
+   * This class uses a writableObjectInspector rather than a TypeInfo to store
+   * the canonical type information for this NodeDesc.
+   */
+  private ObjectInspector writableObjectInspector;
 
   public ExprNodeGenericFuncDesc() {
   }
 
   public ExprNodeGenericFuncDesc(TypeInfo typeInfo, GenericUDF genericUDF,
       List<ExprNodeDesc> children) {
-    super(typeInfo);
+    
this(TypeInfoUtils.getStandardWritableObjectInspectorFromTypeInfo(typeInfo),
+         genericUDF, children);
+  }
+
+  public ExprNodeGenericFuncDesc(ObjectInspector oi, GenericUDF genericUDF,
+      List<ExprNodeDesc> children) {
+    super(TypeInfoUtils.getTypeInfoFromObjectInspector(oi));
+    this.writableObjectInspector =
+        ObjectInspectorUtils.getWritableObjectInspector(oi);
     assert (genericUDF != null);
     this.genericUDF = genericUDF;
-    childExprs = children;
+    this.childExprs = children;
+  }
+
+  @Override
+  public ObjectInspector getWritableObjectInspector() {
+    return writableObjectInspector;
   }
 
   public GenericUDF getGenericUDF() {
@@ -190,9 +209,8 @@ public class ExprNodeGenericFuncDesc ext
       }
     }
 
-    ObjectInspector oi = genericUDF.initialize(childrenOIs);
-    return new ExprNodeGenericFuncDesc(TypeInfoUtils
-        .getTypeInfoFromObjectInspector(oi), genericUDF, children);
+    ObjectInspector oi = genericUDF.initializeAndFoldConstants(childrenOIs);
+    return new ExprNodeGenericFuncDesc(oi, genericUDF, children);
   }
 
   @Override

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDF.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDF.java?rev=1181615&r1=1181614&r2=1181615&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDF.java 
(original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDF.java 
Tue Oct 11 03:36:50 2011
@@ -18,16 +18,19 @@
 
 package org.apache.hadoop.hive.ql.udf.generic;
 
+import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
 import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.udf.UDFType;
+import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
 
 /**
  * A Generic User-defined function (GenericUDF) for the use with Hive.
- * 
+ *
  * New GenericUDF classes need to inherit from this GenericUDF class.
- * 
+ *
  * The GenericUDF are superior to normal UDFs in the following ways: 1. It can
  * accept arguments of complex types, and return complex types. 2. It can 
accept
  * variable length of arguments. 3. It can accept an infinite number of 
function
@@ -47,6 +50,23 @@ public abstract class GenericUDF {
   };
 
   /**
+   * A basic dummy implementation of DeferredObject which just stores a Java
+   * Object reference.
+   */
+  public static class DeferredJavaObject implements DeferredObject {
+    private Object value;
+
+    public DeferredJavaObject(Object value) {
+      this.value = value;
+    }
+
+    @Override
+    public Object get() throws HiveException {
+      return value;
+    }
+  }
+
+  /**
    * The constructor.
    */
   public GenericUDF() {
@@ -66,8 +86,49 @@ public abstract class GenericUDF {
       throws UDFArgumentException;
 
   /**
+   * Initialize this GenericUDF.  Additionally, if the arguments are constant
+   * and the function is eligible to be folded, then the constant value
+   * returned by this UDF will be computed and stored in the
+   * ConstantObjectInspector returned.  Otherwise, the function behaves exactly
+   * like initialize().
+   */
+  public ObjectInspector initializeAndFoldConstants(ObjectInspector[] 
arguments)
+      throws UDFArgumentException {
+
+    ObjectInspector oi = initialize(arguments);
+
+    boolean allConstant = true;
+    for (int ii = 0; ii < arguments.length; ++ii) {
+      if (!ObjectInspectorUtils.isConstantObjectInspector(arguments[ii])) {
+        allConstant = false;
+        break;
+      }
+    }
+
+    if (allConstant &&
+        !ObjectInspectorUtils.isConstantObjectInspector(oi) &&
+        FunctionRegistry.isDeterministic(this) &&
+        !FunctionRegistry.isStateful(this) &&
+        ObjectInspectorUtils.supportsConstantObjectInspector(oi)) {
+      DeferredObject[] argumentValues =
+        new DeferredJavaObject[arguments.length];
+      for (int ii = 0; ii < arguments.length; ++ii) {
+        argumentValues[ii] = new DeferredJavaObject(
+            
((ConstantObjectInspector)arguments[ii]).getWritableConstantValue());
+      }
+      try {
+        Object constantValue = evaluate(argumentValues);
+        oi = ObjectInspectorUtils.getConstantObjectInspector(oi, 
constantValue);
+      } catch (HiveException e) {
+        throw new UDFArgumentException(e);
+      }
+    }
+    return oi;
+  }
+
+  /**
    * Evaluate the GenericUDF with the arguments.
-   * 
+   *
    * @param arguments
    *          The arguments as DeferedObject, use DeferedObject.get() to get 
the
    *          actual argument Object. The Objects can be inspected by the

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFEWAHBitmapEmpty.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFEWAHBitmapEmpty.java?rev=1181615&r1=1181614&r2=1181615&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFEWAHBitmapEmpty.java
 (original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFEWAHBitmapEmpty.java
 Tue Oct 11 03:36:50 2011
@@ -67,7 +67,7 @@ public ObjectInspector initialize(Object
 
   @Override
   public Object evaluate(DeferredObject[] arguments) throws HiveException {
-    assert (arguments.length == 2);
+    assert (arguments.length == 1);
     Object b = arguments[0].get();
 
     ListObjectInspector lloi = (ListObjectInspector) bitmapOI;

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUtils.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUtils.java?rev=1181615&r1=1181614&r2=1181615&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUtils.java
 (original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUtils.java
 Tue Oct 11 03:36:50 2011
@@ -97,8 +97,11 @@ public final class GenericUDFUtils {
       }
 
       if (returnObjectInspector == null) {
-        // The first argument, just set it.
-        returnObjectInspector = oi;
+        // The first argument, just set the return to be the standard
+        // writable version of this OI.
+        returnObjectInspector = ObjectInspectorUtils
+            .getStandardObjectInspector(oi,
+            ObjectInspectorCopyOption.WRITABLE);
         return true;
       }
 

Added: hive/trunk/ql/src/test/queries/clientpositive/constant_prop.q
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/constant_prop.q?rev=1181615&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/constant_prop.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/constant_prop.q Tue Oct 11 
03:36:50 2011
@@ -0,0 +1,20 @@
+EXPLAIN
+SELECT NAMED_STRUCT(
+         IF(ARRAY_CONTAINS(ARRAY(1, 2), 3), "F1", "B1"), 1,
+         IF(ARRAY_CONTAINS(MAP_KEYS(MAP("b", "x")), "b"), "F2", "B2"), 2   
+       ),
+       NAMED_STRUCT(
+         IF(ARRAY_CONTAINS(ARRAY(1, 2), 3), "F1", "B1"), 1,
+         IF(ARRAY_CONTAINS(MAP_KEYS(MAP("b", "x")), "b"), "F2", "B2"), 2   
+       ).F2
+       FROM src LIMIT 1;
+
+SELECT NAMED_STRUCT(
+         IF(ARRAY_CONTAINS(ARRAY(1, 2), 3), "F1", "B1"), 1,
+         IF(ARRAY_CONTAINS(MAP_KEYS(MAP("b", "x")), "b"), "F2", "B2"), 2   
+       ),
+       NAMED_STRUCT(
+         IF(ARRAY_CONTAINS(ARRAY(1, 2), 3), "F1", "B1"), 1,
+         IF(ARRAY_CONTAINS(MAP_KEYS(MAP("b", "x")), "b"), "F2", "B2"), 2   
+       ).F2
+       FROM src LIMIT 1;

Added: hive/trunk/ql/src/test/results/clientpositive/constant_prop.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/constant_prop.q.out?rev=1181615&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/constant_prop.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/constant_prop.q.out Tue Oct 
11 03:36:50 2011
@@ -0,0 +1,81 @@
+PREHOOK: query: EXPLAIN
+SELECT NAMED_STRUCT(
+         IF(ARRAY_CONTAINS(ARRAY(1, 2), 3), "F1", "B1"), 1,
+         IF(ARRAY_CONTAINS(MAP_KEYS(MAP("b", "x")), "b"), "F2", "B2"), 2   
+       ),
+       NAMED_STRUCT(
+         IF(ARRAY_CONTAINS(ARRAY(1, 2), 3), "F1", "B1"), 1,
+         IF(ARRAY_CONTAINS(MAP_KEYS(MAP("b", "x")), "b"), "F2", "B2"), 2   
+       ).F2
+       FROM src LIMIT 1
+PREHOOK: type: QUERY
+POSTHOOK: query: EXPLAIN
+SELECT NAMED_STRUCT(
+         IF(ARRAY_CONTAINS(ARRAY(1, 2), 3), "F1", "B1"), 1,
+         IF(ARRAY_CONTAINS(MAP_KEYS(MAP("b", "x")), "b"), "F2", "B2"), 2   
+       ),
+       NAMED_STRUCT(
+         IF(ARRAY_CONTAINS(ARRAY(1, 2), 3), "F1", "B1"), 1,
+         IF(ARRAY_CONTAINS(MAP_KEYS(MAP("b", "x")), "b"), "F2", "B2"), 2   
+       ).F2
+       FROM src LIMIT 1
+POSTHOOK: type: QUERY
+ABSTRACT SYNTAX TREE:
+  (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME src))) (TOK_INSERT 
(TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION 
NAMED_STRUCT (TOK_FUNCTION IF (TOK_FUNCTION ARRAY_CONTAINS (TOK_FUNCTION ARRAY 
1 2) 3) "F1" "B1") 1 (TOK_FUNCTION IF (TOK_FUNCTION ARRAY_CONTAINS 
(TOK_FUNCTION MAP_KEYS (TOK_FUNCTION MAP "b" "x")) "b") "F2" "B2") 2)) 
(TOK_SELEXPR (. (TOK_FUNCTION NAMED_STRUCT (TOK_FUNCTION IF (TOK_FUNCTION 
ARRAY_CONTAINS (TOK_FUNCTION ARRAY 1 2) 3) "F1" "B1") 1 (TOK_FUNCTION IF 
(TOK_FUNCTION ARRAY_CONTAINS (TOK_FUNCTION MAP_KEYS (TOK_FUNCTION MAP "b" "x")) 
"b") "F2" "B2") 2) F2))) (TOK_LIMIT 1)))
+
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Alias -> Map Operator Tree:
+        src 
+          TableScan
+            alias: src
+            Select Operator
+              expressions:
+                    expr: named_struct(if(array_contains(array(1,2), 3), 'F1', 
'B1'),1,if(array_contains(map_keys(map('b':'x')), 'b'), 'F2', 'B2'),2)
+                    type: struct<b1:int,f2:int>
+                    expr: named_struct(if(array_contains(array(1,2), 3), 'F1', 
'B1'),1,if(array_contains(map_keys(map('b':'x')), 'b'), 'F2', 'B2'),2).F2
+                    type: int
+              outputColumnNames: _col0, _col1
+              Limit
+                File Output Operator
+                  compressed: false
+                  GlobalTableId: 0
+                  table:
+                      input format: org.apache.hadoop.mapred.TextInputFormat
+                      output format: 
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: 1
+
+
+PREHOOK: query: SELECT NAMED_STRUCT(
+         IF(ARRAY_CONTAINS(ARRAY(1, 2), 3), "F1", "B1"), 1,
+         IF(ARRAY_CONTAINS(MAP_KEYS(MAP("b", "x")), "b"), "F2", "B2"), 2   
+       ),
+       NAMED_STRUCT(
+         IF(ARRAY_CONTAINS(ARRAY(1, 2), 3), "F1", "B1"), 1,
+         IF(ARRAY_CONTAINS(MAP_KEYS(MAP("b", "x")), "b"), "F2", "B2"), 2   
+       ).F2
+       FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: 
file:/var/folders/C4/C40caRNsEM4C4yVangruonVUe7Y/-Tmp-/jonchang/hive_2011-09-27_14-38-28_158_1791133651106020479/-mr-10000
+POSTHOOK: query: SELECT NAMED_STRUCT(
+         IF(ARRAY_CONTAINS(ARRAY(1, 2), 3), "F1", "B1"), 1,
+         IF(ARRAY_CONTAINS(MAP_KEYS(MAP("b", "x")), "b"), "F2", "B2"), 2   
+       ),
+       NAMED_STRUCT(
+         IF(ARRAY_CONTAINS(ARRAY(1, 2), 3), "F1", "B1"), 1,
+         IF(ARRAY_CONTAINS(MAP_KEYS(MAP("b", "x")), "b"), "F2", "B2"), 2   
+       ).F2
+       FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: 
file:/var/folders/C4/C40caRNsEM4C4yVangruonVUe7Y/-Tmp-/jonchang/hive_2011-09-27_14-38-28_158_1791133651106020479/-mr-10000
+{"b1":1,"f2":2}        2

Modified: hive/trunk/ql/src/test/results/clientpositive/str_to_map.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/str_to_map.q.out?rev=1181615&r1=1181614&r2=1181615&view=diff
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/str_to_map.q.out (original)
+++ hive/trunk/ql/src/test/results/clientpositive/str_to_map.q.out Tue Oct 11 
03:36:50 2011
@@ -48,11 +48,11 @@ STAGE PLANS:
 PREHOOK: query: select str_to_map('a=1,b=2,c=3',',','=')['a'] from src limit 3
 PREHOOK: type: QUERY
 PREHOOK: Input: default@src
-PREHOOK: Output: 
file:/tmp/sdong/hive_2011-02-10_17-23-41_630_3186988539263498425/-mr-10000
+PREHOOK: Output: 
file:/var/folders/71/h_j6fpg10r33hvx1lcxlgttcw61_4s/T/jonchang/hive_2011-10-05_16-24-51_124_7056362201665426304/-mr-10000
 POSTHOOK: query: select str_to_map('a=1,b=2,c=3',',','=')['a'] from src limit 3
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@src
-POSTHOOK: Output: 
file:/tmp/sdong/hive_2011-02-10_17-23-41_630_3186988539263498425/-mr-10000
+POSTHOOK: Output: 
file:/var/folders/71/h_j6fpg10r33hvx1lcxlgttcw61_4s/T/jonchang/hive_2011-10-05_16-24-51_124_7056362201665426304/-mr-10000
 1
 1
 1
@@ -95,14 +95,14 @@ STAGE PLANS:
 PREHOOK: query: select str_to_map('a:1,b:2,c:3') from src limit 3
 PREHOOK: type: QUERY
 PREHOOK: Input: default@src
-PREHOOK: Output: 
file:/tmp/sdong/hive_2011-02-10_17-23-45_084_2380690793062196557/-mr-10000
+PREHOOK: Output: 
file:/var/folders/71/h_j6fpg10r33hvx1lcxlgttcw61_4s/T/jonchang/hive_2011-10-05_16-24-56_651_6773854971430318122/-mr-10000
 POSTHOOK: query: select str_to_map('a:1,b:2,c:3') from src limit 3
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@src
-POSTHOOK: Output: 
file:/tmp/sdong/hive_2011-02-10_17-23-45_084_2380690793062196557/-mr-10000
-{"b":"2","c":"3","a":"1"}
-{"b":"2","c":"3","a":"1"}
-{"b":"2","c":"3","a":"1"}
+POSTHOOK: Output: 
file:/var/folders/71/h_j6fpg10r33hvx1lcxlgttcw61_4s/T/jonchang/hive_2011-10-05_16-24-56_651_6773854971430318122/-mr-10000
+{"b":"2","a":"1","c":"3"}
+{"b":"2","a":"1","c":"3"}
+{"b":"2","a":"1","c":"3"}
 PREHOOK: query: explain select str_to_map('a:1,b:2,c:3',',',':') from src 
limit 3
 PREHOOK: type: QUERY
 POSTHOOK: query: explain select str_to_map('a:1,b:2,c:3',',',':') from src 
limit 3
@@ -142,14 +142,14 @@ STAGE PLANS:
 PREHOOK: query: select str_to_map('a:1,b:2,c:3',',',':') from src limit 3
 PREHOOK: type: QUERY
 PREHOOK: Input: default@src
-PREHOOK: Output: 
file:/tmp/sdong/hive_2011-02-10_17-23-48_380_2768579016303223096/-mr-10000
+PREHOOK: Output: 
file:/var/folders/71/h_j6fpg10r33hvx1lcxlgttcw61_4s/T/jonchang/hive_2011-10-05_16-25-01_804_3299719471006117768/-mr-10000
 POSTHOOK: query: select str_to_map('a:1,b:2,c:3',',',':') from src limit 3
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@src
-POSTHOOK: Output: 
file:/tmp/sdong/hive_2011-02-10_17-23-48_380_2768579016303223096/-mr-10000
-{"b":"2","c":"3","a":"1"}
-{"b":"2","c":"3","a":"1"}
-{"b":"2","c":"3","a":"1"}
+POSTHOOK: Output: 
file:/var/folders/71/h_j6fpg10r33hvx1lcxlgttcw61_4s/T/jonchang/hive_2011-10-05_16-25-01_804_3299719471006117768/-mr-10000
+{"b":"2","a":"1","c":"3"}
+{"b":"2","a":"1","c":"3"}
+{"b":"2","a":"1","c":"3"}
 PREHOOK: query: explain select str_to_map(t.ss,',',':')['a']
 from (select transform('a:1,b:2,c:3') using 'cat' as (ss) from src) t
 limit 3
@@ -205,13 +205,13 @@ from (select transform('a:1,b:2,c:3') us
 limit 3
 PREHOOK: type: QUERY
 PREHOOK: Input: default@src
-PREHOOK: Output: 
file:/tmp/sdong/hive_2011-02-10_17-23-51_684_230364883876108478/-mr-10000
+PREHOOK: Output: 
file:/var/folders/71/h_j6fpg10r33hvx1lcxlgttcw61_4s/T/jonchang/hive_2011-10-05_16-25-06_779_3938364123634391474/-mr-10000
 POSTHOOK: query: select str_to_map(t.ss,',',':')['a']
 from (select transform('a:1,b:2,c:3') using 'cat' as (ss) from src) t
 limit 3
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@src
-POSTHOOK: Output: 
file:/tmp/sdong/hive_2011-02-10_17-23-51_684_230364883876108478/-mr-10000
+POSTHOOK: Output: 
file:/var/folders/71/h_j6fpg10r33hvx1lcxlgttcw61_4s/T/jonchang/hive_2011-10-05_16-25-06_779_3938364123634391474/-mr-10000
 1
 1
 1
@@ -229,11 +229,11 @@ POSTHOOK: Output: default@tbl_s2m
 PREHOOK: query: select str_to_map(t,'_','=')['333'] from tbl_s2m
 PREHOOK: type: QUERY
 PREHOOK: Input: default@tbl_s2m
-PREHOOK: Output: 
file:/tmp/sdong/hive_2011-02-10_17-23-58_864_5131196835428716204/-mr-10000
+PREHOOK: Output: 
file:/var/folders/71/h_j6fpg10r33hvx1lcxlgttcw61_4s/T/jonchang/hive_2011-10-05_16-25-17_345_8328527994867118991/-mr-10000
 POSTHOOK: query: select str_to_map(t,'_','=')['333'] from tbl_s2m
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@tbl_s2m
-POSTHOOK: Output: 
file:/tmp/sdong/hive_2011-02-10_17-23-58_864_5131196835428716204/-mr-10000
+POSTHOOK: Output: 
file:/var/folders/71/h_j6fpg10r33hvx1lcxlgttcw61_4s/T/jonchang/hive_2011-10-05_16-25-17_345_8328527994867118991/-mr-10000
 444
 444
 444

Modified: 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorFactory.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorFactory.java?rev=1181615&r1=1181614&r2=1181615&view=diff
==============================================================================
--- 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorFactory.java
 (original)
+++ 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorFactory.java
 Tue Oct 11 03:36:50 2011
@@ -204,6 +204,12 @@ public final class ObjectInspectorFactor
     return result;
   }
 
+  public static StandardConstantListObjectInspector 
getStandardConstantListObjectInspector(
+      ObjectInspector listElementObjectInspector, List<?> constantValue) {
+    return new StandardConstantListObjectInspector(listElementObjectInspector, 
constantValue);
+  }
+
+
   static HashMap<List<ObjectInspector>, StandardMapObjectInspector> 
cachedStandardMapObjectInspector = new HashMap<List<ObjectInspector>, 
StandardMapObjectInspector>();
 
   public static StandardMapObjectInspector getStandardMapObjectInspector(
@@ -222,6 +228,14 @@ public final class ObjectInspectorFactor
     return result;
   }
 
+  public static StandardConstantMapObjectInspector 
getStandardConstantMapObjectInspector(
+      ObjectInspector mapKeyObjectInspector,
+      ObjectInspector mapValueObjectInspector,
+      Map<?, ?> constantValue) {
+    return new StandardConstantMapObjectInspector(mapKeyObjectInspector,
+          mapValueObjectInspector, constantValue);
+  }
+
   static HashMap<List<ObjectInspector>, StandardUnionObjectInspector>
     cachedStandardUnionObjectInspector =
       new HashMap<List<ObjectInspector>, StandardUnionObjectInspector>();

Modified: 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java?rev=1181615&r1=1181614&r2=1181615&view=diff
==============================================================================
--- 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java
 (original)
+++ 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java
 Tue Oct 11 03:36:50 2011
@@ -31,8 +31,10 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hive.serde.Constants;
 import org.apache.hadoop.hive.serde2.io.TimestampWritable;
+import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category;
 import 
org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory.ObjectInspectorOptions;
+import 
org.apache.hadoop.hive.serde2.objectinspector.primitive.AbstractPrimitiveWritableObjectInspector;
 import 
org.apache.hadoop.hive.serde2.objectinspector.primitive.BinaryObjectInspector;
 import 
org.apache.hadoop.hive.serde2.objectinspector.primitive.BooleanObjectInspector;
 import 
org.apache.hadoop.hive.serde2.objectinspector.primitive.ByteObjectInspector;
@@ -74,6 +76,21 @@ public final class ObjectInspectorUtils 
   }
 
   /**
+   * Ensures that an ObjectInspector is Writable.
+   */
+  public static ObjectInspector getWritableObjectInspector(ObjectInspector oi) 
{
+    // All non-primitive OIs are writable so we need only check this case.
+    if (oi.getCategory() == Category.PRIMITIVE) {
+      PrimitiveObjectInspector poi = (PrimitiveObjectInspector) oi;
+      if (!(poi instanceof AbstractPrimitiveWritableObjectInspector)) {
+        return PrimitiveObjectInspectorFactory
+            .getPrimitiveWritableObjectInspector(poi.getPrimitiveCategory());
+      }
+    }
+    return oi;
+  }
+
+  /**
    * Get the corresponding standard ObjectInspector for an ObjectInspector.
    *
    * The returned ObjectInspector can be used to inspect the standard object.
@@ -850,6 +867,55 @@ public final class ObjectInspectorUtils 
     throw new RuntimeException("Unknown category encountered: " + c1);
   }
 
+  public static ConstantObjectInspector 
getConstantObjectInspector(ObjectInspector oi, Object value) {
+    ObjectInspector writableOI = getStandardObjectInspector(oi, 
ObjectInspectorCopyOption.WRITABLE);
+    Object writableValue =
+      ObjectInspectorConverters.getConverter(oi, writableOI).convert(value);
+    switch (writableOI.getCategory()) {
+      case PRIMITIVE:
+        PrimitiveObjectInspector poi = (PrimitiveObjectInspector) oi;
+        return 
PrimitiveObjectInspectorFactory.getPrimitiveWritableConstantObjectInspector(
+            poi.getPrimitiveCategory(), writableValue);
+      case LIST:
+        ListObjectInspector loi = (ListObjectInspector) oi;
+        return ObjectInspectorFactory.getStandardConstantListObjectInspector(
+            getStandardObjectInspector(
+              loi.getListElementObjectInspector(),
+              ObjectInspectorCopyOption.WRITABLE
+            ),
+            (List<?>)writableValue);
+      case MAP:
+        MapObjectInspector moi = (MapObjectInspector) oi;
+        return ObjectInspectorFactory.getStandardConstantMapObjectInspector(
+            getStandardObjectInspector(
+              moi.getMapKeyObjectInspector(),
+              ObjectInspectorCopyOption.WRITABLE
+            ),
+            getStandardObjectInspector(
+              moi.getMapValueObjectInspector(),
+              ObjectInspectorCopyOption.WRITABLE
+            ),
+            (Map<?, ?>)writableValue);
+      default:
+       throw new IllegalArgumentException(
+           writableOI.getCategory() + " not yet supported for constant OI");
+    }
+  }
+
+  public static boolean supportsConstantObjectInspector(ObjectInspector oi) {
+    switch (oi.getCategory()) {
+      case PRIMITIVE:
+      case LIST:
+      case MAP:
+        return true;
+      default:
+        return false;
+    }
+  }
+
+  public static boolean isConstantObjectInspector(ObjectInspector oi) {
+    return (oi instanceof ConstantObjectInspector);
+  }
 
   private ObjectInspectorUtils() {
     // prevent instantiation

Added: 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantListObjectInspector.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantListObjectInspector.java?rev=1181615&view=auto
==============================================================================
--- 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantListObjectInspector.java
 (added)
+++ 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantListObjectInspector.java
 Tue Oct 11 03:36:50 2011
@@ -0,0 +1,48 @@
+/**
+ * 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.hadoop.hive.serde2.objectinspector;
+
+import java.util.List;
+
+/**
+ * A StandardListObjectInspector which also implements the
+ * ConstantObjectInspector interface.
+ *
+ * Always use the ObjectInspectorFactory to create new ObjectInspector objects,
+ * instead of directly creating an instance of this class.
+ */
+public class StandardConstantListObjectInspector extends 
StandardListObjectInspector
+  implements ConstantObjectInspector {
+
+  private List<?> value;
+
+  /**
+   * Call ObjectInspectorFactory.getStandardListObjectInspector instead.
+   */
+  protected StandardConstantListObjectInspector(
+      ObjectInspector listElementObjectInspector, List<?> value) {
+    super(listElementObjectInspector);
+    this.value = value;
+  }
+
+  @Override
+  public List<?> getWritableConstantValue() {
+    return value;
+  }
+}

Added: 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantMapObjectInspector.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantMapObjectInspector.java?rev=1181615&view=auto
==============================================================================
--- 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantMapObjectInspector.java
 (added)
+++ 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardConstantMapObjectInspector.java
 Tue Oct 11 03:36:50 2011
@@ -0,0 +1,48 @@
+/**
+ * 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.hadoop.hive.serde2.objectinspector;
+
+import java.util.Map;
+
+/**
+ * A StandardMapObjectInspector which also implements the
+ * ConstantObjectInspector interface.
+ *
+ * Always use the ObjectInspectorFactory to create new ObjectInspector objects,
+ * instead of directly creating an instance of this class.
+ */
+public class StandardConstantMapObjectInspector extends 
StandardMapObjectInspector
+  implements ConstantObjectInspector {
+
+  private Map<?, ?> value;
+
+  /**
+   * Call ObjectInspectorFactory.getStandardMapObjectInspector instead.
+   */
+   protected StandardConstantMapObjectInspector(ObjectInspector 
mapKeyObjectInspector,
+       ObjectInspector mapValueObjectInspector, Map<?, ?> value) {
+    super(mapKeyObjectInspector, mapValueObjectInspector);
+    this.value = value;
+  }
+
+  @Override
+  public Map<?, ?> getWritableConstantValue() {
+    return value;
+  }
+}

Modified: 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorFactory.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorFactory.java?rev=1181615&r1=1181614&r2=1181615&view=diff
==============================================================================
--- 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorFactory.java
 (original)
+++ 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorFactory.java
 Tue Oct 11 03:36:50 2011
@@ -26,12 +26,13 @@ import org.apache.hadoop.hive.serde2.obj
 import 
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils.PrimitiveTypeEntry;
 import org.apache.hadoop.io.Writable;
 import org.apache.hadoop.io.BooleanWritable;
-import org.apache.hadoop.io.ByteWritable;
+import org.apache.hadoop.hive.serde2.io.ByteWritable;
 import org.apache.hadoop.hive.serde2.io.ShortWritable;
 import org.apache.hadoop.io.IntWritable;
 import org.apache.hadoop.io.LongWritable;
 import org.apache.hadoop.io.FloatWritable;
 import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.TimestampWritable;
 import org.apache.hadoop.io.Text;
 
 /**
@@ -187,8 +188,10 @@ public final class PrimitiveObjectInspec
       return new WritableConstantDoubleObjectInspector((DoubleWritable)value);
     case STRING:
       return new WritableConstantStringObjectInspector((Text)value);
+    case TIMESTAMP:
+      return new 
WritableConstantTimestampObjectInspector((TimestampWritable)value);
     case VOID:
-      return new WritableConstantVoidObjectInspector();
+      return new WritableVoidObjectInspector();
     default:
       throw new RuntimeException("Internal error: Cannot find "
         + "ConstantObjectInspector for " + primitiveCategory);

Modified: 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantByteObjectInspector.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantByteObjectInspector.java?rev=1181615&r1=1181614&r2=1181615&view=diff
==============================================================================
--- 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantByteObjectInspector.java
 (original)
+++ 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantByteObjectInspector.java
 Tue Oct 11 03:36:50 2011
@@ -19,7 +19,7 @@ package org.apache.hadoop.hive.serde2.ob
 
 import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector;
 
-import org.apache.hadoop.io.ByteWritable;
+import org.apache.hadoop.hive.serde2.io.ByteWritable;
 
 /**
  * A WritableConstantByteObjectInspector is a WritableByteObjectInspector

Added: 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantTimestampObjectInspector.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantTimestampObjectInspector.java?rev=1181615&view=auto
==============================================================================
--- 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantTimestampObjectInspector.java
 (added)
+++ 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantTimestampObjectInspector.java
 Tue Oct 11 03:36:50 2011
@@ -0,0 +1,43 @@
+/**
+ * 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.hadoop.hive.serde2.objectinspector.primitive;
+
+import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector;
+
+import org.apache.hadoop.hive.serde2.io.TimestampWritable;
+
+/**
+ * A WritableConstantTimestampObjectInspector is a 
WritableTimestampObjectInspector
+ * that implements ConstantObjectInspector.
+ */
+public class WritableConstantTimestampObjectInspector extends
+    WritableTimestampObjectInspector implements
+    ConstantObjectInspector {
+
+  private TimestampWritable value;
+
+  WritableConstantTimestampObjectInspector(TimestampWritable value) {
+    super();
+    this.value = value;
+  }
+
+  @Override
+  public TimestampWritable getWritableConstantValue() {
+    return value;
+  }
+}

Modified: 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableVoidObjectInspector.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableVoidObjectInspector.java?rev=1181615&r1=1181614&r2=1181615&view=diff
==============================================================================
--- 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableVoidObjectInspector.java
 (original)
+++ 
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableVoidObjectInspector.java
 Tue Oct 11 03:36:50 2011
@@ -17,11 +17,15 @@
  */
 package org.apache.hadoop.hive.serde2.objectinspector.primitive;
 
+import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector;
+
 /**
  * A WritableVoidObjectInspector inspects a NullWritable Object.
+ * Note that this is also a constant object inspector.
  */
 public class WritableVoidObjectInspector extends
-    AbstractPrimitiveWritableObjectInspector implements VoidObjectInspector {
+    AbstractPrimitiveWritableObjectInspector implements
+    VoidObjectInspector, ConstantObjectInspector {
 
   WritableVoidObjectInspector() {
     super(PrimitiveObjectInspectorUtils.voidTypeEntry);
@@ -33,6 +37,11 @@ public class WritableVoidObjectInspector
   }
 
   @Override
+  public Object getWritableConstantValue() {
+    return null;
+  }
+
+  @Override
   public Object getPrimitiveJavaObject(Object o) {
     throw new RuntimeException("Internal error: cannot create Void object.");
   }


Reply via email to