This is an automated email from the ASF dual-hosted git repository. xingtanzjr pushed a commit to branch query_plan_visualization in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 9d9c09f41da96a3e0fb624a65ecdd83da81f87ef Author: Jinrui.Zhang <[email protected]> AuthorDate: Tue May 31 15:52:55 2022 +0800 add more box printer for PlanNodes --- .../memory/StatementMemorySourceVisitor.java | 33 ++++--- .../plan/planner/plan/node/PlanGraphPrinter.java | 109 +++++++++++++++++++++ 2 files changed, 130 insertions(+), 12 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/memory/StatementMemorySourceVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/memory/StatementMemorySourceVisitor.java index 17cc0a4721..4ee9aeea37 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/memory/StatementMemorySourceVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/memory/StatementMemorySourceVisitor.java @@ -37,14 +37,11 @@ import org.apache.iotdb.db.mpp.plan.statement.sys.ExplainStatement; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import org.apache.iotdb.tsfile.read.common.block.TsBlock; import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder; -import org.apache.iotdb.tsfile.read.common.block.column.BinaryColumn; -import org.apache.iotdb.tsfile.read.common.block.column.TimeColumn; import org.apache.iotdb.tsfile.utils.Binary; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Optional; import java.util.Set; import java.util.TreeSet; @@ -57,18 +54,30 @@ public class StatementMemorySourceVisitor } @Override - public StatementMemorySource visitExplain(ExplainStatement node, StatementMemorySourceContext context) { + public StatementMemorySource visitExplain( + ExplainStatement node, StatementMemorySourceContext context) { context.getAnalysis().setStatement(node.getQueryStatement()); - LogicalQueryPlan logicalPlan = new LogicalPlanner(context.getQueryContext(), new ArrayList<>()).plan(context.getAnalysis()); + LogicalQueryPlan logicalPlan = + new LogicalPlanner(context.getQueryContext(), new ArrayList<>()) + .plan(context.getAnalysis()); DistributionPlanner planner = new DistributionPlanner(context.getAnalysis(), logicalPlan); PlanNode rootWithExchange = planner.addExchangeNode(planner.rewriteSource()); - List<String> lines = rootWithExchange.accept(new PlanGraphPrinter(), new PlanGraphPrinter.GraphContext()); - StringBuilder cellValue = new StringBuilder(); - lines.forEach(line -> cellValue.append(line).append(System.lineSeparator())); - System.out.println(cellValue); - BinaryColumn binaryColumn = new BinaryColumn(1, Optional.empty(), new Binary[]{new Binary(cellValue.toString())}); - TsBlock tsBlock = new TsBlock(new TimeColumn(1, new long[]{0}), binaryColumn); - DatasetHeader header = new DatasetHeader(Collections.singletonList(new ColumnHeader(IoTDBConstant.COLUMN_DISTRIBUTION_PLAN, TSDataType.TEXT)), true); + List<String> lines = + rootWithExchange.accept(new PlanGraphPrinter(), new PlanGraphPrinter.GraphContext()); + + TsBlockBuilder builder = new TsBlockBuilder(Collections.singletonList(TSDataType.TEXT)); + lines.forEach( + line -> { + builder.getTimeColumnBuilder().writeLong(0L); + builder.getColumnBuilder(0).writeBinary(new Binary(line)); + builder.declarePosition(); + }); + TsBlock tsBlock = builder.build(); + DatasetHeader header = + new DatasetHeader( + Collections.singletonList( + new ColumnHeader(IoTDBConstant.COLUMN_DISTRIBUTION_PLAN, TSDataType.TEXT)), + true); return new StatementMemorySource(tsBlock, header); } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanGraphPrinter.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanGraphPrinter.java index 5ab64d1b44..f6321b7ea5 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanGraphPrinter.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanGraphPrinter.java @@ -19,11 +19,23 @@ package org.apache.iotdb.db.mpp.plan.planner.plan.node; +import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.AggregationNode; +import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.DeviceMergeNode; +import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.DeviceViewNode; import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.ExchangeNode; +import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.FillNode; +import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.FilterNode; +import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.FilterNullNode; +import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.GroupByLevelNode; import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.LimitNode; +import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.OffsetNode; +import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.SlidingWindowAggregationNode; +import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.SortNode; import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.TimeJoinNode; import org.apache.iotdb.db.mpp.plan.planner.plan.node.sink.FragmentSinkNode; +import org.apache.iotdb.db.mpp.plan.planner.plan.node.source.AlignedSeriesAggregationScanNode; import org.apache.iotdb.db.mpp.plan.planner.plan.node.source.AlignedSeriesScanNode; +import org.apache.iotdb.db.mpp.plan.planner.plan.node.source.SeriesAggregationScanNode; import org.apache.iotdb.db.mpp.plan.planner.plan.node.source.SeriesScanNode; import org.apache.commons.lang3.Validate; @@ -74,6 +86,103 @@ public class PlanGraphPrinter extends PlanVisitor<List<String>, PlanGraphPrinter return render(node, boxValue, context); } + @Override + public List<String> visitSeriesAggregationScan( + SeriesAggregationScanNode node, GraphContext context) { + List<String> boxValue = new ArrayList<>(); + boxValue.add(String.format("SeriesAggregationScan-%s", node.getPlanNodeId().getId())); + boxValue.add(String.format("Series: %s", node.getSeriesPath())); + boxValue.add(String.format("PartitionId: %s", node.getRegionReplicaSet().getRegionId().id)); + return render(node, boxValue, context); + } + + @Override + public List<String> visitAlignedSeriesAggregationScan( + AlignedSeriesAggregationScanNode node, GraphContext context) { + List<String> boxValue = new ArrayList<>(); + boxValue.add(String.format("AlignedSeriesAggregationScan-%s", node.getPlanNodeId().getId())); + boxValue.add(String.format("Series: %s", node.getAlignedPath())); + boxValue.add(String.format("PartitionId: %s", node.getRegionReplicaSet().getRegionId().id)); + return render(node, boxValue, context); + } + + @Override + public List<String> visitDeviceView(DeviceViewNode node, GraphContext context) { + List<String> boxValue = new ArrayList<>(); + boxValue.add(String.format("DeviceView-%s", node.getPlanNodeId().getId())); + boxValue.add(String.format("DeviceCount: %d", node.getDevices().size())); + return render(node, boxValue, context); + } + + @Override + public List<String> visitDeviceMerge(DeviceMergeNode node, GraphContext context) { + List<String> boxValue = new ArrayList<>(); + boxValue.add(String.format("DeviceMerge-%s", node.getPlanNodeId().getId())); + boxValue.add(String.format("DeviceCount: %d", node.getDevices().size())); + return render(node, boxValue, context); + } + + @Override + public List<String> visitFill(FillNode node, GraphContext context) { + List<String> boxValue = new ArrayList<>(); + boxValue.add(String.format("Fill-%s", node.getPlanNodeId().getId())); + boxValue.add(String.format("Policy: %s", node.getFillDescriptor().getFillPolicy())); + return render(node, boxValue, context); + } + + @Override + public List<String> visitFilter(FilterNode node, GraphContext context) { + List<String> boxValue = new ArrayList<>(); + boxValue.add(String.format("Filter-%s", node.getPlanNodeId().getId())); + boxValue.add(String.format("Predicate: %s", node.getPredicate())); + return render(node, boxValue, context); + } + + @Override + public List<String> visitFilterNull(FilterNullNode node, GraphContext context) { + List<String> boxValue = new ArrayList<>(); + boxValue.add(String.format("FilterNull-%s", node.getPlanNodeId().getId())); + return render(node, boxValue, context); + } + + @Override + public List<String> visitGroupByLevel(GroupByLevelNode node, GraphContext context) { + List<String> boxValue = new ArrayList<>(); + boxValue.add(String.format("GroupByLevel-%s", node.getPlanNodeId().getId())); + return render(node, boxValue, context); + } + + @Override + public List<String> visitSlidingWindowAggregation( + SlidingWindowAggregationNode node, GraphContext context) { + List<String> boxValue = new ArrayList<>(); + boxValue.add(String.format("SlidingWindowAggregation-%s", node.getPlanNodeId().getId())); + return render(node, boxValue, context); + } + + @Override + public List<String> visitOffset(OffsetNode node, GraphContext context) { + List<String> boxValue = new ArrayList<>(); + boxValue.add(String.format("Offset-%s", node.getPlanNodeId().getId())); + boxValue.add(String.format("value: %d", node.getOffset())); + return render(node, boxValue, context); + } + + @Override + public List<String> visitRowBasedSeriesAggregate(AggregationNode node, GraphContext context) { + List<String> boxValue = new ArrayList<>(); + boxValue.add(String.format("Aggregation-%s", node.getPlanNodeId().getId())); + return render(node, boxValue, context); + } + + @Override + public List<String> visitSort(SortNode node, GraphContext context) { + List<String> boxValue = new ArrayList<>(); + boxValue.add(String.format("Sort-%s", node.getPlanNodeId().getId())); + boxValue.add(String.format("OrderBy: %s", node.getSortOrder())); + return render(node, boxValue, context); + } + @Override public List<String> visitExchange(ExchangeNode node, GraphContext context) { List<String> boxValue = new ArrayList<>();
