This is an automated email from the ASF dual-hosted git repository.
vsarathy1 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push:
new 2ad8a9c78f [ASTERIXDB-3094][COMP] Add cost and cardinality to explain
2ad8a9c78f is described below
commit 2ad8a9c78f53907ec1489f354416028b2ebf5596
Author: Vijay Sarathy <[email protected]>
AuthorDate: Thu Dec 15 09:50:57 2022 -0800
[ASTERIXDB-3094][COMP] Add cost and cardinality to explain
Change-Id: I7b4a6c78dca3326f070e1dda888d774dc6100c0b
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17301
Integration-Tests: Jenkins <[email protected]>
Tested-by: Jenkins <[email protected]>
Reviewed-by: Ali Alsuliman <[email protected]>
---
.../optimizer/rules/cbo/EnumerateJoinsRule.java | 2 +-
.../rules/cbo/EstimatedCostComputationVisitor.java | 14 ++--
.../apache/asterix/api/common/APIFramework.java | 25 +++---
.../api/compileonly/compileonly.2.regexjson | 1 +
.../core/algebra/plan/ALogicalPlanImpl.java | 2 +-
.../core/algebra/plan/PlanStabilityVerifier.java | 2 +-
.../algebra/prettyprint/IPlanPrettyPrinter.java | 10 ++-
.../LogicalOperatorPrettyPrintVisitor.java | 11 +--
.../LogicalOperatorPrettyPrintVisitorJson.java | 97 ++++++++++++++++------
.../core/rewriter/base/HeuristicOptimizer.java | 2 +-
.../core/algebra/plan/PlanVerifierTestBase.java | 2 +-
11 files changed, 113 insertions(+), 55 deletions(-)
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 dc722e11f8..20b4d82cbd 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
@@ -513,7 +513,7 @@ public class EnumerateJoinsRule implements
IAlgebraicRewriteRule {
throws AlgebricksException {
if (LOGGER.isTraceEnabled()) {
pp.reset();
- pp.printOperator(op, true);
+ pp.printOperator(op, true, false);
LOGGER.trace("----------------------------
{}\n{}\n----------------------------", text, pp);
}
}
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 9b9fd28a82..f9f34bf0d7 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
@@ -86,7 +86,7 @@ public class EstimatedCostComputationVisitor implements
ILogicalOperatorVisitor<
public Pair<Double, Double>
visitEmptyTupleSourceOperator(EmptyTupleSourceOperator op, Double arg)
throws AlgebricksException {
// Empty tuple source operator sends an empty tuple to downstream
operators.
- return new Pair<>(1.0, 1.0);
+ return new Pair<>(0.0, 0.0);
}
@Override
@@ -220,7 +220,7 @@ public class EstimatedCostComputationVisitor implements
ILogicalOperatorVisitor<
@Override
public Pair<Double, Double> visitDataScanOperator(DataSourceScanOperator
op, Double arg)
throws AlgebricksException {
- Pair<Double, Double> cardCost = new Pair<>(1.0, 1.0);
+ 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_INPUT_CARDINALITY)) {
@@ -250,7 +250,7 @@ public class EstimatedCostComputationVisitor implements
ILogicalOperatorVisitor<
op.getAnnotations().put(OperatorAnnotations.OP_COST_LOCAL,
exchCost);
op.getAnnotations().put(OperatorAnnotations.OP_COST_TOTAL,
exchCost + cardCost.getSecond());
} else {
- op.getAnnotations().put(OperatorAnnotations.OP_COST_LOCAL,
cardCost.getSecond());
+ op.getAnnotations().put(OperatorAnnotations.OP_COST_LOCAL, 0.0);
op.getAnnotations().put(OperatorAnnotations.OP_COST_TOTAL,
cardCost.getSecond());
}
op.getAnnotations().put(OperatorAnnotations.OP_OUTPUT_CARDINALITY,
cardCost.getFirst());
@@ -305,12 +305,12 @@ public class EstimatedCostComputationVisitor implements
ILogicalOperatorVisitor<
private static Pair<Double, Double>
annotate(EstimatedCostComputationVisitor visitor, ILogicalOperator op,
Double arg) throws AlgebricksException {
if (op.getInputs().isEmpty()) {
- return new Pair<>(1.0, 1.0);
+ return new Pair<>(0.0, 0.0);
}
Pair<Double, Double> cardCost =
op.getInputs().get(0).getValue().accept(visitor, arg);
op.getAnnotations().put(OperatorAnnotations.OP_OUTPUT_CARDINALITY,
cardCost.getFirst());
op.getAnnotations().put(OperatorAnnotations.OP_COST_TOTAL,
cardCost.getSecond());
- op.getAnnotations().put(OperatorAnnotations.OP_COST_LOCAL,
cardCost.getSecond());
+ op.getAnnotations().put(OperatorAnnotations.OP_COST_LOCAL, 0.0);
return cardCost;
}
@@ -322,9 +322,9 @@ public class EstimatedCostComputationVisitor implements
ILogicalOperatorVisitor<
return operator.getInputs().get(0).getValue().accept(this, arg);
}
- // Visits an inner join operator, particularly, deals with the case the
join is a cartesian product.
+ // Visits an inner join operator.
private Pair<Double, Double> visitInnerJoin(InnerJoinOperator
joinOperator, Double arg) throws AlgebricksException {
- Pair<Double, Double> cardCost = new Pair<>(1.0, 1.0);
+ Pair<Double, Double> cardCost = new Pair<>(0.0, 0.0);
ILogicalOperator left = joinOperator.getInputs().get(0).getValue();
ILogicalOperator right = joinOperator.getInputs().get(1).getValue();
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
index adcdcb221f..597e7cc950 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
@@ -212,7 +212,7 @@ public class APIFramework {
if ((isQuery || isLoad) &&
!conf.is(SessionConfig.FORMAT_ONLY_PHYSICAL_OPS)
&& conf.is(SessionConfig.OOB_LOGICAL_PLAN)) {
- generateLogicalPlan(plan, output.config().getPlanFormat());
+ generateLogicalPlan(plan, output.config().getPlanFormat(),
isExplainOnly);
}
ICcApplicationContext ccAppContext =
metadataProvider.getApplicationContext();
CompilerProperties compilerProperties =
ccAppContext.getCompilerProperties();
@@ -295,7 +295,7 @@ public class APIFramework {
if (!conf.isGenerateJobSpec()) {
if (isQuery || isLoad) {
- generateOptimizedLogicalPlan(plan,
output.config().getPlanFormat());
+ generateOptimizedLogicalPlan(plan,
output.config().getPlanFormat(), isExplainOnly);
}
return null;
}
@@ -320,7 +320,8 @@ public class APIFramework {
if (conf.is(SessionConfig.OOB_OPTIMIZED_LOGICAL_PLAN) ||
isExplainOnly) {
if (isQuery || isLoad) {
- generateOptimizedLogicalPlan(plan,
spec.getLogical2PhysicalMap(), output.config().getPlanFormat());
+ generateOptimizedLogicalPlan(plan,
spec.getLogical2PhysicalMap(), output.config().getPlanFormat(),
+ isExplainOnly);
}
}
@@ -517,18 +518,22 @@ public class APIFramework {
}
}
- private void generateLogicalPlan(ILogicalPlan plan,
SessionConfig.PlanFormat format) throws AlgebricksException {
-
executionPlans.setLogicalPlan(getPrettyPrintVisitor(format).printPlan(plan).toString());
+ private void generateLogicalPlan(ILogicalPlan plan,
SessionConfig.PlanFormat format,
+ boolean printOptimizerEstimates) throws AlgebricksException {
+ executionPlans
+ .setLogicalPlan(getPrettyPrintVisitor(format).printPlan(plan,
printOptimizerEstimates).toString());
}
private void generateOptimizedLogicalPlan(ILogicalPlan plan, Map<Object,
String> log2phys,
- SessionConfig.PlanFormat format) throws AlgebricksException {
-
executionPlans.setOptimizedLogicalPlan(getPrettyPrintVisitor(format).printPlan(plan,
log2phys).toString());
+ SessionConfig.PlanFormat format, boolean printOptimizerEstimates)
throws AlgebricksException {
+ executionPlans.setOptimizedLogicalPlan(
+ getPrettyPrintVisitor(format).printPlan(plan, log2phys,
printOptimizerEstimates).toString());
}
- private void generateOptimizedLogicalPlan(ILogicalPlan plan,
SessionConfig.PlanFormat format)
- throws AlgebricksException {
-
executionPlans.setOptimizedLogicalPlan(getPrettyPrintVisitor(format).printPlan(plan).toString());
+ private void generateOptimizedLogicalPlan(ILogicalPlan plan,
SessionConfig.PlanFormat format,
+ boolean printOptimizerEstimates) throws AlgebricksException {
+ executionPlans.setOptimizedLogicalPlan(
+ getPrettyPrintVisitor(format).printPlan(plan,
printOptimizerEstimates).toString());
}
private void generateJob(JobSpecification spec) {
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/compileonly/compileonly.2.regexjson
b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/compileonly/compileonly.2.regexjson
index 40a764c29a..9856681ddc 100644
---
a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/compileonly/compileonly.2.regexjson
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/compileonly/compileonly.2.regexjson
@@ -4,6 +4,7 @@
"expressions":"R{.*}",
"operatorId":"R{.*}",
"execution-mode":"R{.*}",
+
"optimizer-estimates":{"cardinality":0.0,"op-cost":0.0,"total-cost":0.0},
"inputs":"R{.*}"
}
}
\ No newline at end of file
diff --git
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/plan/ALogicalPlanImpl.java
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/plan/ALogicalPlanImpl.java
index b5b01a0b45..1bf257919a 100644
---
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/plan/ALogicalPlanImpl.java
+++
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/plan/ALogicalPlanImpl.java
@@ -53,7 +53,7 @@ public class ALogicalPlanImpl implements ILogicalPlan {
}
public static String prettyPrintPlan(ILogicalPlan plan) throws
AlgebricksException {
- return
PlanPrettyPrinter.createStringPlanPrettyPrinter().printPlan(plan).toString();
+ return
PlanPrettyPrinter.createStringPlanPrettyPrinter().printPlan(plan,
true).toString();
}
@Override
diff --git
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/plan/PlanStabilityVerifier.java
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/plan/PlanStabilityVerifier.java
index 65aa64a978..d6ffe9ec9f 100644
---
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/plan/PlanStabilityVerifier.java
+++
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/plan/PlanStabilityVerifier.java
@@ -263,7 +263,7 @@ public final class PlanStabilityVerifier {
static String printOperator(ILogicalOperator op, IPlanPrettyPrinter
printer) {
try {
- return printer.reset().printOperator((AbstractLogicalOperator) op,
false).toString();
+ return printer.reset().printOperator((AbstractLogicalOperator) op,
false, false).toString();
} catch (AlgebricksException e) {
// shouldn't happen
return op.toString();
diff --git
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/IPlanPrettyPrinter.java
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/IPlanPrettyPrinter.java
index 6afbabc7ba..2b53de4cb3 100644
---
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/IPlanPrettyPrinter.java
+++
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/IPlanPrettyPrinter.java
@@ -32,20 +32,22 @@ public interface IPlanPrettyPrinter {
/** Prints the plan rooted at the operator argument. */
default IPlanPrettyPrinter printOperator(AbstractLogicalOperator operator)
throws AlgebricksException {
- return printOperator(operator, true);
+ return printOperator(operator, true, false);
}
/** Prints given operator and optionally it's inputs */
- IPlanPrettyPrinter printOperator(AbstractLogicalOperator operator, boolean
printInputs) throws AlgebricksException;
+ IPlanPrettyPrinter printOperator(AbstractLogicalOperator operator, boolean
printInputs,
+ boolean printOptimizerEstimates) throws AlgebricksException;
/** Prints given expression */
IPlanPrettyPrinter printExpression(ILogicalExpression expression) throws
AlgebricksException;
/** Prints the whole logical plan. */
- IPlanPrettyPrinter printPlan(ILogicalPlan plan) throws AlgebricksException;
+ IPlanPrettyPrinter printPlan(ILogicalPlan plan, boolean
printOptimizerEstimates) throws AlgebricksException;
/** Prints the logical plan, annotated with physical operator and
connector ids */
- IPlanPrettyPrinter printPlan(ILogicalPlan plan, Map<Object, String>
log2phys) throws AlgebricksException;
+ IPlanPrettyPrinter printPlan(ILogicalPlan plan, Map<Object, String>
log2phys, boolean printOptimizerEstimates)
+ throws AlgebricksException;
/** Resets the state of the pretty printer. */
IPlanPrettyPrinter reset() throws AlgebricksException;
diff --git
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java
index 430ca1c0c7..e3f9eebbc6 100644
---
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java
+++
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java
@@ -91,22 +91,23 @@ public class LogicalOperatorPrettyPrintVisitor extends
AbstractLogicalOperatorPr
}
@Override
- public final IPlanPrettyPrinter printPlan(ILogicalPlan plan) throws
AlgebricksException {
+ public final IPlanPrettyPrinter printPlan(ILogicalPlan plan, boolean
printOptimizerEstimates)
+ throws AlgebricksException {
printPlanImpl(plan, 0);
return this;
}
@Override
- public final IPlanPrettyPrinter printPlan(ILogicalPlan plan, Map<Object,
String> log2phys)
- throws AlgebricksException {
+ public final IPlanPrettyPrinter printPlan(ILogicalPlan plan, Map<Object,
String> log2phys,
+ boolean printOptimizerEstimates) throws AlgebricksException {
//TODO(ian): would be nice if the text plan returned real operator ids
too
printPlanImpl(plan, 0);
return this;
}
@Override
- public final IPlanPrettyPrinter printOperator(AbstractLogicalOperator op,
boolean printInputs)
- throws AlgebricksException {
+ public final IPlanPrettyPrinter printOperator(AbstractLogicalOperator op,
boolean printInputs,
+ boolean printOptimizerEstimates) throws AlgebricksException {
printOperatorImpl(op, 0, printInputs);
return this;
}
diff --git
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
index 14bac72015..fa98091a16 100644
---
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
+++
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
@@ -159,37 +159,38 @@ public class LogicalOperatorPrettyPrintVisitorJson
extends AbstractLogicalOperat
}
@Override
- public final IPlanPrettyPrinter printPlan(ILogicalPlan plan) throws
AlgebricksException {
- printPlanImpl(plan);
+ public final IPlanPrettyPrinter printPlan(ILogicalPlan plan, boolean
printOptimizerEstimates)
+ throws AlgebricksException {
+ printPlanImpl(plan, printOptimizerEstimates);
flushContentToWriter();
return this;
}
@Override
- public final IPlanPrettyPrinter printPlan(ILogicalPlan plan, Map<Object,
String> log2phys)
- throws AlgebricksException {
+ public final IPlanPrettyPrinter printPlan(ILogicalPlan plan, Map<Object,
String> log2phys,
+ boolean printOptimizerEstimates) throws AlgebricksException {
this.log2odid = log2phys;
- printPlanImpl(plan);
+ printPlanImpl(plan, printOptimizerEstimates);
flushContentToWriter();
return this;
}
@Override
- public final IPlanPrettyPrinter printOperator(AbstractLogicalOperator op,
boolean printInputs)
- throws AlgebricksException {
- printOperatorImpl(op, printInputs);
+ public final IPlanPrettyPrinter printOperator(AbstractLogicalOperator op,
boolean printInputs,
+ boolean printOptimizerEstimates) throws AlgebricksException {
+ printOperatorImpl(op, printInputs, printOptimizerEstimates);
flushContentToWriter();
return this;
}
- private void printPlanImpl(ILogicalPlan plan) throws AlgebricksException {
+ private void printPlanImpl(ILogicalPlan plan, boolean
printOptimizerEstimates) throws AlgebricksException {
try {
boolean writeArrayOfRoots = plan.getRoots().size() > 1;
if (writeArrayOfRoots) {
jsonGenerator.writeStartArray();
}
for (Mutable<ILogicalOperator> root : plan.getRoots()) {
- printOperatorImpl((AbstractLogicalOperator) root.getValue(),
true);
+ printOperatorImpl((AbstractLogicalOperator) root.getValue(),
true, printOptimizerEstimates);
}
if (writeArrayOfRoots) {
jsonGenerator.writeEndArray();
@@ -199,8 +200,11 @@ public class LogicalOperatorPrettyPrintVisitorJson extends
AbstractLogicalOperat
}
}
- private void printOperatorImpl(AbstractLogicalOperator op, boolean
printInputs) throws AlgebricksException {
+ private void printOperatorImpl(AbstractLogicalOperator op, boolean
printInputs, boolean printOptimizerEstimates)
+ throws AlgebricksException {
try {
+ boolean nestPlanInPlanField = nestPlanInPlanField(op,
printOptimizerEstimates);
+
jsonGenerator.writeStartObject();
op.accept(this, null);
jsonGenerator.writeStringField("operatorId",
idCounter.printOperatorId(op));
@@ -214,24 +218,71 @@ public class LogicalOperatorPrettyPrintVisitorJson
extends AbstractLogicalOperat
}
jsonGenerator.writeStringField("execution-mode",
op.getExecutionMode().toString());
+ generateCardCostFields(op);
+
+ if (printInputs && !op.getInputs().isEmpty()) {
+ jsonGenerator.writeArrayFieldStart("inputs");
+ for (Mutable<ILogicalOperator> k : op.getInputs()) {
+ printOperatorImpl((AbstractLogicalOperator) k.getValue(),
printInputs, printOptimizerEstimates);
+ }
+ jsonGenerator.writeEndArray();
+ }
+ jsonGenerator.writeEndObject();
+ if (nestPlanInPlanField) {
+ jsonGenerator.writeEndObject();
+ }
+ } catch (IOException e) {
+ throw AlgebricksException.create(ErrorCode.ERROR_PRINTING_PLAN, e,
String.valueOf(e));
+ }
+ }
+
+ private boolean nestPlanInPlanField(AbstractLogicalOperator op, boolean
printOptimizerEstimates)
+ throws IOException {
+ if (op.getOperatorTag() == LogicalOperatorTag.DISTRIBUTE_RESULT &&
printOptimizerEstimates) {
+ double cardinality = 0.0;
+ double cost = 0.0;
+ for (Map.Entry<String, Object> anno :
op.getAnnotations().entrySet()) {
+ if (anno.getValue() != null &&
anno.getKey().equals(OperatorAnnotations.OP_OUTPUT_CARDINALITY)) {
+ cardinality = (double) anno.getValue();
+ } else if (anno.getValue() != null &&
anno.getKey().equals(OperatorAnnotations.OP_COST_TOTAL)) {
+ cost = (double) anno.getValue();
+ }
+ }
+
+ jsonGenerator.writeStartObject();
+ jsonGenerator.writeNumberField("cardinality", cardinality);
+ jsonGenerator.writeNumberField("cost", cost);
+ jsonGenerator.writeFieldName("plan");
+ return true;
+ }
+ return false;
+ }
+
+ private void generateCardCostFields(AbstractLogicalOperator op) throws
AlgebricksException {
+ try {
+ double opCard = 0.0;
+ double opCostLocal = 0.0;
+ double opCostTotal = 0.0;
+
for (Map.Entry<String, Object> anno :
op.getAnnotations().entrySet()) {
Object annotationVal = anno.getValue();
if (annotationVal != null) {
String annotation = anno.getKey();
switch (annotation) {
case OperatorAnnotations.OP_COST_LOCAL:
+ opCostLocal = (double) annotationVal;
+ break;
case OperatorAnnotations.OP_COST_TOTAL:
-
jsonGenerator.writeStringField(annotation.toLowerCase().replace('_', '-'),
- annotationVal.toString());
+ opCostTotal = (double) annotationVal;
break;
case OperatorAnnotations.OP_INPUT_CARDINALITY:
if (op.getOperatorTag() ==
LogicalOperatorTag.DATASOURCESCAN) {
- jsonGenerator.writeStringField(OP_CARDINALITY,
annotationVal.toString());
+ opCard = (double) annotationVal;
}
break;
case OperatorAnnotations.OP_OUTPUT_CARDINALITY:
if (op.getOperatorTag() !=
LogicalOperatorTag.DATASOURCESCAN) {
- jsonGenerator.writeStringField(OP_CARDINALITY,
annotationVal.toString());
+ opCard = (double) annotationVal;
}
break;
default:
@@ -239,14 +290,12 @@ public class LogicalOperatorPrettyPrintVisitorJson
extends AbstractLogicalOperat
}
}
}
-
- if (printInputs && !op.getInputs().isEmpty()) {
- jsonGenerator.writeArrayFieldStart("inputs");
- for (Mutable<ILogicalOperator> k : op.getInputs()) {
- printOperatorImpl((AbstractLogicalOperator) k.getValue(),
printInputs);
- }
- jsonGenerator.writeEndArray();
- }
+ jsonGenerator.writeObjectFieldStart("optimizer-estimates");
+ jsonGenerator.writeNumberField(OP_CARDINALITY, opCard);
+
jsonGenerator.writeNumberField(OperatorAnnotations.OP_COST_LOCAL.toLowerCase().replace('_',
'-'),
+ opCostLocal);
+
jsonGenerator.writeNumberField(OperatorAnnotations.OP_COST_TOTAL.toLowerCase().replace('_',
'-'),
+ opCostTotal);
jsonGenerator.writeEndObject();
} catch (IOException e) {
throw AlgebricksException.create(ErrorCode.ERROR_PRINTING_PLAN, e,
String.valueOf(e));
@@ -811,7 +860,7 @@ public class LogicalOperatorPrettyPrintVisitorJson extends
AbstractLogicalOperat
jsonGenerator.writeArrayFieldStart("subplan");
List<ILogicalPlan> nestedPlans = op.getNestedPlans();
for (int i = 0, size = nestedPlans.size(); i < size; i++) {
- printPlanImpl(nestedPlans.get(i));
+ printPlanImpl(nestedPlans.get(i), false);
}
jsonGenerator.writeEndArray();
idCounter.previousPrefix();
diff --git
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/HeuristicOptimizer.java
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/HeuristicOptimizer.java
index a717295f0e..676b9c7fe9 100644
---
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/HeuristicOptimizer.java
+++
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/HeuristicOptimizer.java
@@ -69,7 +69,7 @@ public class HeuristicOptimizer {
private void logPlanAt(String name, Level lvl) throws AlgebricksException {
if (AlgebricksConfig.ALGEBRICKS_LOGGER.isEnabled(lvl)) {
- String planStr =
context.getPrettyPrinter().reset().printPlan(plan).toString();
+ String planStr =
context.getPrettyPrinter().reset().printPlan(plan, true).toString();
AlgebricksConfig.ALGEBRICKS_LOGGER.log(lvl, name + ":\n" +
LogRedactionUtil.userData(planStr));
}
}
diff --git
a/hyracks-fullstack/algebricks/algebricks-core/src/test/java/org/apache/hyracks/algebricks/core/algebra/plan/PlanVerifierTestBase.java
b/hyracks-fullstack/algebricks/algebricks-core/src/test/java/org/apache/hyracks/algebricks/core/algebra/plan/PlanVerifierTestBase.java
index 65d64609d5..2f7bc9b097 100644
---
a/hyracks-fullstack/algebricks/algebricks-core/src/test/java/org/apache/hyracks/algebricks/core/algebra/plan/PlanVerifierTestBase.java
+++
b/hyracks-fullstack/algebricks/algebricks-core/src/test/java/org/apache/hyracks/algebricks/core/algebra/plan/PlanVerifierTestBase.java
@@ -71,7 +71,7 @@ public abstract class PlanVerifierTestBase {
String printOp(ILogicalOperator op) {
try {
- return planPrinter.reset().printOperator((AbstractLogicalOperator)
op, false).toString();
+ return planPrinter.reset().printOperator((AbstractLogicalOperator)
op, false, false).toString();
} catch (AlgebricksException e) {
throw new RuntimeException(e);
}