>From Ali Alsuliman <[email protected]>:

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


Change subject: testing all
......................................................................

testing all

Change-Id: If6d8c832809715f2815f639950d5e0603e8e543b
---
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/compiler/provider/SqlppCompilationProvider.java
M 
hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/config/AlgebricksConfig.java
M 
hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java
3 files changed, 91 insertions(+), 4 deletions(-)



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

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/compiler/provider/SqlppCompilationProvider.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/compiler/provider/SqlppCompilationProvider.java
index 3daf74b..98e26a2 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/compiler/provider/SqlppCompilationProvider.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/compiler/provider/SqlppCompilationProvider.java
@@ -43,6 +43,7 @@
 import org.apache.asterix.optimizer.rules.util.EquivalenceClassUtils;
 import org.apache.asterix.translator.SqlppExpressionToPlanTranslator;
 import org.apache.asterix.translator.SqlppExpressionToPlanTranslatorFactory;
+import org.apache.hyracks.algebricks.rewriter.rules.ExtractCommonOperatorsRule;

 public class SqlppCompilationProvider implements ILangCompilationProvider {

@@ -107,6 +108,7 @@
                 DisjunctivePredicateToJoinRule.REWRITE_OR_AS_JOIN_OPTION,
                 SetAsterixPhysicalOperatorsRule.REWRITE_ATTEMPT_BATCH_ASSIGN,
                 EquivalenceClassUtils.REWRITE_INTERNAL_QUERYUID_PK, 
SqlppQueryRewriter.SQL_COMPAT_OPTION,
-                JoinEnum.CBO_FULL_ENUM_LEVEL_KEY, JoinEnum.CBO_CP_ENUM_KEY));
+                JoinEnum.CBO_FULL_ENUM_LEVEL_KEY, JoinEnum.CBO_CP_ENUM_KEY,
+                ExtractCommonOperatorsRule.EXTRACT_COMMON_OPS));
     }
 }
diff --git 
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/config/AlgebricksConfig.java
 
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/config/AlgebricksConfig.java
index 5aab406..027a4ab 100644
--- 
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/config/AlgebricksConfig.java
+++ 
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/config/AlgebricksConfig.java
@@ -38,7 +38,7 @@
     public static final boolean CBO_DEFAULT = true;
     public static final boolean CBO_TEST_DEFAULT = false;
     public static final boolean FORCE_JOIN_ORDER_DEFAULT = false;
-    public static final boolean REWRITE_DISJUNCTION_DEFAULT = true;
+    public static final boolean REWRITE_DISJUNCTION_DEFAULT = false;
     public static final String QUERY_PLAN_SHAPE_ZIGZAG = "zigzag";
     public static final String QUERY_PLAN_SHAPE_LEFTDEEP = "leftdeep";
     public static final String QUERY_PLAN_SHAPE_RIGHTDEEP = "rightdeep";
diff --git 
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java
 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java
