>From Preetham Poluparthi <[email protected]>:
Preetham Poluparthi has uploaded this change for review. (
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20865?usp=email )
Change subject: WIP: Improve IN translation
......................................................................
WIP: Improve IN translation
Change-Id: Ic92391e179eb05103f9a32d31e9ca6c4e4af02fc
---
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineLeftNtsInSubplanJoinFlatteningVisitor.java
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineSubplanInputForNestedTupleSourceRule.java
2 files changed, 46 insertions(+), 4 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/65/20865/1
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineLeftNtsInSubplanJoinFlatteningVisitor.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineLeftNtsInSubplanJoinFlatteningVisitor.java
index cd476f9..0c1969a 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineLeftNtsInSubplanJoinFlatteningVisitor.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineLeftNtsInSubplanJoinFlatteningVisitor.java
@@ -199,10 +199,10 @@
AbstractBinaryJoinOperator returnOp = op;
// After rewriting, the original inner join should become an left
outer join.
if (rewritten) {
- returnOp = new LeftOuterJoinOperator(op.getCondition(),
leftOuterMissingValue);
+ returnOp = new InnerJoinOperator(op.getCondition());
returnOp.setSourceLocation(op.getSourceLocation());
returnOp.getInputs().addAll(op.getInputs());
- injectNullCheckVars(returnOp);
+ // injectNullCheckVars(returnOp);
}
return returnOp;
}
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineSubplanInputForNestedTupleSourceRule.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineSubplanInputForNestedTupleSourceRule.java
index 6220d06..c3c8c09 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineSubplanInputForNestedTupleSourceRule.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineSubplanInputForNestedTupleSourceRule.java
@@ -42,12 +42,15 @@
import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag;
import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
+import
org.apache.hyracks.algebricks.core.algebra.expressions.AggregateFunctionCallExpression;
import
org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
import
org.apache.hyracks.algebricks.core.algebra.expressions.IAlgebricksConstantValue;
import
org.apache.hyracks.algebricks.core.algebra.expressions.ScalarFunctionCallExpression;
import
org.apache.hyracks.algebricks.core.algebra.expressions.VariableReferenceExpression;
import
org.apache.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import
org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
+import
org.apache.hyracks.algebricks.core.algebra.operators.logical.AggregateOperator;
import
org.apache.hyracks.algebricks.core.algebra.operators.logical.AssignOperator;
import
org.apache.hyracks.algebricks.core.algebra.operators.logical.GroupByOperator;
import
org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterJoinOperator;
@@ -638,10 +641,49 @@
topJoinRef.setValue(ntsOp);
}
opRef.setValue(groupbyOp);
- VariableUtilities.substituteVariables(groupbyOp, result.second,
context);
- OperatorManipulationUtil.computeTypeEnvironmentBottomUp(groupbyOp,
context);
+
+ removeGroupByIfRedundant(opRef);
+
+ VariableUtilities.substituteVariables(opRef.get(), result.second,
context);
+ OperatorManipulationUtil.computeTypeEnvironmentBottomUp(opRef.get(),
context);
replacedVarMap.putAll(result.second);
return new Pair<>(true, replacedVarMap);
}
+
+ private void removeGroupByIfRedundant(Mutable<ILogicalOperator> opRef) {
+ GroupByOperator groupbyOp = (GroupByOperator) opRef.getValue();
+ if(groupbyOp.getNestedPlans().size() != 1) {
+ return;
+ }
+
+ ILogicalPlan subplan = groupbyOp.getNestedPlans().getFirst();
+ Mutable<ILogicalOperator> aggOpRef = subplan.getRoots().getFirst();
+ if(aggOpRef.getValue().getOperatorTag() !=
LogicalOperatorTag.AGGREGATE) {
+ return;
+ }
+
+ AggregateOperator aggOp = (AggregateOperator) aggOpRef.getValue();
+ if(aggOp.getExpressions().size() != 1) {
+ return;
+ }
+ if(!(aggOp.getExpressions().get(0).get() instanceof
AggregateFunctionCallExpression funcExpr)){
+ return;
+ }
+
+ FunctionIdentifier funcId = funcExpr.getFunctionIdentifier();
+
if(!funcId.equals(FunctionUtil.getFunctionInfo(BuiltinFunctions.NON_EMPTY_STREAM).getFunctionIdentifier()))
{
+ return;
+ }
+
+ ILogicalOperator nts = aggOp.getInputs().get(0).get();
+ if(nts.getOperatorTag() != LogicalOperatorTag.NESTEDTUPLESOURCE) {
+ return;
+ }
+
+ AssignOperator assignOp = new
AssignOperator(aggOp.getVariables().get(0),
+ new MutableObject<>(ConstantExpression.TRUE));
+ assignOp.getInputs().add(groupbyOp.getInputs().get(0));
+ opRef.setValue(assignOp);
+ }
}
--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20865?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: Ic92391e179eb05103f9a32d31e9ca6c4e4af02fc
Gerrit-Change-Number: 20865
Gerrit-PatchSet: 1
Gerrit-Owner: Preetham Poluparthi <[email protected]>