>From Peeyush Gupta <[email protected]>:
Peeyush Gupta has uploaded this change for review. (
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19095 )
Change subject: WIP: exponential recursion in
OperatorManipulationUtil.substituteVarRec method
......................................................................
WIP: exponential recursion in OperatorManipulationUtil.substituteVarRec method
Change-Id: Iefe7859bb6b83f59e735d041ef1765e8741d0c5e
---
M
hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorManipulationUtil.java
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushAggregateIntoNestedSubplanRule.java
M
hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractDecorrelationRule.java
M
hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/IntroduceGroupByForSubplanRule.java
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushGroupByThroughProduct.java
5 files changed, 32 insertions(+), 9 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/95/19095/1
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushAggregateIntoNestedSubplanRule.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushAggregateIntoNestedSubplanRule.java
index d2ac8e5..d849461 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushAggregateIntoNestedSubplanRule.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushAggregateIntoNestedSubplanRule.java
@@ -405,7 +405,8 @@
Mutable<ILogicalOperator> nspAggChildRef =
nspAgg.getInputs().get(0);
LogicalVariable listifyVar = findListifiedVariable(nspAgg,
varFromNestedAgg);
if (listifyVar != null) {
- OperatorManipulationUtil.substituteVarRec(aggInSubplanOp,
unnestVar, listifyVar, true, context);
+ OperatorManipulationUtil.substituteVarRec(aggInSubplanOp,
unnestVar, listifyVar, true, context,
+ new ArrayList<>());
nspAgg.getVariables().addAll(aggInSubplanOp.getVariables());
nspAgg.getExpressions().addAll(aggInSubplanOp.getExpressions());
for (LogicalVariable v : aggInSubplanOp.getVariables()) {
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushGroupByThroughProduct.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushGroupByThroughProduct.java
index 6d92b51..a7fbfe2 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushGroupByThroughProduct.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushGroupByThroughProduct.java
@@ -125,7 +125,7 @@
if (v1 != null) {
VariableReferenceExpression varRef =
(VariableReferenceExpression) p.second.getValue();
LogicalVariable v2 = varRef.getVariableReference();
- OperatorManipulationUtil.substituteVarRec(join, v2, v1, true,
context);
+ OperatorManipulationUtil.substituteVarRec(join, v2, v1, true,
context, new ArrayList<>());
}
}
Mutable<ILogicalOperator> branchRef = join.getInputs().get(branch);
diff --git
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorManipulationUtil.java
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorManipulationUtil.java
index 2413ed2..3688e66 100644
---
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorManipulationUtil.java
+++
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorManipulationUtil.java
@@ -181,17 +181,25 @@
}
public static void substituteVarRec(AbstractLogicalOperator op,
LogicalVariable v1, LogicalVariable v2,
- boolean goThroughNts, ITypingContext ctx) throws
AlgebricksException {
+ boolean goThroughNts, ITypingContext ctx, List<ILogicalOperator>
visited) throws AlgebricksException {
VariableUtilities.substituteVariables(op, v1, v2, goThroughNts, ctx);
for (Mutable<ILogicalOperator> opRef2 : op.getInputs()) {
- substituteVarRec((AbstractLogicalOperator) opRef2.getValue(), v1,
v2, goThroughNts, ctx);
+ if (visited.contains(opRef2.getValue())) {
+ continue;
+ }
+ visited.add(opRef2.getValue());
+ substituteVarRec((AbstractLogicalOperator) opRef2.getValue(), v1,
v2, goThroughNts, ctx, visited);
}
if (op.getOperatorTag() == LogicalOperatorTag.NESTEDTUPLESOURCE &&
goThroughNts) {
NestedTupleSourceOperator nts = (NestedTupleSourceOperator) op;
if (nts.getDataSourceReference() != null) {
AbstractLogicalOperator op2 =
(AbstractLogicalOperator)
nts.getDataSourceReference().getValue().getInputs().get(0).getValue();
- substituteVarRec(op2, v1, v2, goThroughNts, ctx);
+ if (visited.contains(op2)) {
+ return;
+ }
+ visited.add(op2);
+ substituteVarRec(op2, v1, v2, goThroughNts, ctx, visited);
}
}
if (op.hasNestedPlans()) {
@@ -199,7 +207,11 @@
for (ILogicalPlan p : aonp.getNestedPlans()) {
for (Mutable<ILogicalOperator> ref : p.getRoots()) {
AbstractLogicalOperator aop = (AbstractLogicalOperator)
ref.getValue();
- substituteVarRec(aop, v1, v2, goThroughNts, ctx);
+ if (visited.contains(aop)) {
+ return;
+ }
+ visited.add(aop);
+ substituteVarRec(aop, v1, v2, goThroughNts, ctx, visited);
}
}
}
diff --git
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractDecorrelationRule.java
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractDecorrelationRule.java
index 55c8400..0131200 100644
---
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractDecorrelationRule.java
+++
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractDecorrelationRule.java
@@ -18,6 +18,7 @@
*/
package org.apache.hyracks.algebricks.rewriter.rules;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
@@ -101,7 +102,7 @@
for (ILogicalPlan p : g.getNestedPlans()) {
for (Mutable<ILogicalOperator> r : p.getRoots()) {
OperatorManipulationUtil.substituteVarRec((AbstractLogicalOperator)
r.getValue(), ov, newVar, true,
- context);
+ context, new ArrayList<>());
}
}
}
diff --git
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/IntroduceGroupByForSubplanRule.java
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/IntroduceGroupByForSubplanRule.java
index 391d03a..34a8409 100644
---
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/IntroduceGroupByForSubplanRule.java
+++
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/IntroduceGroupByForSubplanRule.java
@@ -340,11 +340,11 @@
for (ILogicalPlan p : g.getNestedPlans()) {
for (Mutable<ILogicalOperator> r : p.getRoots()) {
OperatorManipulationUtil.substituteVarRec((AbstractLogicalOperator)
r.getValue(), ov, newVar, true,
- context);
+ context, new ArrayList<>());
}
}
AbstractLogicalOperator opUnder = (AbstractLogicalOperator)
g.getInputs().get(0).getValue();
- OperatorManipulationUtil.substituteVarRec(opUnder, ov, newVar,
true, context);
+ OperatorManipulationUtil.substituteVarRec(opUnder, ov, newVar,
true, context, new ArrayList<>());
m.put(ov, newVar);
}
return m;
--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19095
To unsubscribe, or for help writing mail filters, visit
https://asterix-gerrit.ics.uci.edu/settings
Gerrit-Project: asterixdb
Gerrit-Branch: goldfish
Gerrit-Change-Id: Iefe7859bb6b83f59e735d041ef1765e8741d0c5e
Gerrit-Change-Number: 19095
Gerrit-PatchSet: 1
Gerrit-Owner: Peeyush Gupta <[email protected]>
Gerrit-MessageType: newchange