You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2009/08/11 04:09:41 UTC
svn commit: r802978 - in /incubator/cassandra/trunk:
src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
src/java/org/apache/cassandra/db/marshal/AbstractType.java
test/system/test_server.py
Author: jbellis
Date: Tue Aug 11 02:09:40 2009
New Revision: 802978
URL: http://svn.apache.org/viewvc?rev=802978&view=rev
Log:
respect "start" filter argument for subcolumns.
patch by jbellis; reviewed by Even Weaver for CASSANDRA-357
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/marshal/AbstractType.java
incubator/cassandra/trunk/test/system/test_server.py
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java?rev=802978&r1=802977&r2=802978&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java Tue Aug 11 02:09:40 2009
@@ -8,6 +8,7 @@
import org.apache.commons.collections.comparators.ReverseComparator;
import org.apache.commons.collections.iterators.ReverseListIterator;
+import org.apache.commons.collections.IteratorUtils;
import org.apache.cassandra.io.SSTableReader;
import org.apache.cassandra.db.*;
@@ -51,6 +52,19 @@
{
subcolumns = superColumn.getSubColumns().iterator();
}
+
+ // iterate until we get to the "real" start column
+ Comparator<byte[]> comparator = reversed ? superColumn.getComparator().getReverseComparator() : superColumn.getComparator();
+ while (subcolumns.hasNext())
+ {
+ IColumn column = subcolumns.next();
+ if (comparator.compare(column.name(), start) >= 0)
+ {
+ subcolumns = IteratorUtils.chainedIterator(IteratorUtils.singletonIterator(column), subcolumns);
+ break;
+ }
+ }
+ // subcolumns is either empty now, or has been redefined in the loop above. either is ok.
collectReducedColumns(scFiltered, subcolumns, gcBefore);
return scFiltered;
}
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/marshal/AbstractType.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/marshal/AbstractType.java?rev=802978&r1=802977&r2=802978&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/marshal/AbstractType.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/marshal/AbstractType.java Tue Aug 11 02:09:40 2009
@@ -24,6 +24,26 @@
getString(bytes);
}
+ public Comparator<byte[]> getReverseComparator()
+ {
+ return new Comparator<byte[]>()
+ {
+ public int compare(byte[] o1, byte[] o2)
+ {
+ if (o1.length == 0)
+ {
+ return o2.length == 0 ? 0 : -1;
+ }
+ if (o2.length == 0)
+ {
+ return 1;
+ }
+
+ return -AbstractType.this.compare(o1, o2);
+ }
+ };
+ }
+
/** convenience method */
public String getString(Collection<byte[]> names)
{
Modified: incubator/cassandra/trunk/test/system/test_server.py
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/system/test_server.py?rev=802978&r1=802977&r2=802978&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/system/test_server.py (original)
+++ incubator/cassandra/trunk/test/system/test_server.py Tue Aug 11 02:09:40 2009
@@ -187,17 +187,39 @@
L.append(uuid.uuid1())
client.insert('Keyspace2', 'key1', ColumnPath('Super4', 'sc1', L[-1].bytes), 'value%s' % i, i, ConsistencyLevel.ONE)
slice = _big_slice('Keyspace2', 'key1', ColumnParent('Super4', 'sc1'))
- assert len(slice) == 500
+ assert len(slice) == 500, len(slice)
for i in xrange(500):
u = slice[i].column
assert u.value == 'value%s' % i
assert u.name == L[i].bytes
- p = SlicePredicate(slice_range=SliceRange('', '', False, 1))
+ p = SlicePredicate(slice_range=SliceRange('', '', True, 1))
column_parent = ColumnParent('Super4', 'sc1')
slice = [result.column
for result in client.get_slice('Keyspace2', 'key1', column_parent, p, ConsistencyLevel.ONE)]
assert slice == [Column(L[-1].bytes, 'value499', 499)], slice
+
+ p = SlicePredicate(slice_range=SliceRange('', L[2].bytes, False, 1000))
+ column_parent = ColumnParent('Super4', 'sc1')
+ slice = [result.column
+ for result in client.get_slice('Keyspace2', 'key1', column_parent, p, ConsistencyLevel.ONE)]
+ assert slice == [Column(L[0].bytes, 'value0', 0),
+ Column(L[1].bytes, 'value1', 1),
+ Column(L[2].bytes, 'value2', 2)], slice
+
+ p = SlicePredicate(slice_range=SliceRange(L[2].bytes, '', True, 1000))
+ column_parent = ColumnParent('Super4', 'sc1')
+ slice = [result.column
+ for result in client.get_slice('Keyspace2', 'key1', column_parent, p, ConsistencyLevel.ONE)]
+ assert slice == [Column(L[2].bytes, 'value2', 2),
+ Column(L[1].bytes, 'value1', 1),
+ Column(L[0].bytes, 'value0', 0)], slice
+
+ p = SlicePredicate(slice_range=SliceRange(L[2].bytes, '', False, 1))
+ column_parent = ColumnParent('Super4', 'sc1')
+ slice = [result.column
+ for result in client.get_slice('Keyspace2', 'key1', column_parent, p, ConsistencyLevel.ONE)]
+ assert slice == [Column(L[2].bytes, 'value2', 2)], slice
def test_batch_insert(self):
_insert_batch(False)