>From Ali Alsuliman <[email protected]>:

Ali Alsuliman has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21088?usp=email )


Change subject: correlation with LIMIT
......................................................................

correlation with LIMIT

Change-Id: Ie17ec11dd1e8ae1300de28956f389943dbe0fe0d
---
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java
1 file changed, 16 insertions(+), 6 deletions(-)



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

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java
index 497d21c..bd462fb 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java
@@ -274,7 +274,7 @@
         }

         // Get live variables before limit (or running aggregate) operator.
-        Set<LogicalVariable> inputLiveVars = new HashSet<LogicalVariable>();
+        Set<LogicalVariable> inputLiveVars = new HashSet<>();
         
VariableUtilities.getSubplanLocalLiveVariables(op.getInputs().get(0).getValue(),
 inputLiveVars);

         // Creates a record construction assign operator.
@@ -286,9 +286,9 @@
         assignOp.getInputs().add(new MutableObject<>(inputOp));

         // Rewrites limit (or running aggregate) to a group-by with limit (or 
running aggregate) as its nested operator.
-        Pair<ILogicalOperator, LogicalVariable> gbyOpAndAggVar =
+        Pair<GroupByOperator, LogicalVariable> gbyOpAndAggVar =
                 wrapLimitOrRunningAggregateInGroupBy(op, recordVar, 
inputLiveVars);
-        ILogicalOperator gbyOp = gbyOpAndAggVar.first;
+        GroupByOperator gbyOp = gbyOpAndAggVar.first;
         LogicalVariable aggVar = gbyOpAndAggVar.second;
         gbyOp.getInputs().add(new MutableObject<>(assignOp));

@@ -301,7 +301,7 @@

         // Adds field accesses to recover input live variables.
         ILogicalOperator fieldAccessAssignOp =
-                createFieldAccessAssignOperator(unnestVar, inputLiveVars, 
op.getSourceLocation());
+                createFieldAccessAssignOperator(unnestVar, inputLiveVars, 
op.getSourceLocation(), gbyOp);
         fieldAccessAssignOp.getInputs().add(new MutableObject<>(unnestOp));

         
OperatorManipulationUtil.computeTypeEnvironmentBottomUp(fieldAccessAssignOp, 
context);
@@ -331,7 +331,7 @@
         return new Pair<>(assignOp, recordVar);
     }

-    private Pair<ILogicalOperator, LogicalVariable> 
wrapLimitOrRunningAggregateInGroupBy(ILogicalOperator op,
+    private Pair<GroupByOperator, LogicalVariable> 
wrapLimitOrRunningAggregateInGroupBy(ILogicalOperator op,
             LogicalVariable recordVar, Set<LogicalVariable> inputLiveVars) 
throws AlgebricksException {
         SourceLocation sourceLoc = op.getSourceLocation();
         GroupByOperator gbyOp = new GroupByOperator();
@@ -417,7 +417,7 @@
     }

     private ILogicalOperator createFieldAccessAssignOperator(LogicalVariable 
recordVar,
-            Set<LogicalVariable> inputLiveVars, SourceLocation sourceLoc) {
+            Set<LogicalVariable> inputLiveVars, SourceLocation sourceLoc, 
GroupByOperator gbyOp) {
         List<LogicalVariable> fieldAccessVars = new ArrayList<>();
         List<Mutable<ILogicalExpression>> fieldAccessExprs = new ArrayList<>();
         // Adds field access by name.
@@ -426,6 +426,16 @@
                 // field Var
                 LogicalVariable newVar = context.newVar();
                 fieldAccessVars.add(newVar);
+                List<LogicalVariable> groupByVarList = 
gbyOp.getGroupByVarList();
+                int i = groupByVarList.indexOf(inputLiveVar);
+                if (i >= 0) {
+                    LogicalVariable fVar = 
gbyOp.getGroupByList().get(i).getFirst();
+                    VariableReferenceExpression keyVarRef = new 
VariableReferenceExpression(fVar);
+                    keyVarRef.setSourceLocation(sourceLoc);
+                    fieldAccessExprs.add(new MutableObject<>(keyVarRef));
+                    updateInputToOutputVarMapping(fVar, newVar, false);
+                    continue;
+                }
                 // fieldAcess expr
                 List<Mutable<ILogicalExpression>> argRefs = new ArrayList<>();
                 VariableReferenceExpression recordVarRef = new 
VariableReferenceExpression(recordVar);

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21088?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: trinity
Gerrit-Change-Id: Ie17ec11dd1e8ae1300de28956f389943dbe0fe0d
Gerrit-Change-Number: 21088
Gerrit-PatchSet: 1
Gerrit-Owner: Ali Alsuliman <[email protected]>

Reply via email to