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<>();