Fix cql3 reader when columns is reversed. Patch by Alex Liu, reviewed by pkolackzk for CASSANDRA-7100
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/1b9f712e Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/1b9f712e Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/1b9f712e Branch: refs/heads/trunk Commit: 1b9f712eb8852068f4e324b9819a957ac7ad4f0e Parents: 76139e4 Author: Brandon Williams <brandonwilli...@apache.org> Authored: Tue May 20 10:55:33 2014 -0500 Committer: Brandon Williams <brandonwilli...@apache.org> Committed: Tue May 20 10:55:33 2014 -0500 ---------------------------------------------------------------------- .../hadoop/cql3/CqlPagingRecordReader.java | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/1b9f712e/src/java/org/apache/cassandra/hadoop/cql3/CqlPagingRecordReader.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlPagingRecordReader.java b/src/java/org/apache/cassandra/hadoop/cql3/CqlPagingRecordReader.java index 1492ce0..03d9ae9 100644 --- a/src/java/org/apache/cassandra/hadoop/cql3/CqlPagingRecordReader.java +++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlPagingRecordReader.java @@ -27,13 +27,14 @@ import java.util.*; import com.google.common.base.Optional; import com.google.common.collect.AbstractIterator; import com.google.common.collect.Iterables; + import org.apache.cassandra.hadoop.HadoopCompat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.CompositeType; import org.apache.cassandra.db.marshal.LongType; +import org.apache.cassandra.db.marshal.ReversedType; import org.apache.cassandra.db.marshal.TypeParser; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.exceptions.ConfigurationException; @@ -507,7 +508,7 @@ public class CqlPagingRecordReader extends RecordReader<Map<String, ByteBuffer>, private Pair<Integer, String> whereClause(List<BoundColumn> column, int position) { if (position == column.size() - 1 || column.get(position + 1).value == null) - return Pair.create(position + 2, String.format(" AND %s > ? ", quote(column.get(position).name))); + return Pair.create(position + 2, String.format(" AND %s %s ? ", quote(column.get(position).name), column.get(position).reversed ? " < " : " >")); Pair<Integer, String> clause = whereClause(column, position + 1); return Pair.create(clause.left, String.format(" AND %s = ? %s", quote(column.get(position).name), clause.right)); @@ -711,6 +712,20 @@ public class CqlPagingRecordReader extends RecordReader<Map<String, ByteBuffer>, { partitionBoundColumns.get(0).validator = keyValidator; } + + Column rawComparator = cqlRow.columns.get(3); + String comparator = ByteBufferUtil.string(ByteBuffer.wrap(rawComparator.getValue())); + logger.debug("comparator: {}", comparator); + AbstractType comparatorValidator = parseType(comparator); + if (comparatorValidator instanceof CompositeType) + { + for (int i = 0; i < clusterColumns.size(); i++) + clusterColumns.get(i).reversed = (((CompositeType) comparatorValidator).types.get(i) instanceof ReversedType); + } + else if (comparatorValidator instanceof ReversedType) + { + clusterColumns.get(0).reversed = true; + } } /** check whether current row is at the end of range */ @@ -762,6 +777,7 @@ public class CqlPagingRecordReader extends RecordReader<Map<String, ByteBuffer>, final String name; ByteBuffer value; AbstractType<?> validator; + boolean reversed = false; public BoundColumn(String name) {