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]
