This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/dev/1.3 by this push:
new b30fd342ec7 [to dev/1.3] fix LastQueryScanNode sort #16956
b30fd342ec7 is described below
commit b30fd342ec720d82331184a2a477e06ba69e6345
Author: shuwenwei <[email protected]>
AuthorDate: Fri Dec 26 14:16:18 2025 +0800
[to dev/1.3] fix LastQueryScanNode sort #16956
---
.../plan/planner/distribution/SourceRewriter.java | 7 +--
.../plan/node/source/LastQueryScanNode.java | 4 ++
.../plan/planner/distribution/LastQueryTest.java | 54 ++++++++++++++++++++++
3 files changed, 62 insertions(+), 3 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
index 32647d29457..380a351f65e 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
@@ -1055,13 +1055,14 @@ public class SourceRewriter extends
BaseSourceRewriter<DistributionPlanContext>
if (child instanceof LastQueryScanNode) {
// sort the measurements for LastQueryMergeOperator
LastQueryScanNode node = (LastQueryScanNode) child;
- ((LastQueryScanNode) child)
- .getIdxOfMeasurementSchemas()
+ node.getIdxOfMeasurementSchemas()
.sort(
Comparator.comparing(
idx ->
new Binary(
-
node.getMeasurementSchema(idx).getMeasurementId(),
+ node.getGlobalMeasurementSchemaList()
+ .get(idx)
+ .getMeasurementId(),
TSFileConfig.STRING_CHARSET),
Comparator.naturalOrder()));
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/source/LastQueryScanNode.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/source/LastQueryScanNode.java
index d7908e6b759..a16aeb779f4 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/source/LastQueryScanNode.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/source/LastQueryScanNode.java
@@ -326,6 +326,10 @@ public class LastQueryScanNode extends
LastSeriesSourceNode {
this.globalMeasurementSchemaList = globalMeasurementSchemaList;
}
+ public List<IMeasurementSchema> getGlobalMeasurementSchemaList() {
+ return globalMeasurementSchemaList;
+ }
+
public IMeasurementSchema getMeasurementSchema(int idx) {
int globalIdx = indexOfMeasurementSchemas.get(idx);
return globalMeasurementSchemaList.get(globalIdx);
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/LastQueryTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/LastQueryTest.java
index 7c425c32842..2a30129bbd5 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/LastQueryTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/LastQueryTest.java
@@ -25,14 +25,19 @@ import org.apache.iotdb.commons.path.MeasurementPath;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
import org.apache.iotdb.db.queryengine.common.QueryId;
+import org.apache.iotdb.db.queryengine.plan.analyze.Analysis;
import org.apache.iotdb.db.queryengine.plan.planner.plan.DistributedQueryPlan;
import org.apache.iotdb.db.queryengine.plan.planner.plan.LogicalQueryPlan;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.ExchangeNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.last.LastQueryCollectNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.last.LastQueryMergeNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.last.LastQueryNode;
+import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.LastQueryScanNode;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.write.schema.MeasurementSchema;
import org.junit.Assert;
import org.junit.Test;
@@ -42,6 +47,55 @@ import java.util.List;
public class LastQueryTest {
+ @Test
+ public void testSortLastQueryScanNode() throws IllegalPathException {
+ LastQueryNode lastQueryNode = new LastQueryNode(new PlanNodeId("test"),
null, true);
+
+ lastQueryNode.addDeviceLastQueryScanNode(
+ new PlanNodeId("test_last_query_scan1"),
+ new PartialPath("root.test.d1"),
+ true,
+ Arrays.asList(
+ new MeasurementSchema("s3", TSDataType.INT32),
+ new MeasurementSchema("s1", TSDataType.BOOLEAN),
+ new MeasurementSchema("s2", TSDataType.INT32)),
+ null);
+ lastQueryNode.addDeviceLastQueryScanNode(
+ new PlanNodeId("test_last_query_scan2"),
+ new PartialPath("root.test.d0"),
+ false,
+ Collections.singletonList(new MeasurementSchema("s0",
TSDataType.BOOLEAN)),
+ null);
+
+ Analysis analysis = Util.constructAnalysis();
+ SourceRewriter sourceRewriter = new SourceRewriter(analysis);
+ DistributionPlanContext context =
+ new DistributionPlanContext(
+ new MPPQueryContext("", new QueryId("test"), null, new
TEndPoint(), new TEndPoint()));
+ context.setOneSeriesInMultiRegion(true);
+ context.setQueryMultiRegion(true);
+ List<PlanNode> result = sourceRewriter.visitLastQuery(lastQueryNode,
context);
+ Assert.assertEquals(1, result.size());
+ Assert.assertTrue(result.get(0) instanceof LastQueryMergeNode);
+ LastQueryMergeNode mergeNode = (LastQueryMergeNode) result.get(0);
+ Assert.assertEquals(1, mergeNode.getChildren().size());
+ Assert.assertTrue(mergeNode.getChildren().get(0) instanceof LastQueryNode);
+
+ LastQueryNode lastQueryNode2 = (LastQueryNode)
mergeNode.getChildren().get(0);
+ Assert.assertEquals(2, lastQueryNode2.getChildren().size());
+ Assert.assertTrue(lastQueryNode2.getChildren().get(0) instanceof
LastQueryScanNode);
+
+ LastQueryScanNode scanNodeChild1 = (LastQueryScanNode)
lastQueryNode2.getChildren().get(0);
+
Assert.assertTrue(scanNodeChild1.getDevicePath().toString().contains("d0"));
+ Assert.assertEquals("s0",
scanNodeChild1.getMeasurementSchemas().get(0).getMeasurementId());
+
+ LastQueryScanNode scanNodeChild2 = (LastQueryScanNode)
lastQueryNode2.getChildren().get(1);
+
Assert.assertTrue(scanNodeChild2.getDevicePath().toString().contains("d1"));
+ Assert.assertEquals("s1",
scanNodeChild2.getMeasurementSchemas().get(0).getMeasurementId());
+ Assert.assertEquals("s2",
scanNodeChild2.getMeasurementSchemas().get(1).getMeasurementId());
+ Assert.assertEquals("s3",
scanNodeChild2.getMeasurementSchemas().get(2).getMeasurementId());
+ }
+
@Test
public void testLastQuery1Series1Region() throws IllegalPathException {
String d2s1Path = "root.sg.d22.s1";