This is an automated email from the ASF dual-hosted git repository.

caogaofei pushed a commit to branch optimize_query
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit bb823f0630c508b7da628e4170d5089fc8358d4f
Author: Beyyes <[email protected]>
AuthorDate: Mon Mar 17 13:21:24 2025 +0800

    optimize the logic of get TRegionReplicaSets of devices
---
 .../plan/relational/analyzer/Analysis.java         | 17 -------
 .../distribute/TableDistributedPlanGenerator.java  | 52 +++++++++++++++++-----
 .../plan/relational/analyzer/AnalyzerTest.java     | 10 ++---
 3 files changed, 45 insertions(+), 34 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java
index 83771367b49..317679fdcd0 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java
@@ -20,7 +20,6 @@
 package org.apache.iotdb.db.queryengine.plan.relational.analyzer;
 
 import org.apache.iotdb.common.rpc.thrift.TEndPoint;
-import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.commons.partition.DataPartition;
 import org.apache.iotdb.commons.partition.SchemaPartition;
@@ -73,10 +72,8 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Streams;
 import com.google.errorprone.annotations.Immutable;
-import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.read.common.block.TsBlock;
 import org.apache.tsfile.read.common.type.Type;
-import org.apache.tsfile.read.filter.basic.Filter;
 import org.apache.tsfile.utils.TimeDuration;
 
 import javax.annotation.Nullable;
@@ -105,7 +102,6 @@ import static java.util.Collections.unmodifiableList;
 import static java.util.Collections.unmodifiableMap;
 import static java.util.Collections.unmodifiableSet;
 import static java.util.Objects.requireNonNull;
