You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by gu...@apache.org on 2014/11/03 03:01:30 UTC

svn commit: r1636228 - /hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeGenericFuncEvaluator.java

Author: gunther
Date: Mon Nov  3 02:01:29 2014
New Revision: 1636228

URL: http://svn.apache.org/r1636228
Log:
HIVE-8313: Optimize evaluation for ExprNodeConstantEvaluator and ExprNodeNullEvaluator (Mithun Radhakrishnan, reviewed by Navis)

Modified:
    hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeGenericFuncEvaluator.java

Modified: hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeGenericFuncEvaluator.java
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeGenericFuncEvaluator.java?rev=1636228&r1=1636227&r2=1636228&view=diff
==============================================================================
--- hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeGenericFuncEvaluator.java (original)
+++ hive/branches/branch-0.14/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeGenericFuncEvaluator.java Mon Nov  3 02:01:29 2014
@@ -31,6 +31,9 @@ import org.apache.hadoop.hive.serde2.obj
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * ExprNodeGenericFuncEvaluator.
  *
@@ -44,6 +47,7 @@ public class ExprNodeGenericFuncEvaluato
   transient Object rowObject;
   transient ExprNodeEvaluator[] children;
   transient GenericUDF.DeferredObject[] deferredChildren;
+  transient GenericUDF.DeferredObject[] childrenNeedingPrepare;
   transient boolean isEager;
   transient boolean isConstant = false;
 
@@ -73,6 +77,10 @@ public class ExprNodeGenericFuncEvaluato
       }
     }
 
+    public boolean needsPrepare() {
+      return !(eval instanceof ExprNodeConstantEvaluator || eval instanceof ExprNodeNullEvaluator);
+    }
+
     public Object get() throws HiveException {
       if (!evaluated) {
         obj = eval.evaluate(rowObject, version);
@@ -113,9 +121,17 @@ public class ExprNodeGenericFuncEvaluato
   @Override
   public ObjectInspector initialize(ObjectInspector rowInspector) throws HiveException {
     deferredChildren = new GenericUDF.DeferredObject[children.length];
+    List<GenericUDF.DeferredObject> childrenNeedingPrepare =
+        new ArrayList<GenericUDF.DeferredObject>(children.length);
     for (int i = 0; i < deferredChildren.length; i++) {
-      deferredChildren[i] = new DeferredExprObject(children[i], isEager);
+      DeferredExprObject deferredExprObject = new DeferredExprObject(children[i], isEager);
+      deferredChildren[i] = deferredExprObject;
+      if (deferredExprObject.needsPrepare()) {
+        childrenNeedingPrepare.add(deferredExprObject);
+      }
     }
+    this.childrenNeedingPrepare =
+        childrenNeedingPrepare.toArray(new GenericUDF.DeferredObject[childrenNeedingPrepare.size()]);
     // Initialize all children first
     ObjectInspector[] childrenOIs = new ObjectInspector[children.length];
     for (int i = 0; i < children.length; i++) {
@@ -163,8 +179,8 @@ public class ExprNodeGenericFuncEvaluato
       return ((ConstantObjectInspector) outputOI).getWritableConstantValue();
     }
     rowObject = row;
-    for (int i = 0; i < deferredChildren.length; i++) {
-      deferredChildren[i].prepare(version);
+    for (GenericUDF.DeferredObject deferredObject : childrenNeedingPrepare) {
+      deferredObject.prepare(version);
     }
     return genericUDF.evaluate(deferredChildren);
   }