reset getRangeSlice filter after finishing a row forget_paged_slice
patch by Piotr Kołaczkowski; reviewed by jbellis for CASSANDRA-4919


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/a2ca30e7
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/a2ca30e7
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/a2ca30e7

Branch: refs/heads/cassandra-1.1
Commit: a2ca30e79510a04ca1f6b9c5a342ee9467176a9f
Parents: a05f676
Author: Jonathan Ellis <jbel...@apache.org>
Authored: Mon Nov 12 15:57:15 2012 -0600
Committer: Jonathan Ellis <jbel...@apache.org>
Committed: Mon Nov 12 15:57:15 2012 -0600

----------------------------------------------------------------------
 CHANGES.txt                                        |    2 +
 .../org/apache/cassandra/service/StorageProxy.java |   17 ++++++++++++++-
 2 files changed, 18 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/a2ca30e7/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 088daa7..b80c60f 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,6 @@
 1.1.7
+ * reset getRangeSlice filter after finishing a row for get_paged_slice
+   (CASSANDRA-4919)
  * expunge row cache post-truncate (CASSANDRA-4940)
  * remove IAuthority2 (CASSANDRA-4875)
  * add get[Row|Key]CacheEntries to CacheServiceMBean (CASSANDRA-4859)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a2ca30e7/src/java/org/apache/cassandra/service/StorageProxy.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java 
b/src/java/org/apache/cassandra/service/StorageProxy.java
index 14466ee..453e2b2 100644
--- a/src/java/org/apache/cassandra/service/StorageProxy.java
+++ b/src/java/org/apache/cassandra/service/StorageProxy.java
@@ -845,6 +845,9 @@ public class StorageProxy implements StorageProxyMBean
         // now scan until we have enough results
         try
         {
+            final SlicePredicate emptyPredicate = getEmptySlicePredicate();
+            SlicePredicate commandPredicate = command.predicate;
+
             int columnsCount = 0;
             rows = new ArrayList<Row>();
             List<AbstractBounds<RowPosition>> ranges = 
getRestrictedRanges(command.range);
@@ -853,7 +856,7 @@ public class StorageProxy implements StorageProxyMBean
                 RangeSliceCommand nodeCmd = new 
RangeSliceCommand(command.keyspace,
                                                                   
command.column_family,
                                                                   
command.super_column,
-                                                                  
command.predicate,
+                                                                  
commandPredicate,
                                                                   range,
                                                                   
command.row_filter,
                                                                   
command.maxResults,
@@ -923,6 +926,11 @@ public class StorageProxy implements StorageProxyMBean
                 int count = nodeCmd.maxIsColumns ? columnsCount : rows.size();
                 if (count >= nodeCmd.maxResults)
                     break;
+
+                // if we are paging and already got some rows, reset the 
column filter predicate,
+                // so we start iterating the next row from the first column
+                if (!rows.isEmpty() && command.isPaging)
+                    commandPredicate = emptyPredicate;
             }
         }
         finally
@@ -932,6 +940,13 @@ public class StorageProxy implements StorageProxyMBean
         return trim(command, rows);
     }
 
+    private static SlicePredicate getEmptySlicePredicate()
+    {
+        final SliceRange emptySliceRange =
+                new SliceRange(ByteBufferUtil.EMPTY_BYTE_BUFFER, 
ByteBufferUtil.EMPTY_BYTE_BUFFER, false, -1);
+        return new SlicePredicate().setSlice_range(emptySliceRange);
+    }
+
     private static List<Row> trim(RangeSliceCommand command, List<Row> rows)
     {
         // When maxIsColumns, we let the caller trim the result.

Reply via email to