>From Janhavi Tripurwar <[email protected]>:

Janhavi Tripurwar has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21368?usp=email )


Change subject: wip compilation optimizations
......................................................................

wip compilation optimizations

Change-Id: Ie9cbb77084510244bd119cbd2f1023c816ae351e
---
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodAnalysisContext.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
2 files changed, 20 insertions(+), 5 deletions(-)



  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/68/21368/1

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodAnalysisContext.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodAnalysisContext.java
index 3d4986d..c5abc56 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodAnalysisContext.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodAnalysisContext.java
@@ -19,9 +19,11 @@
 package org.apache.asterix.optimizer.rules.am;

 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.TreeMap;

 import org.apache.asterix.metadata.entities.Dataset;
@@ -31,6 +33,7 @@
 import org.apache.hyracks.algebricks.common.utils.Pair;
 import org.apache.hyracks.algebricks.common.utils.Quadruple;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import 
org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
 import 
org.apache.hyracks.algebricks.core.algebra.expressions.ScalarFunctionCallExpression;

 /**
@@ -41,6 +44,11 @@

     private List<IOptimizableFuncExpr> matchedFuncExprs = new 
ArrayList<IOptimizableFuncExpr>();

+    // Mirrors the func-exprs in matchedFuncExprs for O(1) duplicate detection 
(see addMatchedFuncExpr).
+    // Without this, de-duplicating a new candidate required a linear scan 
with a deep equals() over all
+    // already-matched exprs, which is O(n^2) for conditions with many 
conjuncts/disjuncts (e.g. a large IN list).
+    private final Set<AbstractFunctionCallExpression> matchedFuncExprSet = new 
HashSet<>();
+
     // Contains candidate indexes and a list of (integer,integer) tuples that 
index into matchedFuncExprs and
     // matched variable inside this expr. We are mapping from candidate 
indexes to a list of function expressions
     // that match one of the index's expressions.
@@ -112,6 +120,13 @@

     public void addMatchedFuncExpr(IOptimizableFuncExpr optFuncExpr) {
         matchedFuncExprs.add(optFuncExpr);
+        matchedFuncExprSet.add(optFuncExpr.getFuncExpr());
+    }
+
+    // O(1) structural-duplicate check, equivalent to scanning 
getMatchedFuncExprs() and comparing
+    // getFuncExpr().equals(funcExpr), but without the O(n) deep-equals scan 
per insertion.
+    public boolean containsMatchedFuncExpr(AbstractFunctionCallExpression 
funcExpr) {
+        return matchedFuncExprSet.contains(funcExpr);
     }

     public Iterator<Map.Entry<Index, List<Pair<Integer, Integer>>>> 
getIteratorForIndexExprsAndVars() {
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
index 8c854da..fd71b5f 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
@@ -353,12 +353,12 @@

     private static void 
addNewOptFuncExprToAnalysisCtx(AbstractFunctionCallExpression funcExpr,
             OptimizableFuncExpr newOptFuncExpr, AccessMethodAnalysisContext 
analysisCtx) {
-        for (IOptimizableFuncExpr optFuncExpr : 
analysisCtx.getMatchedFuncExprs()) {
-            //avoid additional optFuncExpressions in case of a join
-            if (optFuncExpr.getFuncExpr().equals(funcExpr)) {
-                return;
-            }
+        //avoid additional optFuncExpressions in case of a join (O(1) 
structural-duplicate check;
+        //previously a linear scan with deep equals(), i.e. O(n^2) for 
many-conjunct/disjunct conditions)
+        if (analysisCtx.containsMatchedFuncExpr(funcExpr)) {
+            return;
         }
+
         analysisCtx.addMatchedFuncExpr(newOptFuncExpr);
     }


--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21368?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Change-Id: Ie9cbb77084510244bd119cbd2f1023c816ae351e
Gerrit-Change-Number: 21368
Gerrit-PatchSet: 1
Gerrit-Owner: Janhavi Tripurwar <[email protected]>

Reply via email to