This is an automated email from the ASF dual-hosted git repository.
caogaofei 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 6771d33da31 [IOTDB-6192] Remove redundant mergeSortOperator in 'ORDER
BY TIME ALIGN BY DEVICE' (#11320)
6771d33da31 is described below
commit 6771d33da310bb17dc0164d583059a518cd6cf30
Author: YangCaiyin <[email protected]>
AuthorDate: Wed Oct 18 00:33:06 2023 +0800
[IOTDB-6192] Remove redundant mergeSortOperator in 'ORDER BY TIME ALIGN BY
DEVICE' (#11320)
---
.../plan/planner/LogicalPlanBuilder.java | 30 ++++++++++++++--------
.../plan/distribution/AlignedByDeviceTest.java | 23 +++++++++++++++++
2 files changed, 43 insertions(+), 10 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
index 4894f264ed1..830bd907862 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
@@ -817,16 +817,26 @@ public class LogicalPlanBuilder {
}
// order by time + no limit, device can be optimized by
SingleDeviceViewNode and MergeSortNode
else if (queryStatement.isOrderByBasedOnTime() &&
!queryStatement.hasOrderByExpression()) {
- MergeSortNode mergeSortNode =
- new MergeSortNode(
- context.getQueryId().genPlanNodeId(), orderByParameter,
outputColumnNames);
- addSingleDeviceViewNodes(
- mergeSortNode,
- deviceNameToSourceNodesMap,
- outputColumnNames,
- deviceToMeasurementIndexesMap,
- -1);
- this.root = mergeSortNode;
+ if (deviceNameToSourceNodesMap.size() == 1) {
+ this.root =
+ addDeviceViewNode(
+ orderByParameter,
+ outputColumnNames,
+ deviceToMeasurementIndexesMap,
+ deviceNameToSourceNodesMap,
+ -1);
+ } else {
+ MergeSortNode mergeSortNode =
+ new MergeSortNode(
+ context.getQueryId().genPlanNodeId(), orderByParameter,
outputColumnNames);
+ addSingleDeviceViewNodes(
+ mergeSortNode,
+ deviceNameToSourceNodesMap,
+ outputColumnNames,
+ deviceToMeasurementIndexesMap,
+ -1);
+ this.root = mergeSortNode;
+ }
} else {
this.root =
addDeviceViewNode(
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/plan/distribution/AlignedByDeviceTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/plan/distribution/AlignedByDeviceTest.java
index 3bf5e139435..f300d0231e6 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/plan/distribution/AlignedByDeviceTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/plan/distribution/AlignedByDeviceTest.java
@@ -1465,4 +1465,27 @@ public class AlignedByDeviceTest {
f3Root.getChildren().get(0).getChildren().get(0).getChildren().get(0)
instanceof TimeJoinNode);
}
+
+ @Test
+ public void testOrderByWithoutRedundantMergeSortOperator() {
+ QueryId queryId = new QueryId("test");
+ MPPQueryContext context =
+ new MPPQueryContext("", queryId, null, new TEndPoint(), new
TEndPoint());
+ String sql = "select * from root.sg.d1 order by time asc align by device";
+ Analysis analysis = Util.analyze(sql, context);
+ PlanNode logicalPlanNode = Util.genLogicalPlan(analysis, context);
+ assertTrue(logicalPlanNode instanceof DeviceViewNode);
+ DistributionPlanner planner =
+ new DistributionPlanner(analysis, new LogicalQueryPlan(context,
logicalPlanNode));
+ DistributedQueryPlan plan = planner.planFragments();
+ assertEquals(2, plan.getInstances().size());
+
+ sql = "select * from root.sg.d22 order by time asc align by device";
+ analysis = Util.analyze(sql, context);
+ logicalPlanNode = Util.genLogicalPlan(analysis, context);
+ assertTrue(logicalPlanNode instanceof DeviceViewNode);
+ planner = new DistributionPlanner(analysis, new LogicalQueryPlan(context,
logicalPlanNode));
+ plan = planner.planFragments();
+ assertEquals(1, plan.getInstances().size());
+ }
}