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 <[email protected]> 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 <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> --- .../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; + } + } + } + } }
