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

xiangfu pushed a commit to branch winedepot-0.10
in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git

commit e80b53a474a925a6c762e7b73893923aa1aefd9f
Author: Xiang Fu <[email protected]>
AuthorDate: Mon Aug 19 18:44:28 2019 -0700

    Fixing the issue of selection order by won't give correct ordering
---
 .../core/query/selection/SelectionOperatorService.java  | 17 +++++++++++++++--
 .../tests/OfflineClusterIntegrationTest.java            | 16 ++++++++++++++++
 2 files changed, 31 insertions(+), 2 deletions(-)

diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/query/selection/SelectionOperatorService.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/query/selection/SelectionOperatorService.java
index 16d4d8a..f504507 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/query/selection/SelectionOperatorService.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/query/selection/SelectionOperatorService.java
@@ -20,6 +20,7 @@ package org.apache.pinot.core.query.selection;
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashSet;
@@ -70,6 +71,7 @@ import 
org.apache.pinot.core.query.selection.comparator.CompositeDocIdValCompara
 public class SelectionOperatorService {
   private final List<String> _selectionColumns;
   private final List<SelectionSort> _sortSequence;
+  private final List<Integer> _sortColumnIdx;
   private final DataSchema _dataSchema;
   private final int _selectionOffset;
   private final int _maxNumRows;
@@ -86,6 +88,7 @@ public class SelectionOperatorService {
   public SelectionOperatorService(@Nonnull Selection selection, @Nonnull 
IndexSegment indexSegment) {
     _selectionColumns = 
SelectionOperatorUtils.getSelectionColumns(selection.getSelectionColumns(), 
indexSegment);
     _sortSequence = getSortSequence(selection.getSelectionSortSequence());
+    _sortColumnIdx = getSortColumnIdx(_sortSequence, _selectionColumns);
     _dataSchema = SelectionOperatorUtils.extractDataSchema(_sortSequence, 
_selectionColumns, indexSegment);
     // Select rows from offset to offset + size.
     _selectionOffset = selection.getOffset();
@@ -93,6 +96,14 @@ public class SelectionOperatorService {
     _rows = new PriorityQueue<>(_maxNumRows, getStrictComparator());
   }
 
+  private List<Integer> getSortColumnIdx(List<SelectionSort> sortSequence, 
List<String> selectionColumns) {
+    List<Integer> sortColumnIdx = new ArrayList<>();
+    for (SelectionSort seq: sortSequence) {
+      sortColumnIdx.add(selectionColumns.indexOf(seq.column));
+    }
+    return sortColumnIdx;
+  }
+
   /**
    * Constructor for <code>SelectionOperatorService</code> with {@link 
DataSchema}. (Inter segment)
    *
@@ -102,6 +113,7 @@ public class SelectionOperatorService {
   public SelectionOperatorService(@Nonnull Selection selection, @Nonnull 
DataSchema dataSchema) {
     _selectionColumns = 
SelectionOperatorUtils.getSelectionColumns(selection.getSelectionColumns(), 
dataSchema);
     _sortSequence = getSortSequence(selection.getSelectionSortSequence());
+    _sortColumnIdx = getSortColumnIdx(_sortSequence, _selectionColumns);
     _dataSchema = dataSchema;
     // Select rows from offset to offset + size.
     _selectionOffset = selection.getOffset();
@@ -211,8 +223,9 @@ public class SelectionOperatorService {
         for (int i = 0; i < numSortColumns; i++) {
           int ret = 0;
           SelectionSort selectionSort = _sortSequence.get(i);
-          Serializable v1 = o1[i];
-          Serializable v2 = o2[i];
+          int colIdx = _sortColumnIdx.get(i);
+          Serializable v1 = o1[colIdx];
+          Serializable v2 = o2[colIdx];
 
           // Only compare single-value columns.
           if (v1 instanceof Number) {
diff --git 
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java
 
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java
index 456efb4..c9ab5b7 100644
--- 
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java
+++ 
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java
@@ -681,6 +681,22 @@ public class OfflineClusterIntegrationTest extends 
BaseClusterIntegrationTestSet
         "SELECT ArrTime, ArrTime, count(*) FROM mytable WHERE DaysSinceEpoch 
<= 16312 AND Carrier = 'DL' group by ArrTime, ArrTime"));
   }
 
+  @Test
+  public void testQueryWithOrderby()
+      throws Exception {
+    //test repeated columns in selection query
+    String query = "SELECT ArrTime, Carrier, DaysSinceEpoch FROM mytable ORDER 
BY DaysSinceEpoch DESC";
+    testQuery(query, Collections.singletonList(query));
+
+    //test repeated columns in selection query
+    query = "SELECT ArrTime, DaysSinceEpoch, Carrier FROM mytable ORDER BY 
Carrier DESC";
+    testQuery(query, Collections.singletonList(query));
+
+    //test repeated columns in selection query
+    query = "SELECT ArrTime, DaysSinceEpoch, Carrier FROM mytable ORDER BY 
Carrier DESC, ArrTime DESC";
+    testQuery(query, Collections.singletonList(query));
+  }
+
   @AfterClass
   public void tearDown()
       throws Exception {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to