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/30 07:57:15 UTC

[iotdb] branch query_plan_visualization updated: complete plan visualization

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


The following commit(s) were added to refs/heads/query_plan_visualization by this push:
     new 312a82b9c6 complete plan visualization
312a82b9c6 is described below

commit 312a82b9c64b239591d27751a2166cd5cfeaf3bb
Author: Jinrui.Zhang <xi...@gmail.com>
AuthorDate: Mon May 30 15:57:04 2022 +0800

    complete plan visualization
---
 .../apache/iotdb/commons/conf/IoTDBConstant.java   |  1 +
 .../apache/iotdb/db/mpp/plan/analyze/Analyzer.java |  1 +
 .../memory/StatementMemorySourceVisitor.java       | 30 ++++++++++++++++++++++
 .../plan/planner/plan/node/PlanGraphPrinter.java   | 20 +++++++++++----
 4 files changed, 47 insertions(+), 5 deletions(-)

diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java b/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
index 7e6190111f..ee7584b435 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
@@ -93,6 +93,7 @@ public class IoTDBConstant {
   public static final String COLUMN_TAGS = "tags";
   public static final String COLUMN_ATTRIBUTES = "attributes";
   public static final String COLUMN_IS_ALIGNED = "isAligned";
+  public static final String COLUMN_DISTRIBUTION_PLAN = "distribution plan";
   public static final String QUERY_ID = "queryId";
   public static final String STATEMENT = "statement";
   public static final String TLL_NOT_SET = "not set";
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java
index 50c29c3ecd..7048518efd 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java
@@ -137,6 +137,7 @@ public class Analyzer {
     @Override
     public Analysis visitExplain(ExplainStatement explainStatement, MPPQueryContext context) {
       Analysis analysis = visitQuery(explainStatement.getQueryStatement(), context);
+      analysis.setStatement(explainStatement);
       analysis.setFinishQueryAfterAnalyze(true);
       return analysis;
     }
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 dfbbdd616b..17cc0a4721 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
@@ -19,18 +19,32 @@
 
 package org.apache.iotdb.db.mpp.plan.execution.memory;
 
+import org.apache.iotdb.commons.conf.IoTDBConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
 import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.plan.planner.LogicalPlanner;
+import org.apache.iotdb.db.mpp.plan.planner.distribution.DistributionPlanner;
+import org.apache.iotdb.db.mpp.plan.planner.plan.LogicalQueryPlan;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanGraphPrinter;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.statement.StatementNode;
 import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.CountNodesStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowChildNodesStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowChildPathsStatement;
+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;
 
@@ -42,6 +56,22 @@ public class StatementMemorySourceVisitor
     return new StatementMemorySource(new TsBlock(0), new DatasetHeader(new ArrayList<>(), false));
   }
 
+  @Override
+  public StatementMemorySource visitExplain(ExplainStatement node, StatementMemorySourceContext context) {
+    context.getAnalysis().setStatement(node.getQueryStatement());
+    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);
+    return new StatementMemorySource(tsBlock, header);
+  }
+
   @Override
   public StatementMemorySource visitShowChildPaths(
       ShowChildPathsStatement showChildPathsStatement, StatementMemorySourceContext context) {
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 15feab6758..5ab64d1b44 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
@@ -23,6 +23,7 @@ import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.ExchangeNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.LimitNode;
 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.AlignedSeriesScanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.source.SeriesScanNode;
 
 import org.apache.commons.lang3.Validate;
@@ -58,23 +59,32 @@ public class PlanGraphPrinter extends PlanVisitor<List<String>, PlanGraphPrinter
   @Override
   public List<String> visitSeriesScan(SeriesScanNode node, GraphContext context) {
     List<String> boxValue = new ArrayList<>();
-    boxValue.add(String.format("SeriesScanNode-%s", node.getPlanNodeId().getId()));
+    boxValue.add(String.format("SeriesScan-%s", node.getPlanNodeId().getId()));
     boxValue.add(String.format("Series: %s", node.getSeriesPath()));
-    boxValue.add(String.format("Partition: %s", node.getRegionReplicaSet().getRegionId()));
+    boxValue.add(String.format("PartitionId: %s", node.getRegionReplicaSet().getRegionId().id));
+    return render(node, boxValue, context);
+  }
+
+  @Override
+  public List<String> visitAlignedSeriesScan(AlignedSeriesScanNode node, GraphContext context) {
+    List<String> boxValue = new ArrayList<>();
+    boxValue.add(String.format("AlignedSeriesScan-%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> visitExchange(ExchangeNode node, GraphContext context) {
     List<String> boxValue = new ArrayList<>();
-    boxValue.add(String.format("ExchangeNode-%s", node.getPlanNodeId().getId()));
+    boxValue.add(String.format("Exchange-%s", node.getPlanNodeId().getId()));
     return render(node, boxValue, context);
   }
 
   @Override
   public List<String> visitTimeJoin(TimeJoinNode node, GraphContext context) {
     List<String> boxValue = new ArrayList<>();
-    boxValue.add(String.format("TimeJoinNode-%s", node.getPlanNodeId().getId()));
+    boxValue.add(String.format("TimeJoin-%s", node.getPlanNodeId().getId()));
     boxValue.add(String.format("Order: %s", node.getMergeOrder()));
     return render(node, boxValue, context);
   }
@@ -90,7 +100,7 @@ public class PlanGraphPrinter extends PlanVisitor<List<String>, PlanGraphPrinter
   @Override
   public List<String> visitFragmentSink(FragmentSinkNode node, GraphContext context) {
     List<String> boxValue = new ArrayList<>();
-    boxValue.add(String.format("FragmentSinkNode-%s", node.getPlanNodeId().getId()));
+    boxValue.add(String.format("FragmentSink-%s", node.getPlanNodeId().getId()));
     boxValue.add(String.format("Destination: %s", node.getDownStreamPlanNodeId()));
     return render(node, boxValue, context);
   }