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