Author: jbellis
Date: Fri Jul 31 15:06:35 2009
New Revision: 799632

URL: http://svn.apache.org/viewvc?rev=799632&view=rev
Log:
allow start of [] to mean "start with the largest value" when ascending=false.  
patch by Jun Rao; reviewed by jbellis for CASSANDRA-263

Modified:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java
    
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java
    
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SequenceFile.java
    incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/TableTest.java

Modified: 
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java?rev=799632&r1=799631&r2=799632&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java 
(original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java 
Fri Jul 31 15:06:35 2009
@@ -278,7 +278,16 @@
         // can't use a ColumnComparatorFactory comparator since those compare 
on both name and time (and thus will fail to match
         // our dummy column, since the time there is arbitrary).
         Comparator<IColumn> comparator = 
filter.getColumnComparator(typeComparator);
-        int index = Arrays.binarySearch(columns, startIColumn, comparator);
+        int index;
+        if (filter.start.length == 0 && !filter.isAscending)
+        {
+            /* assuming the we scan from the largest column in descending 
order*/
+            index = 0;
+        }
+        else
+        {
+            index = Arrays.binarySearch(columns, startIColumn, comparator);
+        }
         final int startIndex = index < 0 ? -(index + 1) : index;
 
         return new AbstractColumnIterator()

Modified: 
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java?rev=799632&r1=799631&r2=799632&view=diff
==============================================================================
--- 
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java
 (original)
+++ 
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java
 Fri Jul 31 15:06:35 2009
@@ -41,9 +41,21 @@
     private boolean isColumnNeeded(IColumn column)
     {
         if (isAscending)
+        {
             return comparator.compare(column.name(), startColumn) >= 0;
+        }
         else
-            return comparator.compare(column.name(), startColumn) <= 0;
+        {
+            if (startColumn.length == 0)
+            {
+                /* assuming scanning from the largest column in descending 
order */
+                return true;
+            }
+            else
+            {
+                return comparator.compare(column.name(), startColumn) <= 0;
+            }
+        }
     }
 
     private void getColumnsFromBuffer() throws IOException

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=799632&r1=799631&r2=799632&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
 Fri Jul 31 15:06:35 2009
@@ -42,8 +42,12 @@
 
         for (IColumn column : superColumn.getSubColumns())
         {
-            if ((start.length > 0 && 
superColumn.getComparator().compare(column.name(), start) < 0)
-                || (finish.length > 0 && 
superColumn.getComparator().compare(column.name(), finish) > 0)
+            final boolean outOfRange = isAscending
+                                     ? (start.length > 0 && 
superColumn.getComparator().compare(column.name(), start) < 0)
+                                        || (finish.length > 0 && 
superColumn.getComparator().compare(column.name(), finish) > 0)
+                                     : (start.length > 0 && 
superColumn.getComparator().compare(column.name(), start) > 0)
+                                        || (finish.length > 0 && 
superColumn.getComparator().compare(column.name(), finish) < 0);
+            if (outOfRange
                 || (column.isMarkedForDelete() && 
column.getLocalDeletionTime() <= gcBefore)
                 || liveColumns > count)
             {

Modified: 
incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SequenceFile.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SequenceFile.java?rev=799632&r1=799631&r2=799632&view=diff
==============================================================================
--- 
incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SequenceFile.java 
(original)
+++ 
incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SequenceFile.java 
Fri Jul 31 15:06:35 2009
@@ -141,8 +141,16 @@
                 columnStartPosition_ = file_.getFilePointer();
                 columnIndexList_ = getFullColumnIndexList(colIndexList, 
totalNumCols);
 
-                int index = Collections.binarySearch(columnIndexList_, new 
IndexHelper.ColumnIndexInfo(startColumn, 0, 0, comparator_));
-                curRangeIndex_ = index < 0 ? (++index) * (-1) - 1 : index;
+                if (startColumn.length == 0 && !isAscending_)
+                {
+                    /* in this case, we assume that we want to scan from the 
largest column in descending order. */
+                    curRangeIndex_ = columnIndexList_.size() - 1;
+                }
+                else
+                {
+                    int index = Collections.binarySearch(columnIndexList_, new 
IndexHelper.ColumnIndexInfo(startColumn, 0, 0, comparator_));
+                    curRangeIndex_ = index < 0 ? (++index) * (-1) - 1 : index;
+                }
             }
             else
             {

Modified: 
incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/TableTest.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/TableTest.java?rev=799632&r1=799631&r2=799632&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/TableTest.java 
(original)
+++ incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/TableTest.java 
Fri Jul 31 15:06:35 2009
@@ -210,6 +210,9 @@
                 cf = cfStore.getColumnFamily(ROW, new QueryPath("Standard1"), 
"col6".getBytes(), ArrayUtils.EMPTY_BYTE_ARRAY, false, 2);
                 assertColumns(cf, "col3", "col4", "col5");
 
+                cf = cfStore.getColumnFamily(ROW, new QueryPath("Standard1"), 
ArrayUtils.EMPTY_BYTE_ARRAY, ArrayUtils.EMPTY_BYTE_ARRAY, false, 2);
+                assertColumns(cf, "col7", "col9");
+
                 cf = cfStore.getColumnFamily(ROW, new QueryPath("Standard1"), 
"col95".getBytes(), ArrayUtils.EMPTY_BYTE_ARRAY, true, 2);
                 assertColumns(cf);
 
@@ -309,6 +312,12 @@
         assertEquals(new String(cf.getColumn("col1990".getBytes()).value()), 
"vvvvvvvvvvvvvvvv1990");
         assertEquals(new String(cf.getColumn("col1991".getBytes()).value()), 
"vvvvvvvvvvvvvvvv1991");
         assertEquals(new String(cf.getColumn("col1992".getBytes()).value()), 
"vvvvvvvvvvvvvvvv1992");
+
+        cf = cfStore.getColumnFamily(ROW, new QueryPath("Standard1"), 
ArrayUtils.EMPTY_BYTE_ARRAY, ArrayUtils.EMPTY_BYTE_ARRAY, false, 3);
+        assertColumns(cf, "col1997", "col1998", "col1999");
+        assertEquals(new String(cf.getColumn("col1999".getBytes()).value()), 
"vvvvvvvvvvvvvvvv1999");
+        assertEquals(new String(cf.getColumn("col1998".getBytes()).value()), 
"vvvvvvvvvvvvvvvv1998");
+        assertEquals(new String(cf.getColumn("col1997".getBytes()).value()), 
"vvvvvvvvvvvvvvvv1997");
     }
 
     @Test


Reply via email to