-import static org.apache.iotdb.commons.partition.DataPartition.NOT_ASSIGNED;
 
 public class Analysis implements IAnalysis {
 
@@ -213,10 +209,6 @@ public class Analysis implements IAnalysis {
 
   private boolean isQuery = false;
 
-  public DataPartition getDataPartition() {
-    return dataPartition;
-  }
-
   public Analysis(@Nullable Statement root, Map<NodeRef<Parameter>, 
Expression> parameters) {
     this.root = root;
     this.parameters = ImmutableMap.copyOf(requireNonNull(parameters, 
"parameters is null"));
@@ -850,15 +842,6 @@ public class Analysis implements IAnalysis {
     redirectNodeList.add(endPoint);
   }
 
-  public List<TRegionReplicaSet> getDataRegionReplicaSetWithTimeFilter(
-      final String database, final IDeviceID deviceId, final Filter 
timeFilter) {
-    if (dataPartition == null) {
-      return Collections.singletonList(NOT_ASSIGNED);
-    } else {
-      return dataPartition.getDataRegionReplicaSetWithTimeFilter(database, 
deviceId, timeFilter);
-    }
-  }
-
   public void setTableFunctionAnalysis(
       TableFunctionInvocation node, TableFunctionInvocationAnalysis analysis) {
     tableFunctionAnalyses.put(NodeRef.of(node), analysis);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
index ef4e3936aa0..06e1676e62e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
@@ -461,14 +461,36 @@ public class TableDistributedPlanGenerator
 
   public List<PlanNode> visitDeviceTableScan(
       final DeviceTableScanNode node, final PlanContext context) {
+    DataPartition dataPartition = analysis.getDataPartitionInfo();
+    if (dataPartition == null) {
+      node.setRegionReplicaSet(NOT_ASSIGNED);
+      return Collections.singletonList(node);
+    }
+
     final Map<TRegionReplicaSet, DeviceTableScanNode> tableScanNodeMap = new 
HashMap<>();
+    String dbName = node.getQualifiedObjectName().getDatabaseName();
+    if (!dataPartition.getDataPartitionMap().containsKey(dbName)) {
+      throw new SemanticException(
+          String.format("Given queried database: %s is not exist!", dbName));
+    }
+
+    Map<TSeriesPartitionSlot, Map<TTimePartitionSlot, 
List<TRegionReplicaSet>>> seriesSlotMap =
+        dataPartition.getDataPartitionMap().get(dbName);
+    Map<Integer, List<TRegionReplicaSet>> cachedSeriesSlotWithRegions = new 
HashMap<>();
 
     for (final DeviceEntry deviceEntry : node.getDeviceEntries()) {
-      final List<TRegionReplicaSet> regionReplicaSets =
-          analysis.getDataRegionReplicaSetWithTimeFilter(
-              node.getQualifiedObjectName().getDatabaseName(),
+      List<TRegionReplicaSet> regionReplicaSets =
+          getReplicaSetWithTimeFilter(
+              dataPartition,
+              seriesSlotMap,
               deviceEntry.getDeviceID(),
-              node.getTimeFilter());
+              node.getTimeFilter(),
+              cachedSeriesSlotWithRegions);
+      //      final List<TRegionReplicaSet> regionReplicaSets =
+      //          dataPartition.getDataRegionReplicaSetWithTimeFilter(
+      //              dbName,
+      //              deviceEntry.getDeviceID(),
+      //              node.getTimeFilter());
 
       for (final TRegionReplicaSet regionReplicaSet : regionReplicaSets) {
         final DeviceTableScanNode deviceTableScanNode =
@@ -528,12 +550,18 @@ public class TableDistributedPlanGenerator
 
   @Override
   public List<PlanNode> visitTreeDeviceViewScan(TreeDeviceViewScanNode node, 
PlanContext context) {
+    DataPartition dataPartition = analysis.getDataPartitionInfo();
+    if (dataPartition == null) {
+      node.setRegionReplicaSet(NOT_ASSIGNED);
+      return Collections.singletonList(node);
+    }
+
     Map<TRegionReplicaSet, Pair<TreeAlignedDeviceViewScanNode, 
TreeNonAlignedDeviceViewScanNode>>
         tableScanNodeMap = new HashMap<>();
 
     for (DeviceEntry deviceEntry : node.getDeviceEntries()) {
       List<TRegionReplicaSet> regionReplicaSets =
-          analysis.getDataRegionReplicaSetWithTimeFilter(
+          dataPartition.getDataRegionReplicaSetWithTimeFilter(
               node.getTreeDBName(), deviceEntry.getDeviceID(), 
node.getTimeFilter());
 
       for (TRegionReplicaSet regionReplicaSet : regionReplicaSets) {
@@ -723,15 +751,15 @@ public class TableDistributedPlanGenerator
         node instanceof AggregationTreeDeviceViewScanNode
             ? ((AggregationTreeDeviceViewScanNode) node).getTreeDBName()
             : node.getQualifiedObjectName().getDatabaseName();
-    DataPartition dataPartition = analysis.getDataPartition();
+    DataPartition dataPartition = analysis.getDataPartitionInfo();
     boolean needSplit = false;
     List<List<TRegionReplicaSet>> regionReplicaSetsList = new ArrayList<>();
-    if (dataPartition == null) {
-      // do nothing
-    } else if (!dataPartition.getDataPartitionMap().containsKey(dbName)) {
-      throw new SemanticException(
-          String.format("Given queried database: %s is not exist!", dbName));
-    } else {
+    if (dataPartition != null) {
+      if (!dataPartition.getDataPartitionMap().containsKey(dbName)) {
+        throw new SemanticException(
+            String.format("Given queried database: %s is not exist!", dbName));
+      }
+
       Map<TSeriesPartitionSlot, Map<TTimePartitionSlot, 
List<TRegionReplicaSet>>> seriesSlotMap =
           dataPartition.getDataPartitionMap().get(dbName);
       Map<Integer, List<TRegionReplicaSet>> cachedSeriesSlotWithRegions = new 
HashMap<>();
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
index 07672ab95d0..3f1df86076a 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
@@ -1125,11 +1125,11 @@ public class AnalyzerTest {
             context,
             new SqlParser(),
             sessionInfo);
-    assertEquals(1, analysis.getDataPartition().getDataPartitionMap().size());
+    assertEquals(1, 
analysis.getDataPartitionInfo().getDataPartitionMap().size());
     Map<TSeriesPartitionSlot, Map<TTimePartitionSlot, List<TRegionReplicaSet>>>
         partitionSlotMapMap =
             analysis
-                .getDataPartition()
+                .getDataPartitionInfo()
                 .getDataPartitionMap()
                 .get(sessionInfo.getDatabaseName().orElse(null));
     assertEquals(3, partitionSlotMapMap.size());
@@ -1178,12 +1178,12 @@ public class AnalyzerTest {
             context,
             new SqlParser(),
             sessionInfo);
-    assertEquals(1, analysis.getDataPartition().getDataPartitionMap().size());
-    assertEquals(1, analysis.getDataPartition().getDataPartitionMap().size());
+    assertEquals(1, 
analysis.getDataPartitionInfo().getDataPartitionMap().size());
+    assertEquals(1, 
analysis.getDataPartitionInfo().getDataPartitionMap().size());
     final Map<TSeriesPartitionSlot, Map<TTimePartitionSlot, 
List<TRegionReplicaSet>>>
         partitionSlotMapMap =
             analysis
-                .getDataPartition()
+                .getDataPartitionInfo()
                 .getDataPartitionMap()
                 .get(sessionInfo.getDatabaseName().orElse(null));
     assertEquals(1, partitionSlotMapMap.size());

Reply via email to