Merge branch 'cassandra-2.0' into trunk Conflicts: src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/fd888bcb Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/fd888bcb Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/fd888bcb Branch: refs/heads/trunk Commit: fd888bcbcce2fda02c636e9b6d45cae9097180ca Parents: 0a89f38 71a5127 Author: Sylvain Lebresne <sylv...@datastax.com> Authored: Mon Jan 13 10:36:29 2014 +0100 Committer: Sylvain Lebresne <sylv...@datastax.com> Committed: Mon Jan 13 10:36:29 2014 +0100 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../cql3/statements/SelectStatement.java | 21 ++++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/fd888bcb/CHANGES.txt ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/fd888bcb/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index 4d89988,c3671be..5d5c12f --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@@ -799,39 -784,51 +799,40 @@@ public class SelectStatement implement return expressions; } - - private Iterable<Column> columnsInOrder(final ColumnFamily cf, final List<ByteBuffer> variables) throws InvalidRequestException + private static ByteBuffer validateIndexedValue(ColumnDefinition def, ByteBuffer value) throws InvalidRequestException { - if (columnRestrictions.length == 0) - return cf.getSortedColumns(); - - // If the restriction for the last column alias is an IN, respect - // requested order - Restriction last = columnRestrictions[columnRestrictions.length - 1]; - if (last == null || last.isSlice()) - return cf.getSortedColumns(); - - ColumnNameBuilder builder = cfDef.getColumnNameBuilder(); - for (int i = 0; i < columnRestrictions.length - 1; i++) - builder.add(columnRestrictions[i].values(variables).get(0)); + if (value == null) + throw new InvalidRequestException(String.format("Unsupported null value for indexed column %s", def.name)); + if (value.remaining() > 0xFFFF) + throw new InvalidRequestException("Index expression values may not be larger than 64K"); + return value; + } + private Iterator<Cell> applySliceRestriction(final Iterator<Cell> cells, final List<ByteBuffer> variables) throws InvalidRequestException + { + assert sliceRestriction != null; - List<ByteBuffer> values = last.values(variables); - final List<ByteBuffer> requested = new ArrayList<ByteBuffer>(values.size()); - Iterator<ByteBuffer> iter = values.iterator(); - while (iter.hasNext()) - { - ByteBuffer t = iter.next(); - ColumnNameBuilder b = iter.hasNext() ? builder.copy() : builder; - requested.add(b.add(t).build()); - } + final CellNameType type = cfm.comparator; + final CellName excludedStart = sliceRestriction.isInclusive(Bound.START) ? null : type.makeCellName(sliceRestriction.bound(Bound.START, variables)); + final CellName excludedEnd = sliceRestriction.isInclusive(Bound.END) ? null : type.makeCellName(sliceRestriction.bound(Bound.END, variables)); - return new Iterable<Column>() + return new AbstractIterator<Cell>() { - public Iterator<Column> iterator() + protected Cell computeNext() { - if (!cells.hasNext()) - return endOfData(); - - Cell c = cells.next(); - return new AbstractIterator<Column>() ++ while (cells.hasNext()) + { - Iterator<ByteBuffer> iter = requested.iterator(); - public Column computeNext() - { - while (iter.hasNext()) - { - Column column = cf.getColumn(iter.next()); - if (column != null) - return column; - } - return endOfData(); - } - }; ++ Cell c = cells.next(); + - // For dynamic CF, the column could be out of the requested bounds (because we don't support strict bounds internally (unless - // the comparator is composite that is)), filter here - if ( (excludedStart != null && type.compare(c.name(), excludedStart) == 0) - || (excludedEnd != null && type.compare(c.name(), excludedEnd) == 0) ) - return computeNext(); ++ // For dynamic CF, the column could be out of the requested bounds (because we don't support strict bounds internally (unless ++ // the comparator is composite that is)), filter here ++ if ( (excludedStart != null && type.compare(c.name(), excludedStart) == 0) ++ || (excludedEnd != null && type.compare(c.name(), excludedEnd) == 0) ) ++ continue; + - return c; ++ return c; ++ } ++ return endOfData(); } }; }