index 88cfaad..ae8a4f6 100644
--- 
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java
+++ 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java
@@ -60,6 +60,9 @@
  */
 public class ExtractCommonOperatorsRule implements IAlgebraicRewriteRule {

+    public static final String EXTRACT_COMMON_OPS = "extract_common_ops";
+    public static final boolean EXTRACT_DEFAULT = true;
+
     private final HashMap<Mutable<ILogicalOperator>, 
List<Mutable<ILogicalOperator>>> childrenToParents =
             new HashMap<>();
     private final List<Mutable<ILogicalOperator>> roots = new ArrayList<>();
@@ -70,10 +73,15 @@
     private int lastUsedClusterId = 0;
     private final Map<Mutable<ILogicalOperator>, BitSet> replicateToOutputs = 
new HashMap<>();
     private final List<Pair<Mutable<ILogicalOperator>, Boolean>> newOutputs = 
new ArrayList<>();
+    private Boolean extractCommonOpsEnabled = null;

     @Override
     public boolean rewritePre(Mutable<ILogicalOperator> opRef, 
IOptimizationContext context)
             throws AlgebricksException {
+        if (extractCommonOpsEnabled == null) {
+            Object option = 
context.getMetadataProvider().getConfig().get(EXTRACT_COMMON_OPS);
+            extractCommonOpsEnabled = option != null ? 
Boolean.parseBoolean(option.toString()) : EXTRACT_DEFAULT;
+        }
         AbstractLogicalOperator op = (AbstractLogicalOperator) 
opRef.getValue();
         if (op.getOperatorTag() != LogicalOperatorTag.WRITE && 
op.getOperatorTag() != LogicalOperatorTag.WRITE_RESULT
                 && op.getOperatorTag() != 
LogicalOperatorTag.DISTRIBUTE_RESULT) {
@@ -101,7 +109,11 @@
                 changed = false;
                 // applying the rewriting until fixpoint
                 topDownMaterialization(roots);
-                genCandidates();
+                if (extractCommonOpsEnabled) {
+                    genCandidatesGrow();
+                } else {
+                    genCandidates();
+                }
                 removeTrivialShare();
                 if (!equivalenceClasses.isEmpty()) {
                     changed = rewrite(context);
@@ -412,7 +424,7 @@
         }
     }

-    private void genCandidates() throws AlgebricksException {
+    private void genCandidatesGrow() throws AlgebricksException {
         List<List<Mutable<ILogicalOperator>>> previousEquivalenceClasses = new 
ArrayList<>();
         boolean grown = true;
         while (equivalenceClasses.size() > 0 && grown) {
@@ -457,6 +469,40 @@
         }
     }

+    private void genCandidates() throws AlgebricksException {
+        List<List<Mutable<ILogicalOperator>>> previousEquivalenceClasses = new 
ArrayList<>();
+        while (equivalenceClasses.size() > 0) {
+            previousEquivalenceClasses.clear();
+            for (List<Mutable<ILogicalOperator>> candidates : 
equivalenceClasses) {
+                List<Mutable<ILogicalOperator>> candidatesCopy = new 
ArrayList<>(candidates);
+                previousEquivalenceClasses.add(candidatesCopy);
+            }
+            List<Mutable<ILogicalOperator>> currentLevelOpRefs = new 
ArrayList<>();
+            for (List<Mutable<ILogicalOperator>> candidates : 
equivalenceClasses) {
+                if (candidates.size() > 0) {
+                    for (Mutable<ILogicalOperator> opRef : candidates) {
+                        List<Mutable<ILogicalOperator>> refs = 
childrenToParents.get(opRef);
+                        if (refs != null) {
+                            currentLevelOpRefs.addAll(refs);
+                        }
+                    }
+                }
+                if (currentLevelOpRefs.size() == 0) {
+                    continue;
+                }
+                candidates(currentLevelOpRefs, candidates);
+            }
+            if (currentLevelOpRefs.size() == 0) {
+                break;
+            }
+            prune();
+        }
+        if (equivalenceClasses.size() < 1 && previousEquivalenceClasses.size() 
> 0) {
+            equivalenceClasses.addAll(previousEquivalenceClasses);
+            prune();
+        }
+    }
+
     private void topDownMaterialization(List<Mutable<ILogicalOperator>> tops) {
         List<Mutable<ILogicalOperator>> candidates = new ArrayList<>();
         List<Mutable<ILogicalOperator>> nextLevel = new ArrayList<>();
@@ -526,6 +572,45 @@
         return true;
     }

+    private boolean candidates(List<Mutable<ILogicalOperator>> opList, 
List<Mutable<ILogicalOperator>> candidates) {
+        List<Mutable<ILogicalOperator>> previousCandidates = new 
ArrayList<>(candidates);
+        candidates.clear();
+        boolean validCandidate = false;
+        for (Mutable<ILogicalOperator> op : opList) {
+            List<Mutable<ILogicalOperator>> inputs = op.getValue().getInputs();
+            for (int i = 0; i < inputs.size(); i++) {
+                Mutable<ILogicalOperator> inputRef = inputs.get(i);
+                validCandidate = false;
+                for (Mutable<ILogicalOperator> candidate : previousCandidates) 
{
+                    // if current input is in candidates
+                    if (inputRef.getValue().equals(candidate.getValue())) {
+                        if (inputs.size() == 1) {
+                            validCandidate = true;
+                        } else {
+                            BitSet candidateInputBitMap = 
opToCandidateInputs.get(op);
+                            if (candidateInputBitMap == null) {
+                                candidateInputBitMap = new 
BitSet(inputs.size());
+                                opToCandidateInputs.put(op, 
candidateInputBitMap);
+                            }
+                            candidateInputBitMap.set(i);
+                            if (candidateInputBitMap.cardinality() == 
inputs.size()) {
+                                validCandidate = true;
+                            }
+                        }
+                        break;
+                    }
+                }
+            }
+            if (!validCandidate) {
+                continue;
+            }
+            if (!candidates.contains(op)) {
+                candidates.add(op);
+            }
+        }
+        return true;
+    }
+
     private void prune() throws AlgebricksException {
         List<List<Mutable<ILogicalOperator>>> previousEquivalenceClasses = new 
ArrayList<>();
         for (List<Mutable<ILogicalOperator>> candidates : equivalenceClasses) {

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20997?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: phoenix
Gerrit-Change-Id: If6d8c832809715f2815f639950d5e0603e8e543b
Gerrit-Change-Number: 20997
Gerrit-PatchSet: 1
Gerrit-Owner: Ali Alsuliman <[email protected]>

Reply via email to