This is an automated email from the ASF dual-hosted git repository.

jackietien 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 d883b100094 Fix the error that columns in sort is not appear in 
projection
d883b100094 is described below

commit d883b10009422595a6cafa8f59a398dda0e66567
Author: Beyyes <[email protected]>
AuthorDate: Fri Aug 23 09:21:43 2024 +0800

    Fix the error that columns in sort is not appear in projection
---
 .../it}/IoTDBMultiIDsWithAttributesTableIT.java    |  37 +++++-
 .../plan/planner/TableOperatorGenerator.java       |   3 +-
 .../rule/MergeLimitOverProjectWithMergeSort.java   |   4 +-
 .../rule/MergeLimitOverProjectWithSort.java        |  16 ++-
 .../iterative/rule/MergeLimitWithMergeSort.java    |   8 +-
 .../planner/iterative/rule/MergeLimitWithSort.java |  13 +-
 .../plan/relational/analyzer/SortTest.java         | 141 ++++++++++++---------
 7 files changed, 142 insertions(+), 80 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/orderBy/IoTDBMultiIDsWithAttributesTableIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBMultiIDsWithAttributesTableIT.java
similarity index 93%
rename from 
integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/orderBy/IoTDBMultiIDsWithAttributesTableIT.java
rename to 
integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBMultiIDsWithAttributesTableIT.java
index aee3ff0ab2b..270012a9b83 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/orderBy/IoTDBMultiIDsWithAttributesTableIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBMultiIDsWithAttributesTableIT.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.relational.it.query.old.orderBy;
+package org.apache.iotdb.relational.it.db.it;
 
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -346,4 +346,39 @@ public class IoTDBMultiIDsWithAttributesTableIT {
         retArray,
         DATABASE_NAME);
   }
