This is an automated email from the ASF dual-hosted git repository.
JackieTien97 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new f1875ed5d06 Fix external TsFile grouping optimization (#18206)
f1875ed5d06 is described below
commit f1875ed5d061d55472773af607d3ad9a99efaa98
Author: shuwenwei <[email protected]>
AuthorDate: Tue Jul 14 19:24:45 2026 +0800
Fix external TsFile grouping optimization (#18206)
---
.../plan/planner/plan/node/PlanVisitor.java | 2 +-
.../optimizations/ParallelizeGroupingTest.java | 111 +++++++++++++++++++++
2 files changed, 112 insertions(+), 1 deletion(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java
index 81596f2d38c..a5b886ff4b0 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java
@@ -652,7 +652,7 @@ public interface PlanVisitor<R, C> extends
ICoreQueryPlanVisitor<R, C> {
}
default R visitExternalTsFileScan(ExternalTsFileScanNode node, C context) {
- return visitTableScan(node, context);
+ return visitDeviceTableScan(node, context);
}
default R
visitExternalTsFileAggregationScan(ExternalTsFileAggregationScanNode node, C
context) {
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/ParallelizeGroupingTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/ParallelizeGroupingTest.java
new file mode 100644
index 00000000000..e2326688112
--- /dev/null
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/ParallelizeGroupingTest.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations;
+
+import org.apache.iotdb.commons.queryengine.plan.planner.plan.node.PlanNode;
+import org.apache.iotdb.commons.queryengine.plan.planner.plan.node.PlanNodeId;
+import
org.apache.iotdb.commons.queryengine.plan.relational.metadata.ColumnSchema;
+import
org.apache.iotdb.commons.queryengine.plan.relational.metadata.QualifiedObjectName;
+import
org.apache.iotdb.commons.queryengine.plan.relational.planner.OrderingScheme;
+import org.apache.iotdb.commons.queryengine.plan.relational.planner.Symbol;
+import
org.apache.iotdb.commons.queryengine.plan.relational.planner.node.GroupNode;
+import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
+import org.apache.iotdb.db.queryengine.common.QueryId;
+import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector;
+import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis;
+import
org.apache.iotdb.db.queryengine.plan.relational.execution.querystats.PlanOptimizersStatsCollector;
+import
org.apache.iotdb.db.queryengine.plan.relational.function.tvf.read_tsfile.ExternalTsFileQueryResource;
+import org.apache.iotdb.db.queryengine.plan.relational.planner.SymbolAllocator;
+import
org.apache.iotdb.db.queryengine.plan.relational.planner.node.ExternalTsFileScanNode;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import org.junit.Test;
+
+import java.nio.file.Path;
+import java.util.Collections;
+import java.util.Map;
+
+import static
org.apache.iotdb.commons.queryengine.plan.relational.planner.SortOrder.ASC_NULLS_LAST;
+import static
org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory.TAG;
+import static
org.apache.iotdb.db.queryengine.plan.relational.analyzer.TestUtils.SESSION_INFO;
+import static
org.apache.iotdb.db.queryengine.plan.relational.analyzer.TestUtils.TEST_MATADATA;
+import static org.apache.tsfile.read.common.type.StringType.STRING;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+public class ParallelizeGroupingTest {
+
+ @Test
+ public void testExternalTsFileScanKeepsGroupNodeWhenPartitionedByAllTags() {
+ Symbol region = new Symbol("region");
+ Symbol site = new Symbol("site");
+ Map<Symbol, ColumnSchema> assignments =
+ ImmutableMap.of(
+ region, new ColumnSchema("region", STRING, false, TAG),
+ site, new ColumnSchema("site", STRING, false, TAG));
+
+ MPPQueryContext queryContext = new MPPQueryContext(new
QueryId("parallelize_grouping"));
+ ExternalTsFileQueryResource resource =
+ new ExternalTsFileQueryResource(
+ queryContext,
+ Path.of("target", "parallelize-grouping"),
+ "metrics",
+ Collections.emptyList(),
+ assignments,
+ 1024 * 1024);
+ try {
+ ExternalTsFileScanNode scanNode =
+ new ExternalTsFileScanNode(
+ new PlanNodeId("scan"),
+ QualifiedObjectName.valueOf("external.metrics"),
+ ImmutableList.of(region, site),
+ assignments,
+ ImmutableMap.of(region, 0, site, 1),
+ resource);
+ OrderingScheme orderingScheme =
+ new OrderingScheme(
+ ImmutableList.of(region, site),
+ ImmutableMap.of(region, ASC_NULLS_LAST, site, ASC_NULLS_LAST));
+ GroupNode groupNode = new GroupNode(new PlanNodeId("group"), scanNode,
orderingScheme, 2);
+
+ Analysis analysis = new Analysis(null, Collections.emptyMap());
+ analysis.setQuery(true);
+ PlanNode optimizedPlan =
+ new ParallelizeGrouping()
+ .optimize(
+ groupNode,
+ new PlanOptimizer.Context(
+ SESSION_INFO,
+ analysis,
+ TEST_MATADATA,
+ queryContext,
+ new SymbolAllocator(),
+ new QueryId("parallelize_grouping"),
+ WarningCollector.NOOP,
+
PlanOptimizersStatsCollector.createPlanOptimizersStatsCollector()));
+
+ assertTrue(optimizedPlan instanceof GroupNode);
+ assertSame(scanNode, ((GroupNode) optimizedPlan).getChild());
+ } finally {
+ resource.closeByQueryExecution();
+ }
+ }
+}