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]>