>From Mehnaz Tabassum Mahin <[email protected]>:

Mehnaz Tabassum Mahin has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18131 )


Change subject: [NO ISSUE][COMP] Fix compile time errors in Distinct 
Cardinality Estimation
......................................................................

[NO ISSUE][COMP] Fix compile time errors in Distinct Cardinality Estimation

 Details:
 - Fixed each sampling query for tpcds queries compile error
 - Handled sampling queries for ASTERIXDB-3334 query

Change-Id: Ic31c3109a1f9cfc4ae12fb3a49273142973b240b
---
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetAsterixPhysicalOperatorsRule.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EstimatedCostComputationVisitor.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
M 
asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
M 
hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/SetAlgebricksPhysicalOperatorsRule.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
M 
asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/join-queries/join-queries.3.plan
M 
asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/OperatorUtils.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/cost/ICostMethods.java
M 
asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
12 files changed, 159 insertions(+), 96 deletions(-)



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

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/cost/ICostMethods.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/cost/ICostMethods.java
index 34143c1..a1dd374 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/cost/ICostMethods.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/cost/ICostMethods.java
@@ -47,4 +47,4 @@
     Cost costDistinct(DistinctOperator distinctOperator);

     Cost costOrderBy(OrderOperator orderOp);
-}
+}
\ No newline at end of file
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetAsterixPhysicalOperatorsRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetAsterixPhysicalOperatorsRule.java
index 6017774..9f69d17 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetAsterixPhysicalOperatorsRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetAsterixPhysicalOperatorsRule.java
@@ -430,4 +430,4 @@
             return true;
         }
     }
-}
+}
\ No newline at end of file
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
index fb99151..1c03519 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
@@ -447,31 +447,32 @@
         }
         ILogicalOperator grpByDistinctOp = null; // null indicates no 
DistinctOp or GroupByOp
         DataSourceScanOperator scanOp;
-        ILogicalOperator currentOp = op;
         while (true) {
-            LogicalOperatorTag tag = currentOp.getOperatorTag();
+            LogicalOperatorTag tag = op.getOperatorTag();
             if (tag == LogicalOperatorTag.DISTINCT || tag == 
LogicalOperatorTag.GROUP) {
-                grpByDistinctOp = currentOp; // GroupByOp Variable expressions 
(if any) take over DistinctOp ones
+                grpByDistinctOp = op; // GroupByOp Variable expressions (if 
any) take over DistinctOp ones
                 this.rootGroupByDistinctOp = grpByDistinctOp;
             } else if (tag == LogicalOperatorTag.INNERJOIN || tag == 
LogicalOperatorTag.LEFTOUTERJOIN) {
                 if (grpByDistinctOp != null) {
-                    for (int i = 0; i < currentOp.getInputs().size(); i++) {
-                        ILogicalOperator nextOp = 
currentOp.getInputs().get(i).getValue();
-                        OperatorUtils.createDistinctOpsForJoinNodes(nextOp, 
grpByDistinctOp, context,
-                                dataScanAndGroupByDistinctOps);
+                    Pair<List<LogicalVariable>, 
List<AbstractFunctionCallExpression>> distinctVarsFuncPair =
+                            
OperatorUtils.getGroupByDistinctVarFuncPair(grpByDistinctOp);
+                    for (int i = 0; i < op.getInputs().size(); i++) {
+                        ILogicalOperator nextOp = 
op.getInputs().get(i).getValue();
+                        OperatorUtils.createDistinctOpsForJoinNodes(nextOp, 
distinctVarsFuncPair.first,
+                                distinctVarsFuncPair.second, context, 
dataScanAndGroupByDistinctOps);
                     }
                 }
                 return;
             } else if (tag == LogicalOperatorTag.DATASOURCESCAN) { // single 
table queries
-                scanOp = (DataSourceScanOperator) currentOp;
+                scanOp = (DataSourceScanOperator) op;
                 // will work for any attributes present in GroupByOp or 
DistinctOp
                 if (grpByDistinctOp != null) {
                     dataScanAndGroupByDistinctOps.put(scanOp, grpByDistinctOp);
                 }
                 return;
             }
-            currentOp = currentOp.getInputs().get(0).getValue();
-            if (currentOp.getOperatorTag() == 
LogicalOperatorTag.EMPTYTUPLESOURCE) {
+            op = op.getInputs().get(0).getValue();
+            if (op.getOperatorTag() == LogicalOperatorTag.EMPTYTUPLESOURCE) {
                 return; // if this happens, there is nothing we can do in CBO 
code since there is no DataSourceScan
             }
         }
@@ -1037,4 +1038,4 @@
         }
         return true;
     }