+
+  @Test
+  public void projectSortTest() {
+    String[] expectedHeader = new String[] {"level", "attr1", "device", "num", 
"date"};
+    String[] retArray =
+        new String[] {
+          "l2,yy,d1,2,null,",
+          "l2,yy,d1,10,null,",
+          "l2,yy,d1,12,null,",
+          "l1,c,d1,3,null,",
+          "l1,c,d1,6,null,",
+          "l1,c,d1,11,null,",
+        };
+    tableResultSetEqualTest(
+        "select level,attr1,device,num,date from table0 order by attr2 
desc,time limit 6",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    expectedHeader = new String[] {"time", "level", "attr2", "str"};
+    retArray =
+        new String[] {
+          "1970-01-01T00:00:00.040Z,l3,a,apricot,",
+          "1970-01-01T00:00:00.040Z,l3,null,apricot,",
+          "1970-01-01T00:00:00.020Z,l2,null,pineapple,",
+          "1970-01-01T00:00:00.020Z,l2,zz,pineapple,",
+          "1970-01-01T00:00:00.000Z,l1,d,coconut,",
+          "1970-01-01T00:00:00.000Z,l1,c,coconut,",
+        };
+    tableResultSetEqualTest(
+        "select time,level,attr2,str from table0 order by num+1,attr1 limit 6",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
index 232c5f61d2e..57a087fcdb2 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
@@ -677,7 +677,8 @@ public class TableOperatorGenerator extends 
PlanVisitor<Operator, LocalExecution
               Integer i = columnIndex.get(sortItem);
               if (i == null) {
                 throw new IllegalStateException(
-                    "Sort Item %s is not included in children's output 
columns");
+                    String.format(
+                        "Sort Item %s is not included in children's output 
columns", sortItem));
               }
               sortItemIndexList.add(i);
               
sortItemDataTypeList.add(getTSDataType(typeProvider.getTableModelType(sortItem)));
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitOverProjectWithMergeSort.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitOverProjectWithMergeSort.java
index 6e720e2def4..97c0303a1c1 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitOverProjectWithMergeSort.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitOverProjectWithMergeSort.java
@@ -39,7 +39,9 @@ import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.Patte
 import static 
org.apache.iotdb.db.queryengine.plan.relational.utils.matching.Capture.newCapture;
 
 /**
- * Transforms:
+ * <b>Optimization phase:</b> Distributed plan planning.
+ *
+ * <p>Transforms:
  *
  * <pre>
  * - Limit (limit = x)
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitOverProjectWithSort.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitOverProjectWithSort.java
index cc78b745b72..879d0833910 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitOverProjectWithSort.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitOverProjectWithSort.java
@@ -38,7 +38,9 @@ import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.Patte
 import static 
org.apache.iotdb.db.queryengine.plan.relational.utils.matching.Capture.newCapture;
 
 /**
- * Transforms:
+ * <b>Optimization phase:</b> Logical plan planning.
+ *
+ * <p>Transforms:
  *
  * <pre>
  * - Limit (limit = x)
@@ -78,9 +80,9 @@ public class MergeLimitOverProjectWithSort implements 
Rule<LimitNode> {
   @Override
   public Result apply(LimitNode parent, Captures captures, Context context) {
     ProjectNode project = captures.get(PROJECT);
-    SortNode sort = captures.get(SORT);
+    SortNode sortNode = captures.get(SORT);
 
-    if (sort instanceof StreamSortNode) {
+    if (sortNode instanceof StreamSortNode) {
       return Result.empty();
     }
 
@@ -89,10 +91,10 @@ public class MergeLimitOverProjectWithSort implements 
Rule<LimitNode> {
             ImmutableList.of(
                 new TopKNode(
                     parent.getPlanNodeId(),
-                    sort.getChildren(),
-                    sort.getOrderingScheme(),
+                    sortNode.getChildren(),
+                    sortNode.getOrderingScheme(),
                     parent.getCount(),
-                    parent.getOutputSymbols(),
-                    sort.isOrderByAllIdsAndTime()))));
+                    sortNode.getOutputSymbols(),
+                    sortNode.isOrderByAllIdsAndTime()))));
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitWithMergeSort.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitWithMergeSort.java
index 71bf6bca346..fa645972be1 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitWithMergeSort.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitWithMergeSort.java
@@ -31,7 +31,9 @@ import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.Patte
 import static 
org.apache.iotdb.db.queryengine.plan.relational.utils.matching.Capture.newCapture;
 
 /**
- * Transforms:
+ * <b>Optimization phase:</b> Distributed plan planning.
+ *
+ * <p>Transforms:
  *
  * <pre>
  * - Limit (limit = x)
@@ -90,7 +92,7 @@ public class MergeLimitWithMergeSort implements 
Rule<LimitNode> {
               parent.getPlanNodeId(),
               mergeSortNode.getOrderingScheme(),
               parent.getCount(),
-              parent.getOutputSymbols(),
+              childOfMergeSort.getOutputSymbols(),
               true);
       for (PlanNode child : mergeSortNode.getChildren()) {
         LimitNode limitNode =
@@ -109,7 +111,7 @@ public class MergeLimitWithMergeSort implements 
Rule<LimitNode> {
               mergeSortNode.getChildren(),
               mergeSortNode.getOrderingScheme(),
               parent.getCount(),
-              parent.getOutputSymbols(),
+              childOfMergeSort.getOutputSymbols(),
               true);
     }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitWithSort.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitWithSort.java
index 49913558f38..92962a0e05d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitWithSort.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/MergeLimitWithSort.java
@@ -27,6 +27,7 @@ import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.Patte
 import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.Patterns.source;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.utils.matching.Capture.newCapture;
 
+/** <b>Optimization phase:</b> Logical plan planning. */
 public class MergeLimitWithSort implements Rule<LimitNode> {
   private static final Capture<SortNode> CHILD = newCapture();
 
@@ -42,19 +43,19 @@ public class MergeLimitWithSort implements Rule<LimitNode> {
 
   @Override
   public Result apply(LimitNode parent, Captures captures, Context context) {
-    SortNode child = captures.get(CHILD);
+    SortNode sortNode = captures.get(CHILD);
 
-    if (child instanceof StreamSortNode) {
+    if (sortNode instanceof StreamSortNode) {
       return Result.empty();
     }
 
     return Result.ofPlanNode(
         new TopKNode(
             parent.getPlanNodeId(),
-            child.getChildren(),
-            child.getOrderingScheme(),
+            sortNode.getChildren(),
+            sortNode.getOrderingScheme(),
             parent.getCount(),
-            parent.getOutputSymbols(),
-            child.isOrderByAllIdsAndTime()));
+            sortNode.getOutputSymbols(),
+            sortNode.isOrderByAllIdsAndTime()));
   }
 }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/SortTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/SortTest.java
index e00e6bedd79..b779fbc53c7 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/SortTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/SortTest.java
@@ -74,11 +74,9 @@ public class SortTest {
   Analysis actualAnalysis;
   MPPQueryContext context;
   WarningCollector warningCollector = WarningCollector.NOOP;
-  LogicalPlanner logicalPlanner;
   LogicalQueryPlan logicalQueryPlan;
-  PlanNode rootNode;
+  PlanNode logicalPlanNode;
   OutputNode outputNode;
-  PlanNode mergeSortNode;
   ProjectNode projectNode;
   StreamSortNode streamSortNode;
   TableDistributedPlanner distributionPlanner;
@@ -103,15 +101,15 @@ public class SortTest {
     actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
-    rootNode = logicalQueryPlan.getRootNode();
+    logicalPlanNode = logicalQueryPlan.getRootNode();
 
     // LogicalPlan: 
`Output-Offset-Limit-Project-StreamSort-Project-Filter-TableScan`
-    assertTrue(rootNode instanceof OutputNode);
-    assertTrue(getChildrenNode(rootNode, 1) instanceof OffsetNode);
-    assertTrue(getChildrenNode(rootNode, 2) instanceof LimitNode);
-    assertTrue(getChildrenNode(rootNode, 3) instanceof ProjectNode);
-    assertTrue(getChildrenNode(rootNode, 4) instanceof StreamSortNode);
-    streamSortNode = (StreamSortNode) getChildrenNode(rootNode, 4);
+    assertTrue(logicalPlanNode instanceof OutputNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 1) instanceof OffsetNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 2) instanceof LimitNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 3) instanceof ProjectNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 4) instanceof StreamSortNode);
+    streamSortNode = (StreamSortNode) getChildrenNode(logicalPlanNode, 4);
     assertTrue(getChildrenNode(streamSortNode, 1) instanceof ProjectNode);
     assertTrue(getChildrenNode(streamSortNode, 2) instanceof FilterNode);
     assertTrue(getChildrenNode(streamSortNode, 3) instanceof TableScanNode);
@@ -179,9 +177,9 @@ public class SortTest {
     actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
-    rootNode = logicalQueryPlan.getRootNode();
+    logicalPlanNode = logicalQueryPlan.getRootNode();
     // LogicalPlan: `Output-Offset-Limit-StreamSort-TableScan`
-    assertTrue(getChildrenNode(rootNode, 3) instanceof StreamSortNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 3) instanceof StreamSortNode);
     distributionPlanner = new TableDistributedPlanner(actualAnalysis, 
logicalQueryPlan, context);
     distributedQueryPlan = distributionPlanner.plan();
     assertEquals(3, distributedQueryPlan.getFragments().size());
@@ -205,15 +203,15 @@ public class SortTest {
     actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
-    rootNode = logicalQueryPlan.getRootNode();
+    logicalPlanNode = logicalQueryPlan.getRootNode();
 
     // LogicalPlan: 
`Output-Offset-Limit-Project-StreamSort-Project-Filter-TableScan`
-    assertTrue(rootNode instanceof OutputNode);
-    assertTrue(getChildrenNode(rootNode, 1) instanceof OffsetNode);
-    assertTrue(getChildrenNode(rootNode, 2) instanceof LimitNode);
-    assertTrue(getChildrenNode(rootNode, 3) instanceof ProjectNode);
-    assertTrue(getChildrenNode(rootNode, 4) instanceof StreamSortNode);
-    StreamSortNode streamSortNode = (StreamSortNode) getChildrenNode(rootNode, 
4);
+    assertTrue(logicalPlanNode instanceof OutputNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 1) instanceof OffsetNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 2) instanceof LimitNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 3) instanceof ProjectNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 4) instanceof StreamSortNode);
+    StreamSortNode streamSortNode = (StreamSortNode) 
getChildrenNode(logicalPlanNode, 4);
     assertTrue(getChildrenNode(streamSortNode, 1) instanceof ProjectNode);
     assertTrue(getChildrenNode(streamSortNode, 2) instanceof FilterNode);
     assertTrue(getChildrenNode(streamSortNode, 3) instanceof TableScanNode);
