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

Reply via email to