Hussain Towaileb has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/3230

Change subject: [NO ISSUE][COMP] Documenting BreakSelectIntoConjunctsRule
......................................................................

[NO ISSUE][COMP] Documenting BreakSelectIntoConjunctsRule

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
- Added documentation for BreakSelectIntoConjunctsRule.
- Renamed some variables for easier readability and maintenance.

Change-Id: Iadc5dc41115f91caa835255396969eaf47e1356d
---
M 
hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/BreakSelectIntoConjunctsRule.java
1 file changed, 80 insertions(+), 32 deletions(-)


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

diff --git 
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/BreakSelectIntoConjunctsRule.java
 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/BreakSelectIntoConjunctsRule.java
index ab665b3..90aa583 100644
--- 
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/BreakSelectIntoConjunctsRule.java
+++ 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/BreakSelectIntoConjunctsRule.java
@@ -34,9 +34,24 @@
 import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
 import org.apache.hyracks.api.exceptions.SourceLocation;
 
+/**
+ * This rule breaks the select operator condition into conjuncts and create a 
different select operator per conjunct
+ * when applicable.
+ *
+ * Example (simplified):
+ * Before:
+ * select (and(lt($$test.getField("id"), 100), lt($$test.getField("groupId"), 
20)))
+ * unnest $$test <- dataset("test.test")
+ *
+ * After:
+ * select (lt($$test.getField("id"), 100))
+ * select (lt($$test.getField("groupId"), 20))
+ * unnest $$test <- dataset("test.test")
+ */
 public class BreakSelectIntoConjunctsRule implements IAlgebraicRewriteRule {
 
-    private List<Mutable<ILogicalExpression>> conjs = new 
ArrayList<Mutable<ILogicalExpression>>();
+    // Conjuncts of the select operator condition
+    private List<Mutable<ILogicalExpression>> conditionConjuncts = new 
ArrayList<>();
 
     @Override
     public boolean rewritePost(Mutable<ILogicalOperator> opRef, 
IOptimizationContext context) {
@@ -44,47 +59,80 @@
     }
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, 
IOptimizationContext context)
+    public boolean rewritePre(Mutable<ILogicalOperator> operatorRef, 
IOptimizationContext context)
             throws AlgebricksException {
-        AbstractLogicalOperator op = (AbstractLogicalOperator) 
opRef.getValue();
-        if (op.getOperatorTag() != LogicalOperatorTag.SELECT) {
-            return false;
-        }
-        SelectOperator select = (SelectOperator) op;
+        // Operator reference
+        AbstractLogicalOperator operator = (AbstractLogicalOperator) 
operatorRef.getValue();
 
-        ILogicalExpression cond = select.getCondition().getValue();
-
-        conjs.clear();
-        if (!cond.splitIntoConjuncts(conjs)) {
+        // Bail if it's not a select operator
+        if (operator.getOperatorTag() != LogicalOperatorTag.SELECT) {
             return false;
         }
 
-        SourceLocation sourceLoc = select.getSourceLocation();
+        // Select operator
+        SelectOperator originalSelectOperator = (SelectOperator) operator;
 
-        Mutable<ILogicalOperator> childOfSelect = select.getInputs().get(0);
-        boolean fst = true;
-        ILogicalOperator botOp = select;
-        ILogicalExpression firstExpr = null;
-        for (Mutable<ILogicalExpression> eRef : conjs) {
-            ILogicalExpression e = eRef.getValue();
-            if (fst) {
-                fst = false;
-                firstExpr = e;
+        // Select operator condition
+        ILogicalExpression selectCondition = 
originalSelectOperator.getCondition().getValue();
+
+        // Clear the condition conjuncts
+        conditionConjuncts.clear();
+
+        // Break the condition into conjuncts, bail if it's not applicable
+        if (!selectCondition.splitIntoConjuncts(conditionConjuncts)) {
+            return false;
+        }
+
+        // Source location
+        SourceLocation sourceLoc = originalSelectOperator.getSourceLocation();
+
+        // Reference to the input of the original select operator
+        Mutable<ILogicalOperator> inputOfOriginalSelectOperator = 
originalSelectOperator.getInputs().get(0);
+
+        // First expression read of the conjuncts, this will be set to the 
original select operator at the end
+        boolean first = true;
+        ILogicalExpression firstExpression = null;
+
+        // Bottom operator points to the original select operator at first
+        ILogicalOperator bottomOperator = originalSelectOperator;
+
+        // Start creating the select operators for the condition conjuncts
+        for (Mutable<ILogicalExpression> expressionRef : conditionConjuncts) {
+            ILogicalExpression expression = expressionRef.getValue();
+
+            // Hold reference to the first condition
+            if (first) {
+                first = false;
+                firstExpression = expression;
             } else {
-                SelectOperator newSelect = new SelectOperator(new 
MutableObject<ILogicalExpression>(e),
-                        select.getRetainMissing(), 
select.getMissingPlaceholderVariable());
+                // New select operator
+                SelectOperator newSelect =
+                        new SelectOperator(new MutableObject<>(expression), 
originalSelectOperator.getRetainMissing(),
+                                
originalSelectOperator.getMissingPlaceholderVariable());
                 newSelect.setSourceLocation(sourceLoc);
-                List<Mutable<ILogicalOperator>> botInpList = botOp.getInputs();
-                botInpList.clear();
-                botInpList.add(new MutableObject<ILogicalOperator>(newSelect));
-                context.computeAndSetTypeEnvironmentForOperator(botOp);
-                botOp = newSelect;
+
+                // Put the new operator at the bottom (child of current 
operator)
+                List<Mutable<ILogicalOperator>> bottomOperatorInputList = 
bottomOperator.getInputs();
+                bottomOperatorInputList.clear();
+                bottomOperatorInputList.add(new MutableObject<>(newSelect));
+
+                // Compute the output type environment
+                
context.computeAndSetTypeEnvironmentForOperator(bottomOperator);
+
+                // Bottom operator points to the new operator
+                bottomOperator = newSelect;
             }
         }
-        botOp.getInputs().add(childOfSelect);
-        select.getCondition().setValue(firstExpr);
-        context.computeAndSetTypeEnvironmentForOperator(botOp);
-        context.computeAndSetTypeEnvironmentForOperator(select);
+
+        // Add the original select operator input to the bottom operator
+        bottomOperator.getInputs().add(inputOfOriginalSelectOperator);
+
+        // Assign the first expression to the original operator (top)
+        originalSelectOperator.getCondition().setValue(firstExpression);
+
+        // Compute the output type environment
+        context.computeAndSetTypeEnvironmentForOperator(bottomOperator);
+        
context.computeAndSetTypeEnvironmentForOperator(originalSelectOperator);
 
         return true;
     }

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/3230
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iadc5dc41115f91caa835255396969eaf47e1356d
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Hussain Towaileb <[email protected]>

Reply via email to