@@ -283,13 +281,13 @@ public class SortTest {
     actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
-    rootNode = logicalQueryPlan.getRootNode();
+    logicalPlanNode = logicalQueryPlan.getRootNode();
 
     // LogicalPlan: `Output-Project-StreamSort-Project-Filter-TableScan`
-    assertTrue(rootNode instanceof OutputNode);
-    assertTrue(getChildrenNode(rootNode, 1) instanceof ProjectNode);
-    assertTrue(getChildrenNode(rootNode, 2) instanceof StreamSortNode);
-    StreamSortNode streamSortNode = (StreamSortNode) getChildrenNode(rootNode, 
2);
+    assertTrue(logicalPlanNode instanceof OutputNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 1) instanceof ProjectNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 2) instanceof StreamSortNode);
+    StreamSortNode streamSortNode = (StreamSortNode) 
getChildrenNode(logicalPlanNode, 2);
     assertTrue(getChildrenNode(streamSortNode, 1) instanceof ProjectNode);
     assertTrue(getChildrenNode(streamSortNode, 2) instanceof FilterNode);
     assertTrue(getChildrenNode(streamSortNode, 3) instanceof TableScanNode);
@@ -351,15 +349,15 @@ public class SortTest {
     actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
-    rootNode = logicalQueryPlan.getRootNode();
+    logicalPlanNode = logicalQueryPlan.getRootNode();
 
     // LogicalPlan: 
`Output-Offset-Limit-Project-StreamSort-Project-Filter-TableScan`
-    assertTrue(rootNode instanceof OutputNode);
-    assertTrue(getChildrenNode(rootNode, 1) instanceof OffsetNode);
-    assertTrue(getChildrenNode(rootNode, 2) instanceof LimitNode);
-    assertTrue(getChildrenNode(rootNode, 3) instanceof ProjectNode);
-    assertTrue(getChildrenNode(rootNode, 4) instanceof StreamSortNode);
-    streamSortNode = (StreamSortNode) getChildrenNode(rootNode, 4);
+    assertTrue(logicalPlanNode instanceof OutputNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 1) instanceof OffsetNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 2) instanceof LimitNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 3) instanceof ProjectNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 4) instanceof StreamSortNode);
+    streamSortNode = (StreamSortNode) getChildrenNode(logicalPlanNode, 4);
     assertEquals(1, streamSortNode.getStreamCompareKeyEndIndex());
     assertTrue(getChildrenNode(streamSortNode, 1) instanceof ProjectNode);
     assertTrue(getChildrenNode(streamSortNode, 2) instanceof FilterNode);
