You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by al...@apache.org on 2023/02/27 20:29:01 UTC

[asterixdb] 01/16: [ASTERIXDB-3107][COMP] Add card/cost info for unnest_map operator

This is an automated email from the ASF dual-hosted git repository.

alsuliman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git

commit 2eb93874971f4a42a352f33cf05c8042a118d8c9
Author: Vijay Sarathy <vi...@couchbase.com>
AuthorDate: Mon Feb 13 11:43:02 2023 -0800

    [ASTERIXDB-3107][COMP] Add card/cost info for unnest_map operator
    
    Change-Id: I69ad4760c4026663107192f2f349eceec8e49efe
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17372
    Reviewed-by: Vijay Sarathy <vi...@couchbase.com>
    Reviewed-by: Ali Alsuliman <al...@gmail.com>
    Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
---
 .../optimizer/rules/am/AccessMethodUtils.java      |  2 ++
 .../optimizer/rules/am/BTreeAccessMethod.java      |  1 +
 .../optimizer/rules/cbo/EnumerateJoinsRule.java    |  1 +
 .../rules/cbo/EstimatedCostComputationVisitor.java | 12 +++++++++++-
 .../algebra/util/OperatorManipulationUtil.java     | 22 ++++++++++++++++++++++
 5 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
index 256551fc81..ecf035227c 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
@@ -963,6 +963,7 @@ public class AccessMethodUtils {
                     leftOuterMissingValue, context, sourceLoc);
         }
 
+        OperatorManipulationUtil.copyCardCostAnnotations(joinRef.getValue(), finalOp);
         joinRef.setValue(finalOp);
         return true;
     }
@@ -3050,6 +3051,7 @@ public class AccessMethodUtils {
                 if (optFuncExpr != null) {
                     optFuncExpr.setSourceVar(funcVarIndex, ((AssignOperator) op).getVariables().get(assignVarIndex));
                 }
+
                 //add fieldName to the nested fieldName, return
                 if (nestedAccessFieldName != null) {
                     parentFieldNames.first.addAll(nestedAccessFieldName);
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
index 7c09b59746..2a94359e1a 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
@@ -796,6 +796,7 @@ public class BTreeAccessMethod implements IAccessMethod {
                     metaRecordType, dataset, context);
         }
 
+        OperatorManipulationUtil.copyCardCostAnnotations(dataSourceOp, indexSearchOp);
         return indexSearchOp;
     }
 
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 20b4d82cbd..40c25f920e 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
@@ -408,6 +408,7 @@ public class EnumerateJoinsRule implements IAlgebraicRewriteRule {
         if (leftInput.getOperatorTag() == LogicalOperatorTag.SELECT) {
             addCardCostAnnotations(leftInput, plan);
         }
+        addCardCostAnnotations(findDataSourceScanOperator(leftInput), plan);
     }
 
     private void buildNewTree(PlanNode plan, HashMap<EmptyTupleSourceOperator, ILogicalOperator> joinLeafInputsHashMap,
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 f9f34bf0d7..3943cf4b09 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
@@ -208,7 +208,17 @@ public class EstimatedCostComputationVisitor implements ILogicalOperatorVisitor<
 
     @Override
     public Pair<Double, Double> visitUnnestMapOperator(UnnestMapOperator op, Double arg) throws AlgebricksException {
-        return annotate(this, op, arg);
+        Pair<Double, Double> cardCost = new Pair<>(0.0, 0.0);
+
+        for (Map.Entry<String, Object> anno : op.getAnnotations().entrySet()) {
+            if (anno.getValue() != null && anno.getKey().equals(OperatorAnnotations.OP_OUTPUT_CARDINALITY)) {
+                cardCost.setFirst((Double) anno.getValue());
+            } else if (anno.getValue() != null && anno.getKey().equals(OperatorAnnotations.OP_COST_TOTAL)) {
+                cardCost.setSecond((Double) anno.getValue());
+            }
+        }
+
+        return cardCost;
     }
 
     @Override
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 3e8a95f7f0..3457751ec7 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
@@ -40,6 +40,7 @@ import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
 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.base.OperatorAnnotations;
 import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
 import org.apache.hyracks.algebricks.core.algebra.expressions.VariableReferenceExpression;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
@@ -522,4 +523,25 @@ public class OperatorManipulationUtil {
             }
         }
     }
+
+    public static void copyCardCostAnnotations(ILogicalOperator sourceOp, ILogicalOperator destOp) {
+        for (Map.Entry<String, Object> anno : sourceOp.getAnnotations().entrySet()) {
+            Object annotationVal = anno.getValue();
+            if (annotationVal != null) {
+                String annotation = anno.getKey();
+                switch (annotation) {
+                    case OperatorAnnotations.OP_COST_LOCAL:
+                    case OperatorAnnotations.OP_COST_TOTAL:
+                    case OperatorAnnotations.OP_INPUT_CARDINALITY:
+                    case OperatorAnnotations.OP_OUTPUT_CARDINALITY:
+                    case OperatorAnnotations.OP_LEFT_EXCHANGE_COST:
+                    case OperatorAnnotations.OP_RIGHT_EXCHANGE_COST:
+                        destOp.getAnnotations().put(annotation, annotationVal);
+                        break;
+                    default:
+                        break;
+                }
+            }
+        }
+    }
 }