Skip to content

Commit b30fd34

Browse files
authored
[to dev/1.3] fix LastQueryScanNode sort #16956
1 parent 910a623 commit b30fd34

File tree

3 files changed

+62
-3
lines changed

3 files changed

+62
-3
lines changed

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,13 +1055,14 @@ private void addSortForEachLastQueryNode(PlanNode root, Ordering timeseriesOrder
10551055
if (child instanceof LastQueryScanNode) {
10561056
// sort the measurements for LastQueryMergeOperator
10571057
LastQueryScanNode node = (LastQueryScanNode) child;
1058-
((LastQueryScanNode) child)
1059-
.getIdxOfMeasurementSchemas()
1058+
node.getIdxOfMeasurementSchemas()
10601059
.sort(
10611060
Comparator.comparing(
10621061
idx ->
10631062
new Binary(
1064-
node.getMeasurementSchema(idx).getMeasurementId(),
1063+
node.getGlobalMeasurementSchemaList()
1064+
.get(idx)
1065+
.getMeasurementId(),
10651066
TSFileConfig.STRING_CHARSET),
10661067
Comparator.naturalOrder()));
10671068
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/source/LastQueryScanNode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,10 @@ public void setGlobalMeasurementSchemaList(List<IMeasurementSchema> globalMeasur
326326
this.globalMeasurementSchemaList = globalMeasurementSchemaList;
327327
}
328328

329+
public List<IMeasurementSchema> getGlobalMeasurementSchemaList() {
330+
return globalMeasurementSchemaList;
331+
}
332+
329333
public IMeasurementSchema getMeasurementSchema(int idx) {
330334
int globalIdx = indexOfMeasurementSchemas.get(idx);
331335
return globalMeasurementSchemaList.get(globalIdx);

iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/LastQueryTest.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,19 @@
2525
import org.apache.iotdb.commons.path.PartialPath;
2626
import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
2727
import org.apache.iotdb.db.queryengine.common.QueryId;
28+
import org.apache.iotdb.db.queryengine.plan.analyze.Analysis;
2829
import org.apache.iotdb.db.queryengine.plan.planner.plan.DistributedQueryPlan;
2930
import org.apache.iotdb.db.queryengine.plan.planner.plan.LogicalQueryPlan;
3031
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
32+
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
3133
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.ExchangeNode;
3234
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.last.LastQueryCollectNode;
3335
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.last.LastQueryMergeNode;
3436
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.last.LastQueryNode;
37+
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.LastQueryScanNode;
3538

39+
import org.apache.tsfile.enums.TSDataType;
40+
import org.apache.tsfile.write.schema.MeasurementSchema;
3641
import org.junit.Assert;
3742
import org.junit.Test;
3843

@@ -42,6 +47,55 @@
4247

4348
public class LastQueryTest {
4449

50+
@Test
51+
public void testSortLastQueryScanNode() throws IllegalPathException {
52+
LastQueryNode lastQueryNode = new LastQueryNode(new PlanNodeId("test"), null, true);
53+
54+
lastQueryNode.addDeviceLastQueryScanNode(
55+
new PlanNodeId("test_last_query_scan1"),
56+
new PartialPath("root.test.d1"),
57+
true,
58+
Arrays.asList(
59+
new MeasurementSchema("s3", TSDataType.INT32),
60+
new MeasurementSchema("s1", TSDataType.BOOLEAN),
61+
new MeasurementSchema("s2", TSDataType.INT32)),
62+
null);
63+
lastQueryNode.addDeviceLastQueryScanNode(
64+
new PlanNodeId("test_last_query_scan2"),
65+
new PartialPath("root.test.d0"),
66+
false,
67+
Collections.singletonList(new MeasurementSchema("s0", TSDataType.BOOLEAN)),
68+
null);
69+
70+
Analysis analysis = Util.constructAnalysis();
71+
SourceRewriter sourceRewriter = new SourceRewriter(analysis);
72+
DistributionPlanContext context =
73+
new DistributionPlanContext(
74+
new MPPQueryContext("", new QueryId("test"), null, new TEndPoint(), new TEndPoint()));
75+
context.setOneSeriesInMultiRegion(true);
76+
context.setQueryMultiRegion(true);
77+
List<PlanNode> result = sourceRewriter.visitLastQuery(lastQueryNode, context);
78+
Assert.assertEquals(1, result.size());
79+
Assert.assertTrue(result.get(0) instanceof LastQueryMergeNode);
80+
LastQueryMergeNode mergeNode = (LastQueryMergeNode) result.get(0);
81+
Assert.assertEquals(1, mergeNode.getChildren().size());
82+
Assert.assertTrue(mergeNode.getChildren().get(0) instanceof LastQueryNode);
83+
84+
LastQueryNode lastQueryNode2 = (LastQueryNode) mergeNode.getChildren().get(0);
85+
Assert.assertEquals(2, lastQueryNode2.getChildren().size());
86+
Assert.assertTrue(lastQueryNode2.getChildren().get(0) instanceof LastQueryScanNode);
87+
88+
LastQueryScanNode scanNodeChild1 = (LastQueryScanNode) lastQueryNode2.getChildren().get(0);
89+
Assert.assertTrue(scanNodeChild1.getDevicePath().toString().contains("d0"));
90+
Assert.assertEquals("s0", scanNodeChild1.getMeasurementSchemas().get(0).getMeasurementId());
91+
92+
LastQueryScanNode scanNodeChild2 = (LastQueryScanNode) lastQueryNode2.getChildren().get(1);
93+
Assert.assertTrue(scanNodeChild2.getDevicePath().toString().contains("d1"));
94+
Assert.assertEquals("s1", scanNodeChild2.getMeasurementSchemas().get(0).getMeasurementId());
95+
Assert.assertEquals("s2", scanNodeChild2.getMeasurementSchemas().get(1).getMeasurementId());
96+
Assert.assertEquals("s3", scanNodeChild2.getMeasurementSchemas().get(2).getMeasurementId());
97+
}
98+
4599
@Test
46100
public void testLastQuery1Series1Region() throws IllegalPathException {
47101
String d2s1Path = "root.sg.d22.s1";

0 commit comments

Comments
 (0)