@@ -431,15 +429,15 @@ public class SortTest {
     actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
-    rootNode = logicalQueryPlan.getRootNode();
+    logicalPlanNode = logicalQueryPlan.getRootNode();
 
     // LogicalPlan: 
`Output-Offset-Limit-Project-StreamSort-Project-Filter-TableScan`
-    assertTrue(rootNode instanceof OutputNode);
-    assertTrue(getChildrenNode(rootNode, 1) instanceof OffsetNode);
-    assertTrue(getChildrenNode(rootNode, 2) instanceof LimitNode);
-    assertTrue(getChildrenNode(rootNode, 3) instanceof ProjectNode);
-    assertTrue(getChildrenNode(rootNode, 4) instanceof StreamSortNode);
-    streamSortNode = (StreamSortNode) getChildrenNode(rootNode, 4);
+    assertTrue(logicalPlanNode instanceof OutputNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 1) instanceof OffsetNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 2) instanceof LimitNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 3) instanceof ProjectNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 4) instanceof StreamSortNode);
+    streamSortNode = (StreamSortNode) getChildrenNode(logicalPlanNode, 4);
     assertEquals(2, streamSortNode.getStreamCompareKeyEndIndex());
     assertTrue(getChildrenNode(streamSortNode, 1) instanceof ProjectNode);
     assertTrue(getChildrenNode(streamSortNode, 2) instanceof FilterNode);
