fix error when using ORDER BY with extended selections patch by Pavel Yaskevich; reviewed by Sylvain Lebresne for CASSANDRA-4689
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/a4c397b4 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/a4c397b4 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/a4c397b4 Branch: refs/heads/trunk Commit: a4c397b49c08f543fd42ddc21a6312bce5571947 Parents: c565b64 Author: Pavel Yaskevich <[email protected]> Authored: Thu Sep 20 01:11:23 2012 +0300 Committer: Pavel Yaskevich <[email protected]> Committed: Thu Sep 20 16:39:22 2012 +0300 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../cassandra/cql3/statements/SelectStatement.java | 15 ++++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/a4c397b4/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 0530134..65ba88f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,6 +4,7 @@ * fix assumption error in CLI when updating/describing keyspace (CASSANDRA-4322) * Adds offline sstablescrub to debian packaging (CASSANDRA-4642) * Automatic fixing of overlapping leveled sstables (CASSANDRA-4644) + * fix error when using ORDER BY with extended selections (CASSANDRA-4689) 1.1.5 http://git-wip-us.apache.org/repos/asf/cassandra/blob/a4c397b4/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index a4d64cf..4a013b1 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -804,7 +804,7 @@ public class SelectStatement implements CQLStatement } } - orderResults(cqlRows); + orderResults(selection, cqlRows); // Internal calls always return columns in the comparator order, even when reverse was set if (isReversed) @@ -819,7 +819,7 @@ public class SelectStatement implements CQLStatement /** * Orders results when multiple keys are selected (using IN) */ - private void orderResults(List<CqlRow> cqlRows) + private void orderResults(List<Pair<CFDefinition.Name, Selector>> selection, List<CqlRow> cqlRows) { // There is nothing to do if // a. there are no results, @@ -828,12 +828,13 @@ public class SelectStatement implements CQLStatement if (cqlRows.isEmpty() || parameters.orderings.isEmpty() || keyRestriction == null || keyRestriction.eqValues.size() < 2) return; + // optimization when only *one* order condition was given // because there is no point of using composite comparator if there is only one order condition if (parameters.orderings.size() == 1) { CFDefinition.Name ordering = cfDef.get(parameters.orderings.keySet().iterator().next()); - Collections.sort(cqlRows, new SingleColumnComparator(getColumnPositionInSelect(ordering), ordering.type)); + Collections.sort(cqlRows, new SingleColumnComparator(getColumnPositionInSelect(selection, ordering), ordering.type)); return; } @@ -848,18 +849,18 @@ public class SelectStatement implements CQLStatement { CFDefinition.Name orderingColumn = cfDef.get(identifier); types.add(orderingColumn.type); - positions[idx++] = getColumnPositionInSelect(orderingColumn); + positions[idx++] = getColumnPositionInSelect(selection, orderingColumn); } Collections.sort(cqlRows, new CompositeComparator(types, positions)); } // determine position of column in the select clause - private int getColumnPositionInSelect(CFDefinition.Name columnName) + private int getColumnPositionInSelect(List<Pair<CFDefinition.Name, Selector>> selection, CFDefinition.Name columnName) { - for (int i = 0; i < selectedNames.size(); i++) + for (int i = 0; i < selection.size(); i++) { - if (selectedNames.get(i).left.equals(columnName)) + if (selection.get(i).left.equals(columnName)) return i; }
