Author: hashutosh Date: Tue Jan 13 17:31:55 2015 New Revision: 1651419 URL: http://svn.apache.org/r1651419 Log: HIVE-7550 : Extend cached evaluation to multiple expressions (Navis via Ashutosh Chauhan)
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeEvaluatorFactory.java hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/SelectOperator.java Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeEvaluatorFactory.java URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeEvaluatorFactory.java?rev=1651419&r1=1651418&r2=1651419&view=diff ============================================================================== --- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeEvaluatorFactory.java (original) +++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeEvaluatorFactory.java Tue Jan 13 17:31:55 2015 @@ -64,6 +64,20 @@ public final class ExprNodeEvaluatorFact "Cannot find ExprNodeEvaluator for the exprNodeDesc = " + desc); } + public static ExprNodeEvaluator[] toCachedEvals(ExprNodeEvaluator[] evals) { + EvaluatorContext context = new EvaluatorContext(); + for (int i = 0; i < evals.length; i++) { + if (evals[i] instanceof ExprNodeGenericFuncEvaluator) { + iterate(evals[i], context); + if (context.hasReference) { + evals[i] = new ExprNodeEvaluatorHead(evals[i]); + context.hasReference = false; + } + } + } + return evals; + } + /** * Should be called before eval is initialized */ Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/SelectOperator.java URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/SelectOperator.java?rev=1651419&r1=1651418&r2=1651419&view=diff ============================================================================== --- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/SelectOperator.java (original) +++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/SelectOperator.java Tue Jan 13 17:31:55 2015 @@ -28,7 +28,6 @@ import org.apache.hadoop.hive.ql.plan.Ex import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; import org.apache.hadoop.hive.ql.plan.SelectDesc; import org.apache.hadoop.hive.ql.plan.api.OperatorType; -import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; /** * Select operator implementation. @@ -55,12 +54,12 @@ public class SelectOperator extends Oper for (int i = 0; i < colList.size(); i++) { assert (colList.get(i) != null); eval[i] = ExprNodeEvaluatorFactory.get(colList.get(i)); - if (HiveConf.getBoolVar(hconf, HiveConf.ConfVars.HIVEEXPREVALUATIONCACHE)) { - eval[i] = ExprNodeEvaluatorFactory.toCachedEval(eval[i]); - } + } + if (HiveConf.getBoolVar(hconf, HiveConf.ConfVars.HIVEEXPREVALUATIONCACHE)) { + eval = ExprNodeEvaluatorFactory.toCachedEvals(eval); } output = new Object[eval.length]; - LOG.info("SELECT " + ((StructObjectInspector) inputObjInspectors[0]).getTypeName()); + LOG.info("SELECT " + inputObjInspectors[0].getTypeName()); outputObjInspector = initEvaluatorsAndReturnStruct(eval, conf.getOutputColumnNames(), inputObjInspectors[0]); initializeChildren(hconf);