Merge branch 'cassandra-2.0' into cassandra-2.1
Conflicts:
CHANGES.txt
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/94f25ce1
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/94f25ce1
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/94f25ce1
Branch: refs/heads/trunk
Commit: 94f25ce15923e9a790a01a8210e141606f9091a4
Parents: 7abd76e 20e058b
Author: Sylvain Lebresne <[email protected]>
Authored: Wed May 21 11:36:18 2014 +0200
Committer: Sylvain Lebresne <[email protected]>
Committed: Wed May 21 11:36:18 2014 +0200
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../cql3/statements/SelectStatement.java | 20 +++++++++++++++++++-
2 files changed, 20 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/94f25ce1/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 12de385,bd0031e..0b8be6e
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -57,6 -28,25 +57,7 @@@ Merged from 2.0
* Re-add parameter columns to tracing session (CASSANDRA-6942)
* Fix writetime/ttl functions for static columns (CASSANDRA-7081)
* Suggest CTRL-C or semicolon after three blank lines in cqlsh
(CASSANDRA-7142)
- * (Hadoop) support authentication in CqlRecordReader (CASSANDRA-7221)
- * (Hadoop) Close java driver Cluster in CQLRR.close (CASSANDRA-7228)
- * Fix potential SlabAllocator yield-starvation (CASSANDRA-7133)
- * Warn when 'USING TIMESTAMP' is used on a CAS BATCH (CASSANDRA-7067)
- * Starting threads in OutboundTcpConnectionPool constructor causes race
conditions (CASSANDRA-7177)
- * return all cpu values from BackgroundActivityMonitor.readAndCompute
(CASSANDRA-7183)
- * fix c* launch issues on Russian os's due to output of linux 'free' cmd
(CASSANDRA-6162)
- * Fix disabling autocompaction (CASSANDRA-7187)
- * Fix potential NumberFormatException when deserializing IntegerType
(CASSANDRA-7088)
- * cqlsh can't tab-complete disabling compaction (CASSANDRA-7185)
- * cqlsh: Accept and execute CQL statement(s) from command-line parameter
(CASSANDRA-7172)
- * Fix IllegalStateException in CqlPagingRecordReader (CASSANDRA-7198)
- * Fix the InvertedIndex trigger example (CASSANDRA-7211)
- * Add --resolve-ip option to 'nodetool ring' (CASSANDRA-7210)
- * Fix duplicated error messages on directory creation error at startup
(CASSANDRA-5818)
- * reduce garbage on codec flag deserialization (CASSANDRA-7244)
- * Proper null handle for IF with map element access (CASSANDRA-7155)
- * Improve compaction visibility (CASSANDRA-7242)
+ * Fix 2ndary index queries with DESC clustering order (CASSANDRA-6950)
Merged from 1.2:
* Add Cloudstack snitch (CASSANDRA-7147)
* Update system.peers correctly when relocating tokens (CASSANDRA-7126)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/94f25ce1/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
index 55ce6f9,6b4309f..ca990a4
--- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
@@@ -927,8 -922,19 +927,14 @@@ public class SelectStatement implement
{
if (slice.hasBound(b))
{
- ByteBuffer value = slice.bound(b, variables);
- if (value == null)
- throw new
InvalidRequestException(String.format("Unsupported null value for indexed
column %s", name));
- if (value.remaining() > 0xFFFF)
- throw new InvalidRequestException("Index
expression values may not be larger than 64K");
-
+ ByteBuffer value = validateIndexedValue(def,
slice.bound(b, options));
- expressions.add(new IndexExpression(def.name.bytes,
slice.getIndexOperator(b), value));
+ IndexOperator op = slice.getIndexOperator(b);
+ // If the underlying comparator for name is reversed,
we need to reverse the IndexOperator: user operation
+ // always refer to the "forward" sorting even if the
clustering order is reversed, but the 2ndary code does
+ // use the underlying comparator as is.
+ if (name.type instanceof ReversedType)
+ op = reverse(op);
- expressions.add(new IndexExpression(name.name.key,
op, value));
++ expressions.add(new IndexExpression(def.name.bytes,
op, value));
}
}
}
@@@ -960,45 -956,19 +966,57 @@@
return expressions;
}
+ private static ByteBuffer validateIndexedValue(ColumnDefinition def,
ByteBuffer value) throws InvalidRequestException
+ {
+ 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 QueryOptions options) throws InvalidRequestException
+ {
+ assert sliceRestriction != null;
+
+ final CellNameType type = cfm.comparator;
+ final CellName excludedStart =
sliceRestriction.isInclusive(Bound.START) ? null :
type.makeCellName(sliceRestriction.bound(Bound.START, options));
+ final CellName excludedEnd = sliceRestriction.isInclusive(Bound.END)
? null : type.makeCellName(sliceRestriction.bound(Bound.END, options));
+
+ return new AbstractIterator<Cell>()
+ {
+ protected Cell computeNext()
+ {
+ while (cells.hasNext())
+ {
+ 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) )
+ continue;
+
+ return c;
+ }
+ return endOfData();
+ }
+ };
+ }
+
+ private static IndexOperator reverse(IndexOperator op)
+ {
+ switch (op)
+ {
+ case LT: return IndexOperator.GT;
+ case LTE: return IndexOperator.GTE;
+ case GT: return IndexOperator.LT;
+ case GTE: return IndexOperator.LTE;
+ default: return op;
+ }
+ }
+
- private ResultSet process(List<Row> rows, List<ByteBuffer> variables, int
limit, long now) throws InvalidRequestException
+ private ResultSet process(List<Row> rows, QueryOptions options, int
limit, long now) throws InvalidRequestException
{
Selection.ResultSetBuilder result = selection.resultSetBuilder(now);
for (org.apache.cassandra.db.Row row : rows)