-}
+}
\ No newline at end of file
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EstimatedCostComputationVisitor.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EstimatedCostComputationVisitor.java
index 44d9da6..4874417 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EstimatedCostComputationVisitor.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EstimatedCostComputationVisitor.java
@@ -403,4 +403,4 @@

         return cardCost;
     }
-}
+}
\ No newline at end of file
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
index aee590b..7c7e20c 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
@@ -1095,4 +1095,4 @@
         PhysicalOptimizationConfig physOptConfig = 
context.getPhysicalOptimizationConfig();
         return physOptConfig.getQueryPlanShapeMode();
     }
-}
+}
\ No newline at end of file
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/OperatorUtils.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/OperatorUtils.java
index f20e912..3d9e1ea 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/OperatorUtils.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/OperatorUtils.java
@@ -20,9 +20,9 @@
 package org.apache.asterix.optimizer.rules.cbo;

 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;

 import org.apache.asterix.om.base.AString;
 import org.apache.asterix.om.constants.AsterixConstantValue;
@@ -48,43 +48,47 @@

 public class OperatorUtils {

-    public static void createDistinctOpsForJoinNodes(ILogicalOperator op, 
ILogicalOperator grpByDistinctOp,
-            IOptimizationContext context, Map<DataSourceScanOperator, 
ILogicalOperator> scanAndDistinctOps) {
-        if (op == null) {
+    public static void createDistinctOpsForJoinNodes(ILogicalOperator op, 
List<LogicalVariable> distinctVars,
+            List<AbstractFunctionCallExpression> distinctFunctions, 
IOptimizationContext context,
+            HashMap<DataSourceScanOperator, ILogicalOperator> map) {
+        if (op == null || distinctVars.size() == 0) {
             return;
         }

         List<LogicalVariable> foundDistinctVars = new ArrayList<>();
         ILogicalOperator selOp = null, assignOp = null;

-        ILogicalOperator currentOp = op;
-        LogicalOperatorTag tag = currentOp.getOperatorTag();
+        LogicalOperatorTag tag = op.getOperatorTag();
         // add DistinctOp to count distinct values in an attribute
-        if (tag == LogicalOperatorTag.ASSIGN || tag == 
LogicalOperatorTag.SELECT
-                || tag == LogicalOperatorTag.DATASOURCESCAN) {
-            Pair<List<LogicalVariable>, List<AbstractFunctionCallExpression>> 
distinctPair =
-                    getGroupByDistinctVarFuncPair(grpByDistinctOp);
-            List<LogicalVariable> distinctVars = distinctPair.first;
-            if (distinctVars.size() == 0) {
-                return;
+        if (tag == LogicalOperatorTag.INNERJOIN || tag == 
LogicalOperatorTag.LEFTOUTERJOIN) {
+            for (int i = 0; i < op.getInputs().size(); i++) {
+                ILogicalOperator nextOp = op.getInputs().get(i).getValue();
+                createDistinctOpsForJoinNodes(nextOp, distinctVars, 
distinctFunctions, context, map);
             }
-
+        } else {
             DataSourceScanOperator scanOp = null;
             LogicalVariable assignVar;
             while (tag != LogicalOperatorTag.EMPTYTUPLESOURCE) {
                 if (tag == LogicalOperatorTag.SELECT) {
-                    selOp = currentOp;
+                    ILogicalOperator nextOp = op.getInputs().get(0).getValue();
+                    if (nextOp.getOperatorTag() == LogicalOperatorTag.ASSIGN
+                            || nextOp.getOperatorTag() == 
LogicalOperatorTag.DATASOURCESCAN) {
+                        if (selOp == null && assignOp == null) { // first 
corresponding SelectOp found iff no corresponding AssignOp appeared before
+                            selOp = op; // one DataSourceScanOp possible, save 
the corresponding SelectOp
+                        }
+                    }
                 } else if (tag == LogicalOperatorTag.ASSIGN) {
-                    assignVar = ((AssignOperator) 
currentOp).getVariables().get(0);
+                    assignVar = ((AssignOperator) op).getVariables().get(0);
                     int idx = distinctVars.indexOf(assignVar);
                     if (idx != -1 && assignOp == null) { // first 
corresponding AssignOp found
-                        assignOp = currentOp;
+                        assignOp = op;
                     }
                     if (idx != -1) { // add all variables of the AssignOp
                         foundDistinctVars.add(assignVar);
                     }
                 } else if (tag == LogicalOperatorTag.DATASOURCESCAN) {
-                    scanOp = (DataSourceScanOperator) currentOp;
+                    scanOp = (DataSourceScanOperator) op;
+                    // will work for any attributes present in GroupByOp or 
DistinctOp
                     List<LogicalVariable> scanVars = scanOp.getVariables();
                     for (LogicalVariable scanVar : scanVars) { // add all 
required variables of the DataSourceScanOp
                         if (distinctVars.contains(scanVar)) {
@@ -94,24 +98,63 @@
                     if (foundDistinctVars.size() == 0) {
                         scanOp = null; // GroupByOp or DistinctOp doesn't 
contain any attributes of the dataset
                     }
+                } else if (tag == LogicalOperatorTag.GROUP) { // GroupByOp 
found through looping (not as direct inputs of a JoinOp)
+                    List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> 
nestedGrpVarsList =
+                            ((GroupByOperator) op).getGroupByList();
+                    // look for any DistinctOp/GroupByOp variables are 
replaceable with a nested GroupByOp Variable-expression
+                    for (int i = 0; i < nestedGrpVarsList.size(); i++) {
+                        LogicalVariable prevVar = 
nestedGrpVarsList.get(i).first;
+                        int idx = distinctVars.indexOf(prevVar);
+                        if (idx != -1 && distinctVars.size() > 0) {
+                            ILogicalExpression expr = 
nestedGrpVarsList.get(i).second.getValue();
+                            if (expr.getExpressionTag() == 
LogicalExpressionTag.VARIABLE) {
+                                LogicalVariable newVar = 
((VariableReferenceExpression) expr).getVariableReference();
+                                distinctVars.remove(idx);
+                                distinctVars.add(newVar);
+
+                                // replace corresponding functions' variables
+                                for (AbstractFunctionCallExpression funcExpr : 
distinctFunctions) {
+                                    replaceVariableInFunction(funcExpr, 
prevVar, newVar);
+                                }
+                            }
+                        }
+                    }
+                } else if (tag == LogicalOperatorTag.INNERJOIN || tag == 
LogicalOperatorTag.LEFTOUTERJOIN) {
+                    for (int i = 0; i < op.getInputs().size(); i++) {
+                        ILogicalOperator nextOp = 
op.getInputs().get(i).getValue();
+                        createDistinctOpsForJoinNodes(nextOp, distinctVars, 
distinctFunctions, context, map);
+                    }
+                    break; // next operators are already handled in the 
recursion, so exit looping
                 }
-                currentOp = currentOp.getInputs().get(0).getValue();
-                tag = currentOp.getOperatorTag();
+                // TODO(mehnaz): handle DISTINCT and UNNEST operators (if 
appears in sub-queries)
+
+                // proceed to the next operator
+                op = op.getInputs().get(0).getValue();
+                tag = op.getOperatorTag();
             }

             if (scanOp != null) {
-                ILogicalOperator inputOp = (assignOp != null) ? assignOp : 
((selOp != null) ? selOp : scanOp);
+                ILogicalOperator inputOp = (selOp != null) ? selOp : 
((assignOp != null) ? assignOp : scanOp);
                 SourceLocation sourceLocation = inputOp.getSourceLocation();
                 DistinctOperator distinctOp =
-                        createDistinctOp(foundDistinctVars, inputOp, 
sourceLocation, distinctPair.second, context);
+                        createDistinctOp(foundDistinctVars, inputOp, 
sourceLocation, distinctFunctions, context);
                 if (distinctOp != null) {
-                    scanAndDistinctOps.put(scanOp, distinctOp);
+                    map.put(scanOp, distinctOp);
                 }
             }
-        } else if (tag == LogicalOperatorTag.INNERJOIN || tag == 
LogicalOperatorTag.LEFTOUTERJOIN) {
-            for (int i = 0; i < currentOp.getInputs().size(); i++) {
-                ILogicalOperator nextOp = 
currentOp.getInputs().get(i).getValue();
-                createDistinctOpsForJoinNodes(nextOp, grpByDistinctOp, 
context, scanAndDistinctOps);
+        }
+    }
+
+    private static void 
replaceVariableInFunction(AbstractFunctionCallExpression funcExpr, 
LogicalVariable prevVar,
+            LogicalVariable newVar) {
+        List<Mutable<ILogicalExpression>> argList = funcExpr.getArguments();
+        for (Mutable<ILogicalExpression> arg : argList) {
+            if (arg.getValue().getExpressionTag() == 
LogicalExpressionTag.VARIABLE) {
+                if (prevVar.equals(((VariableReferenceExpression) 
arg.getValue()).getVariableReference())) {
+                    arg.getValue().substituteVar(prevVar, newVar);
+                }
+            } else if (arg.getValue().getExpressionTag() == 
LogicalExpressionTag.FUNCTION_CALL) {
+                replaceVariableInFunction((AbstractFunctionCallExpression) 
arg.getValue(), prevVar, newVar);
             }
         }
     }
@@ -129,41 +172,52 @@
         return variables;
     }

-    private static Pair<List<LogicalVariable>, 
List<AbstractFunctionCallExpression>> getGroupByDistinctVarFuncPair(
+    public static Pair<List<LogicalVariable>, 
List<AbstractFunctionCallExpression>> getGroupByDistinctVarFuncPair(
             ILogicalOperator grpByDistinctOp) {
-
-        Pair<List<LogicalVariable>, List<AbstractFunctionCallExpression>> 
distinctVarsFunctions =
-                new Pair<>(new ArrayList<>(), new ArrayList<>());
-        List<LogicalVariable> distinctVars = distinctVarsFunctions.getFirst();
-        List<AbstractFunctionCallExpression> distinctFunctions = 
distinctVarsFunctions.getSecond();
-
+        List<LogicalVariable> distinctVars = new ArrayList<>();
+        List<AbstractFunctionCallExpression> distinctFunctions = new 
ArrayList<>();
         if (grpByDistinctOp == null) {
-            return distinctVarsFunctions;
+            return new Pair<>(distinctVars, distinctFunctions);
         }

         ILogicalExpression varRef;
         ILogicalOperator nextOp;
         if (grpByDistinctOp.getOperatorTag() == LogicalOperatorTag.DISTINCT) {
-            nextOp = grpByDistinctOp.getInputs().get(0).getValue();
-            if (nextOp.getOperatorTag() == LogicalOperatorTag.ASSIGN) {
-                ILogicalExpression assignExpr = ((AssignOperator) 
nextOp).getExpressions().get(0).getValue();
-                if (assignExpr.getExpressionTag() == 
LogicalExpressionTag.FUNCTION_CALL) { // FId: open-object-constructor
-                    List<Mutable<ILogicalExpression>> argList =
-                            ((AbstractFunctionCallExpression) 
assignExpr).getArguments();
-                    for (int i = 0; i < argList.size(); i += 2) {
-                        // Only odd position arguments are field value 
expressions.
-                        varRef = argList.get(i + 1).getValue();
-                        if (varRef.getExpressionTag() == 
LogicalExpressionTag.VARIABLE) {
-                            distinctVars.add(((VariableReferenceExpression) 
varRef).getVariableReference());
-                        } else if (varRef.getExpressionTag() == 
LogicalExpressionTag.FUNCTION_CALL) {
-                            
distinctVars.addAll(getFunctionVariables((AbstractFunctionCallExpression) 
varRef));
-                            
distinctFunctions.add((AbstractFunctionCallExpression) varRef);
+            ILogicalExpression distinctExpr = ((DistinctOperator) 
grpByDistinctOp).getExpressions().get(0).getValue();
+            if (distinctExpr.getExpressionTag() == 
LogicalExpressionTag.VARIABLE) { // this Distinct expression should be a 
variable
+                distinctVars.add(((VariableReferenceExpression) 
distinctExpr).getVariableReference()); // initial Variable-expression
+                nextOp = grpByDistinctOp.getInputs().get(0).getValue();
+
+                // loop through as long as AssignOp variable does not match 
with DistinctOp Variable-expression
+                while (nextOp.getOperatorTag() == LogicalOperatorTag.ASSIGN) {
+                    LogicalVariable assignVar = ((AssignOperator) 
nextOp).getVariables().get(0);
+                    if (assignVar.equals(((VariableReferenceExpression) 
distinctExpr).getVariableReference())) {
+                        assert distinctVars.size() == 1;
+                        distinctVars.remove(0); // remove initial 
Variable-expression of DistinctOp
+
+                        ILogicalExpression assignExpr = ((AssignOperator) 
nextOp).getExpressions().get(0).getValue();
+                        if (assignExpr.getExpressionTag() == 
LogicalExpressionTag.FUNCTION_CALL) { // FId: open-object-constructor
+                            List<Mutable<ILogicalExpression>> argList =
+                                    ((AbstractFunctionCallExpression) 
assignExpr).getArguments();
+
+                            // add all variables and the corresponding 
functions from AssignOp arguments
+                            for (int i = 0; i < argList.size(); i += 2) {
+                                varRef = argList.get(i + 1).getValue();
+                                if (varRef.getExpressionTag() == 
LogicalExpressionTag.VARIABLE) {
+                                    
distinctVars.add(((VariableReferenceExpression) varRef).getVariableReference());
+                                } else if (varRef.getExpressionTag() == 
LogicalExpressionTag.FUNCTION_CALL) {
+                                    
distinctVars.addAll(getFunctionVariables((AbstractFunctionCallExpression) 
varRef));
+                                    
distinctFunctions.add((AbstractFunctionCallExpression) 
varRef.cloneExpression());
+                                }
+                            }
                         }
+                        break;
                     }
+                    nextOp = nextOp.getInputs().get(0).getValue();
                 }
             }
         } else if (grpByDistinctOp.getOperatorTag() == 
LogicalOperatorTag.GROUP) {
-            distinctVars.addAll(((GroupByOperator) 
grpByDistinctOp).getGroupByVarList());
+            distinctVars = ((GroupByOperator) 
grpByDistinctOp).getGroupByVarList();
             nextOp = grpByDistinctOp.getInputs().get(0).getValue();
             LogicalOperatorTag tag = nextOp.getOperatorTag();
             while (tag != LogicalOperatorTag.DATASOURCESCAN) {
@@ -178,7 +232,7 @@
                         if (idx != -1 && fVars.size() > 0) {
                             distinctVars.remove(idx);
                             distinctVars.addAll(fVars);
-                            
distinctFunctions.add((AbstractFunctionCallExpression) assignExpr);
+                            
distinctFunctions.add((AbstractFunctionCallExpression) 
assignExpr.cloneExpression());
                         }
                     }
                 }
@@ -186,7 +240,7 @@
                 tag = nextOp.getOperatorTag();
             }
         }
-        return distinctVarsFunctions;
+        return new Pair<>(distinctVars, distinctFunctions);
     }

     private static AssignOperator 
createAssignOpForFunctionExpr(IOptimizationContext optCtx,
@@ -197,14 +251,12 @@
         List<Mutable<ILogicalExpression>> openRecConsArgs = new ArrayList<>();
         for (AbstractFunctionCallExpression expr : funcExpr) {
             List<LogicalVariable> funcVars = getFunctionVariables(expr);
-            if (new HashSet<>(distinctVars).containsAll(funcVars)) {
-                // all variables in the function are of the current dataset
+            if (new HashSet<>(distinctVars).containsAll(funcVars)) { // all 
variables in the function are of the current dataset
                 openRecConsArgs.add(new MutableObject<>(
                         new ConstantExpression(new AsterixConstantValue(new 
AString(String.valueOf(counter))))));
                 openRecConsArgs.add(new MutableObject<>(expr));
                 counter++;
-                // DistinctOp variables are found in the function, so remove
-                notFoundDistinctVars.removeAll(funcVars);
+                notFoundDistinctVars.removeAll(funcVars); // DistinctOp 
variables are found in the function, so remove
             }
         }
         if (openRecConsArgs.size() > 0) { // at least one Function expression 
is available/applicable
@@ -243,8 +295,7 @@
             for (LogicalVariable var : distinctVars) {
                 VariableReferenceExpression varExpr = new 
VariableReferenceExpression(var);
                 varExpr.setSourceLocation(sourceLocation);
-                Mutable<ILogicalExpression> vRef = new 
MutableObject<>(varExpr);
-                distinctExpr.add(vRef);
+                distinctExpr.add(new MutableObject<>(varExpr));
             }
         } else {
             VariableReferenceExpression varExpr = new 
VariableReferenceExpression(assignOp.getVariables().get(0));
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
index 0023874..6f91694 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
@@ -894,17 +894,15 @@

     private ILogicalOperator findParentOfSelectOp(ILogicalOperator op) {
         ILogicalOperator parent = null;
-        ILogicalOperator currentOp = op;
-        LogicalOperatorTag tag = currentOp.getOperatorTag();
-
+        LogicalOperatorTag tag = op.getOperatorTag();
         while (tag != LogicalOperatorTag.DATASOURCESCAN) {
             if (tag == LogicalOperatorTag.SELECT) {
                 return parent;
             }
-            parent = currentOp;
-            currentOp = currentOp.getInputs().get(0).getValue();
-            tag = currentOp.getOperatorTag();
+            parent = op;
+            op = op.getInputs().get(0).getValue();
+            tag = op.getOperatorTag();
         }
         return null; // no SelectOp in the query tree
     }
-}
+}
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
index 91cd909..3a82fb7 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
@@ -3,12 +3,12 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- SORT_MERGE_EXCHANGE [$$su_nationkey(ASC), $#1(ASC), $#2(ASC) ]  
|PARTITIONED|
-          -- SORT_GROUP_BY[$$326, $$327, $$328]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$328, $$329, $$330]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
-            -- HASH_PARTITION_EXCHANGE [$$326, $$327, $$328]  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$328, $$329, $$330]  |PARTITIONED|
               -- SORT_GROUP_BY[$$277, $$273, $$274]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
@@ -25,8 +25,8 @@
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   -- STREAM_PROJECT  |PARTITIONED|
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- HYBRID_HASH_JOIN [$$324][$$300]  
|PARTITIONED|
-                                        -- HASH_PARTITION_EXCHANGE [$$324]  
|PARTITIONED|
+                                      -- HYBRID_HASH_JOIN [$$326][$$300]  
|PARTITIONED|
+                                        -- HASH_PARTITION_EXCHANGE [$$326]  
|PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             -- ASSIGN  |PARTITIONED|
                                               -- STREAM_PROJECT  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
index 16343e7..cad6a92 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
@@ -3,12 +3,12 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- SORT_MERGE_EXCHANGE [$#1(ASC) ]  |PARTITIONED|
-          -- SORT_GROUP_BY[$$350]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$351]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
-            -- HASH_PARTITION_EXCHANGE [$$350]  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$351]  |PARTITIONED|
               -- SORT_GROUP_BY[$$294]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
@@ -23,8 +23,8 @@
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                               -- STREAM_PROJECT  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  -- HYBRID_HASH_JOIN [$$347][$$341]  
|PARTITIONED|
-                                    -- HASH_PARTITION_EXCHANGE [$$347]  
|PARTITIONED|
+                                  -- HYBRID_HASH_JOIN [$$348][$$341]  
|PARTITIONED|
+                                    -- HASH_PARTITION_EXCHANGE [$$348]  
|PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ASSIGN  |PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
index 7283aa0..12f531e 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
@@ -3,12 +3,12 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- SORT_MERGE_EXCHANGE [$$n_name(ASC), $#1(DESC) ]  |PARTITIONED|
-          -- SORT_GROUP_BY[$$230, $$231]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$231, $$232]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
-            -- HASH_PARTITION_EXCHANGE [$$230, $$231]  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$231, $$232]  |PARTITIONED|
               -- SORT_GROUP_BY[$$225, $$198]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
@@ -23,8 +23,8 @@
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                               -- STREAM_PROJECT  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  -- HYBRID_HASH_JOIN [$$228][$$224]  
|PARTITIONED|
-                                    -- HASH_PARTITION_EXCHANGE [$$228]  
|PARTITIONED|
+                                  -- HYBRID_HASH_JOIN [$$229][$$224]  
|PARTITIONED|
+                                    -- HASH_PARTITION_EXCHANGE [$$229]  
|PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ASSIGN  |PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/join-queries/join-queries.3.plan
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/join-queries/join-queries.3.plan
index 25d39e0..cd3f2d4 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/join-queries/join-queries.3.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/join-queries/join-queries.3.plan
@@ -1,8 +1,8 @@
-distribute result [$$35] [cardinality: 924.07, op-cost: 0.0, total-cost: 
136471.34]
+distribute result [$$35] [cardinality: 960.71, op-cost: 0.0, total-cost: 
136471.34]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 924.07, op-cost: 0.0, total-cost: 136471.34]
+  exchange [cardinality: 960.71, op-cost: 0.0, total-cost: 136471.34]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    distinct ([$$35]) [cardinality: 924.07, op-cost: 58474.7, total-cost: 
136471.34]
+    distinct ([$$35]) [cardinality: 960.71, op-cost: 58474.7, total-cost: 
136471.34]
     -- PRE_SORTED_DISTINCT_BY  |PARTITIONED|
       exchange [cardinality: 4783.64, op-cost: 0.0, total-cost: 77996.64]
       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git 
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/SetAlgebricksPhysicalOperatorsRule.java
 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/SetAlgebricksPhysicalOperatorsRule.java
index 457597f..f945994 100644
--- 
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/SetAlgebricksPhysicalOperatorsRule.java
+++ 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/SetAlgebricksPhysicalOperatorsRule.java
@@ -648,4 +648,4 @@
             }
         }
     }
-}
+}
\ No newline at end of file

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18131
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings

Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Change-Id: Ic31c3109a1f9cfc4ae12fb3a49273142973b240b
Gerrit-Change-Number: 18131
Gerrit-PatchSet: 1
Gerrit-Owner: Mehnaz Tabassum Mahin <[email protected]>
Gerrit-MessageType: newchange

Reply via email to