@@ -509,7 +507,7 @@ public class SortTest {
     actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
-    rootNode = logicalQueryPlan.getRootNode();
+    logicalPlanNode = logicalQueryPlan.getRootNode();
 
     assertTopKNoFilter(originalDeviceEntries1, originalDeviceEntries2, DESC, 
15, 0, true);
 
@@ -521,7 +519,7 @@ public class SortTest {
     actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
-    rootNode = logicalQueryPlan.getRootNode();
+    logicalPlanNode = logicalQueryPlan.getRootNode();
     assertTopKWithFilter(originalDeviceEntries1, originalDeviceEntries2, DESC, 
0, 0, false);
 
     // order by time, others, all_ids; has filter
@@ -532,7 +530,7 @@ public class SortTest {
     actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
-    rootNode = logicalQueryPlan.getRootNode();
+    logicalPlanNode = logicalQueryPlan.getRootNode();
     assertTopKWithFilter(originalDeviceEntries1, originalDeviceEntries2, DESC, 
0, 0, false);
 
     // order by time, all_ids, others; has filter
@@ -543,7 +541,7 @@ public class SortTest {
     actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
-    rootNode = logicalQueryPlan.getRootNode();
+    logicalPlanNode = logicalQueryPlan.getRootNode();
 
     assertTopKWithFilter(originalDeviceEntries1, originalDeviceEntries2, DESC, 
0, 0, false);
   }
@@ -558,7 +556,7 @@ public class SortTest {
     actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
-    rootNode = logicalQueryPlan.getRootNode();
+    logicalPlanNode = logicalQueryPlan.getRootNode();
     assertTopKNoFilter(originalDeviceEntries1, originalDeviceEntries2, ASC, 0, 
0, false);
 
     // order by others, all_ids, time
@@ -569,7 +567,7 @@ public class SortTest {
     actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
-    rootNode = logicalQueryPlan.getRootNode();
+    logicalPlanNode = logicalQueryPlan.getRootNode();
     assertTopKWithFilter(originalDeviceEntries1, originalDeviceEntries2, ASC, 
0, 0, false);
 
     // order by others, time, some_ids
@@ -580,7 +578,7 @@ public class SortTest {
     actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
-    rootNode = logicalQueryPlan.getRootNode();
+    logicalPlanNode = logicalQueryPlan.getRootNode();
     assertTopKWithFilter(originalDeviceEntries1, originalDeviceEntries2, ASC, 
0, 0, false);
 
     // order by others, time, all_ids
@@ -591,10 +589,31 @@ public class SortTest {
     actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
-    rootNode = logicalQueryPlan.getRootNode();
+    logicalPlanNode = logicalQueryPlan.getRootNode();
     assertTopKWithFilter(originalDeviceEntries1, originalDeviceEntries2, ASC, 
0, 0, false);
   }
 
+  @Test
+  public void projectSortTest() {
+    // columns in order and select is different
+    sql = "SELECT time, attr1, s1 FROM table1 order by attr2 limit 5";
+    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
+    logicalQueryPlan =
+        new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
+    logicalPlanNode = logicalQueryPlan.getRootNode();
+    distributionPlanner = new TableDistributedPlanner(actualAnalysis, 
logicalQueryPlan, context);
+    distributedQueryPlan = distributionPlanner.plan();
+    assertEquals(3, distributedQueryPlan.getFragments().size());
+    IdentitySinkNode sinkNode =
+        (IdentitySinkNode) 
distributedQueryPlan.getFragments().get(0).getPlanNodeTree();
+    assertTrue(getChildrenNode(sinkNode, 1) instanceof OutputNode);
+    assertTrue(getChildrenNode(sinkNode, 2) instanceof ProjectNode);
+    assertTrue(getChildrenNode(sinkNode, 3) instanceof TopKNode);
+    TopKNode topKNode = (TopKNode) getChildrenNode(sinkNode, 3);
+    assertEquals(4, topKNode.getOutputSymbols().size());
+  }
+
   public void assertTopKWithFilter(
       List<String> deviceEntries1,
       List<String> deviceEntries2,
@@ -603,14 +622,14 @@ public class SortTest {
       long expectedPushDownOffset,
       boolean isPushLimitToEachDevice) {
     // LogicalPlan: `Output - Offset - Project - TopK - Project - FilterNode - 
TableScan`
-    assertTrue(rootNode instanceof OutputNode);
-    assertTrue(getChildrenNode(rootNode, 1) instanceof OffsetNode);
-    assertTrue(getChildrenNode(rootNode, 2) instanceof ProjectNode);
-    assertTrue(getChildrenNode(rootNode, 3) instanceof TopKNode);
-    assertTrue(getChildrenNode(rootNode, 4) instanceof ProjectNode);
-    assertTrue(getChildrenNode(rootNode, 5) instanceof FilterNode);
-    assertTrue(getChildrenNode(rootNode, 6) instanceof TableScanNode);
-    tableScanNode = (TableScanNode) getChildrenNode(rootNode, 6);
+    assertTrue(logicalPlanNode instanceof OutputNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 1) instanceof OffsetNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 2) instanceof ProjectNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 3) instanceof TopKNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 4) instanceof ProjectNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 5) instanceof FilterNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 6) instanceof TableScanNode);
+    tableScanNode = (TableScanNode) getChildrenNode(logicalPlanNode, 6);
     assertEquals("testdb.table1", 
tableScanNode.getQualifiedObjectName().toString());
     assertEquals(8, tableScanNode.getAssignments().size());
     assertEquals(6, tableScanNode.getDeviceEntries().size());
@@ -672,13 +691,13 @@ public class SortTest {
       long expectedPushDownOffset,
       boolean isPushLimitToEachDevice) {
     // LogicalPlan: `Output - Offset - Project - TopK - Project -  TableScan`
-    assertTrue(rootNode instanceof OutputNode);
-    assertTrue(getChildrenNode(rootNode, 1) instanceof OffsetNode);
-    assertTrue(getChildrenNode(rootNode, 2) instanceof ProjectNode);
-    assertTrue(getChildrenNode(rootNode, 3) instanceof TopKNode);
-    assertTrue(getChildrenNode(rootNode, 4) instanceof ProjectNode);
-    assertTrue(getChildrenNode(rootNode, 5) instanceof TableScanNode);
-    tableScanNode = (TableScanNode) getChildrenNode(rootNode, 5);
+    assertTrue(logicalPlanNode instanceof OutputNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 1) instanceof OffsetNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 2) instanceof ProjectNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 3) instanceof TopKNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 4) instanceof ProjectNode);
+    assertTrue(getChildrenNode(logicalPlanNode, 5) instanceof TableScanNode);
+    tableScanNode = (TableScanNode) getChildrenNode(logicalPlanNode, 5);
     assertEquals("testdb.table1", 
tableScanNode.getQualifiedObjectName().toString());
     assertEquals(8, tableScanNode.getAssignments().size());
     assertEquals(6, tableScanNode.getDeviceEntries().size());

Reply via email to