You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sl...@apache.org on 2012/10/22 09:20:16 UTC

git commit: Fix Subcolumn slice ends not respected

Updated Branches:
  refs/heads/trunk 81209f1c8 -> f02928f88


Fix Subcolumn slice ends not respected

patch by vijay; reviewed by thobbs & slebresne for CASSANDRA-4826


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

Branch: refs/heads/trunk
Commit: f02928f887ce58e317b87341a837c61068510bae
Parents: 81209f1
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Mon Oct 22 09:19:06 2012 +0200
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Mon Oct 22 09:19:06 2012 +0200

----------------------------------------------------------------------
 CHANGES.txt                                        |    1 +
 .../cassandra/db/filter/SliceQueryFilter.java      |   30 +++++++++-----
 2 files changed, 20 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/f02928f8/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 9fbccb0..e14ffa7 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -31,6 +31,7 @@
  * Fix potential NPE during CFS reload (CASSANDRA-4786)
  * Composite indexes may miss results (CASSANDRA-4796)
  * Move consistency level to the protocol level (CASSANDRA-4734, 4824)
+ * Fix Subcolumn slice ends not respected (CASSANDRA-4826)
 Merged from 1.1:
  * fix indexing empty column values (CASSANDRA-4832)
  * allow JdbcDate to compose null Date objects (CASSANDRA-4830)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f02928f8/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java b/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
index 2de284a..af63fa0 100644
--- a/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
+++ b/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
@@ -25,6 +25,7 @@ import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 
+import com.google.common.collect.AbstractIterator;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
 import org.slf4j.Logger;
@@ -104,7 +105,7 @@ public class SliceQueryFilter implements IFilter
         // we clone shallow, then add, under the theory that generally we're interested in a relatively small number of subcolumns.
         // this may be a poor assumption.
         SuperColumn scFiltered = superColumn.cloneMeShallow();
-        Iterator<IColumn> subcolumns;
+        final Iterator<IColumn> subcolumns;
         if (reversed)
         {
             List<IColumn> columnsAsList = new ArrayList<IColumn>(superColumn.getSubColumns());
@@ -114,20 +115,27 @@ public class SliceQueryFilter implements IFilter
         {
             subcolumns = superColumn.getSubColumns().iterator();
         }
-
-        // iterate until we get to the "real" start column
-        Comparator<ByteBuffer> comparator = reversed ? superColumn.getComparator().reverseComparator : superColumn.getComparator();
-        while (subcolumns.hasNext())
+        final Comparator<ByteBuffer> comparator = reversed ? superColumn.getComparator().reverseComparator : superColumn.getComparator();
+        Iterator<IColumn> results = new AbstractIterator<IColumn>()
         {
-            IColumn column = subcolumns.next();
-            if (comparator.compare(column.name(), start()) >= 0)
+            protected IColumn computeNext()
             {
-                subcolumns = Iterators.concat(Iterators.singletonIterator(column), subcolumns);
-                break;
+                while (subcolumns.hasNext())
+                {
+                    IColumn subcolumn = subcolumns.next();
+                    // iterate until we get to the "real" start column
+                    if (comparator.compare(subcolumn.name(), start()) < 0)
+                        continue;
+                    // exit loop when columns are out of the range.
+                    if (finish().remaining() > 0 && comparator.compare(subcolumn.name(), finish()) > 0)
+                        break;
+                    return subcolumn;
+                }
+                return endOfData();
             }
-        }
+        };
         // subcolumns is either empty now, or has been redefined in the loop above. either is ok.
-        collectReducedColumns(scFiltered, subcolumns, gcBefore);
+        collectReducedColumns(scFiltered, results, gcBefore);
         return scFiltered;
     }