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

Reply via email to