You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2022/05/31 07:53:08 UTC
[iotdb] 02/02: add more box printer for PlanNodes
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 <xi...@gmail.com>
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<>();