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

[drill] branch master updated: DRILL-8088: Improve expression evaluation performance (#2412)

This is an automated email from the ASF dual-hosted git repository.

cgivre pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/drill.git


The following commit(s) were added to refs/heads/master by this push:
     new 84d3d32  DRILL-8088: Improve expression evaluation performance (#2412)
84d3d32 is described below

commit 84d3d32d1d76ce945f9c357c5b6f79119dae95f5
Author: leon <32...@qq.com>
AuthorDate: Mon Jan 3 09:58:20 2022 +0800

    DRILL-8088: Improve expression evaluation performance (#2412)
    
    * DRILL-8088: Improve expression evaluation performance
    
    * fix checkstyle
---
 .../org/apache/drill/exec/expr/EvaluationVisitor.java     | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
index 18b7af4..88eca6d 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
@@ -79,6 +79,7 @@ import org.apache.drill.exec.vector.ValueHolderHelper;
 import org.apache.drill.exec.vector.complex.reader.FieldReader;
 
 import org.apache.drill.shaded.guava.com.google.common.base.Function;
+import org.apache.drill.shaded.guava.com.google.common.collect.Maps;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -217,7 +218,7 @@ public class EvaluationVisitor {
 
   void newScope() {
     mapStack.push(previousExpressions);
-    previousExpressions = new HashMap<>(previousExpressions);
+    previousExpressions = Maps.newHashMap();
   }
 
   void leaveScope() {
@@ -229,7 +230,17 @@ public class EvaluationVisitor {
    * Get a HoldingContainer for the expression if it had been already evaluated
    */
   private HoldingContainer getPrevious(LogicalExpression expression, MappingSet mappingSet) {
-    HoldingContainer previous = previousExpressions.get(new ExpressionHolder(expression, mappingSet));
+    ExpressionHolder holder = new ExpressionHolder(expression, mappingSet);
+    HoldingContainer previous = null;
+    for (Map<ExpressionHolder,HoldingContainer> m : mapStack) {
+      previous = m.get(holder);
+      if (previous != null) {
+        break;
+      }
+    }
+    if (previous == null) {
+      previous = previousExpressions.get(holder);
+    }
     if (previous != null) {
       logger.debug("Found previously evaluated expression: {}", ExpressionStringBuilder.toString(expression));
     }