Author: slebresne
Date: Thu Dec  8 17:31:07 2011
New Revision: 1211999

URL: http://svn.apache.org/viewvc?rev=1211999&view=rev
Log:
Improve memtable slice iteration performance
patch by slebresne; reviewed by jbellis for CASSANDRA-3545

Modified:
    cassandra/trunk/CHANGES.txt
    
cassandra/trunk/src/java/org/apache/cassandra/db/AbstractColumnContainer.java
    
cassandra/trunk/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
    cassandra/trunk/src/java/org/apache/cassandra/db/CollationController.java
    cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
    cassandra/trunk/src/java/org/apache/cassandra/db/ISortedColumns.java
    cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java
    cassandra/trunk/src/java/org/apache/cassandra/db/RowIteratorFactory.java
    
cassandra/trunk/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java
    
cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
    cassandra/trunk/src/java/org/apache/cassandra/db/filter/IFilter.java
    
cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java
    cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java
    
cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
    
cassandra/trunk/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
    cassandra/trunk/src/java/org/apache/cassandra/service/RowRepairResolver.java
    
cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java

Modified: cassandra/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Thu Dec  8 17:31:07 2011
@@ -21,6 +21,7 @@
  * fix potential race in AES when a repair fails (CASSANDRA-3548)
  * Remove columns shadowed by a deleted container even when we cannot purge
    (CASSANDRA-3538)
+ * Improve memtable slice iteration performance (CASSANDRA-3545)
 
 
 1.0.6

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/AbstractColumnContainer.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/AbstractColumnContainer.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/db/AbstractColumnContainer.java 
(original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/db/AbstractColumnContainer.java 
Thu Dec  8 17:31:07 2011
@@ -234,6 +234,21 @@ public abstract class AbstractColumnCont
         return columns.iterator();
     }
 
+    public Iterator<IColumn> reverseIterator()
+    {
+        return columns.reverseIterator();
+    }
+
+    public Iterator<IColumn> iterator(ByteBuffer start)
+    {
+        return columns.iterator(start);
+    }
+
+    public Iterator<IColumn> reverseIterator(ByteBuffer start)
+    {
+        return columns.reverseIterator(start);
+    }
+
     protected static class DeletionInfo
     {
         public final long markedForDeleteAt;

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java 
(original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java 
Thu Dec  8 17:31:07 2011
@@ -289,17 +289,39 @@ public class ArrayBackedSortedColumns ex
     @Override
     public Iterator<IColumn> iterator()
     {
-        return reversed ? reverseInternalIterator() : super.iterator();
+        return reversed ? reverseInternalIterator(size()) : super.iterator();
     }
 
     public Iterator<IColumn> reverseIterator()
     {
-        return reversed ? super.iterator() : reverseInternalIterator();
+        return reversed ? super.iterator() : reverseInternalIterator(size());
     }
 
-    private Iterator<IColumn> reverseInternalIterator()
+    public Iterator<IColumn> iterator(ByteBuffer start)
     {
-        final ListIterator<IColumn> iter = listIterator(size());
+        int idx = binarySearch(start);
+        if (idx < 0)
+            idx = -idx - 1;
+        else if (reversed)
+            // listIterator.previous() doesn't return the current element at 
first but the previous one
+            idx++;
+        return reversed ? reverseInternalIterator(idx) : listIterator(idx);
+    }
+
+    public Iterator<IColumn> reverseIterator(ByteBuffer start)
+    {
+        int idx = binarySearch(start);
+        if (idx < 0)
+            idx = -idx - 1;
+        else if (!reversed)
+            // listIterator.previous() doesn't return the current element at 
first but the previous one
+            idx++;
+        return reversed ? listIterator(idx) : reverseInternalIterator(idx);
+    }
+
+    private Iterator<IColumn> reverseInternalIterator(int idx)
+    {
+        final ListIterator<IColumn> iter = listIterator(idx);
         return new Iterator<IColumn>()
         {
             public boolean hasNext()

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/CollationController.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/CollationController.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/CollationController.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/CollationController.java 
Thu Dec  8 17:31:07 2011
@@ -85,7 +85,7 @@ public class CollationController
         {
             for (Memtable memtable : view.memtables)
             {
-                IColumnIterator iter = 
filter.getMemtableColumnIterator(memtable, cfs.metadata.comparator);
+                IColumnIterator iter = 
filter.getMemtableColumnIterator(memtable);
                 if (iter != null)
                 {
                     iterators.add(iter);
@@ -149,7 +149,7 @@ public class CollationController
                 }
             };
             ColumnFamily returnCF = container.cloneMeShallow();
-            filter.collateColumns(returnCF, 
Collections.singletonList(toCollate), cfs.metadata.comparator, gcBefore);
+            filter.collateColumns(returnCF, 
Collections.singletonList(toCollate), gcBefore);
             
             // "hoist up" the requested data into a more recent sstable
             if (sstablesIterated > cfs.getMinimumCompactionThreshold()
@@ -219,7 +219,7 @@ public class CollationController
         {
             for (Memtable memtable : view.memtables)
             {
-                IColumnIterator iter = 
filter.getMemtableColumnIterator(memtable, cfs.metadata.comparator);
+                IColumnIterator iter = 
filter.getMemtableColumnIterator(memtable);
                 if (iter != null)
                 {
                     returnCF.delete(iter.getColumnFamily());
@@ -243,7 +243,7 @@ public class CollationController
             if (iterators.isEmpty())
                 return null;
 
-            filter.collateColumns(returnCF, iterators, 
cfs.metadata.comparator, gcBefore);
+            filter.collateColumns(returnCF, iterators, gcBefore);
 
             // Caller is responsible for final removeDeletedCF.  This is 
important for cacheRow to work correctly:
             return returnCF;

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Thu 
Dec  8 17:31:07 2011
@@ -1183,8 +1183,8 @@ public class ColumnFamilyStore implement
     ColumnFamily filterColumnFamily(ColumnFamily cached, QueryFilter filter, 
int gcBefore)
     {
         ColumnFamily cf = 
cached.cloneMeShallow(ArrayBackedSortedColumns.factory(), 
filter.filter.isReversed());
-        IColumnIterator ci = filter.getMemtableColumnIterator(cached, null, 
getComparator());
-        filter.collateColumns(cf, Collections.singletonList(ci), 
getComparator(), gcBefore);
+        IColumnIterator ci = filter.getMemtableColumnIterator(cached, null);
+        filter.collateColumns(cf, Collections.singletonList(ci), gcBefore);
         // TODO this is necessary because when we collate supercolumns 
together, we don't check
         // their subcolumns for relevance, so we need to do a second prune 
post facto here.
         return cf.isSuper() ? removeDeleted(cf, gcBefore) : 
removeDeletedCF(cf, gcBefore);
@@ -1299,7 +1299,7 @@ public class ColumnFamilyStore implement
         ViewFragment view = markReferenced(startWith, stopAt);
         try
         {
-            CloseableIterator<Row> iterator = 
RowIteratorFactory.getIterator(view.memtables, view.sstables, startWith, 
stopAt, filter, getComparator(), this);
+            CloseableIterator<Row> iterator = 
RowIteratorFactory.getIterator(view.memtables, view.sstables, startWith, 
stopAt, filter, this);
             rows = new ArrayList<Row>();
 
             try

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ISortedColumns.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ISortedColumns.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ISortedColumns.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ISortedColumns.java Thu 
Dec  8 17:31:07 2011
@@ -125,6 +125,18 @@ public interface ISortedColumns extends 
     public Iterator<IColumn> reverseIterator();
 
     /**
+     * Returns an iterator over the columns of this map starting from the
+     * first column whose name is equal or greater than @param start.
+     */
+    public Iterator<IColumn> iterator(ByteBuffer start);
+
+    /**
+     * Returns a reversed iterator over the columns of this map starting from
+     * the last column whose name is equal or lesser than @param start.
+     */
+    public Iterator<IColumn> reverseIterator(ByteBuffer start);
+
+    /**
      * Returns if this map only support inserts in reverse order.
      */
     public boolean isInsertReversed();

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java Thu Dec  8 
17:31:07 2011
@@ -343,24 +343,12 @@ public class Memtable
     /**
      * obtain an iterator of columns in this memtable in the specified order 
starting from a given column.
      */
-    public static IColumnIterator getSliceIterator(final DecoratedKey key, 
final ColumnFamily cf, SliceQueryFilter filter, AbstractType typeComparator)
+    public static IColumnIterator getSliceIterator(final DecoratedKey key, 
final ColumnFamily cf, SliceQueryFilter filter)
     {
         assert cf != null;
-        final boolean isSuper = cf.isSuper();
-        final Collection<IColumn> filteredColumns = filter.reversed ? 
cf.getReverseSortedColumns() : cf.getSortedColumns();
-
-        // ok to not have subcolumnComparator since we won't be adding columns 
to this object
-        IColumn startColumn = isSuper ? new SuperColumn(filter.start, 
(AbstractType)null) :  new Column(filter.start);
-        Comparator<IColumn> comparator = 
filter.getColumnComparator(typeComparator);
-
-        final PeekingIterator<IColumn> filteredIter = 
Iterators.peekingIterator(filteredColumns.iterator());
-        if (!filter.reversed || filter.start.remaining() != 0)
-        {
-            while (filteredIter.hasNext() && 
comparator.compare(filteredIter.peek(), startColumn) < 0)
-            {
-                filteredIter.next();
-            }
-        }
+        final Iterator<IColumn> filteredIter = filter.reversed
+                                             ? (filter.start.remaining() == 0 
? cf.reverseIterator() : cf.reverseIterator(filter.start))
+                                             : cf.iterator(filter.start);
 
         return new AbstractColumnIterator()
         {
@@ -381,7 +369,7 @@ public class Memtable
 
             public IColumn next()
             {
-                return filteredIter.next();                
+                return filteredIter.next();
             }
         };
     }

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/RowIteratorFactory.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/RowIteratorFactory.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/RowIteratorFactory.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/RowIteratorFactory.java 
Thu Dec  8 17:31:07 2011
@@ -61,7 +61,6 @@ public class RowIteratorFactory
                                           final RowPosition startWith,
                                           final RowPosition stopAt,
                                           final QueryFilter filter,
-                                          final AbstractType comparator,
                                           final ColumnFamilyStore cfs)
     {
         // fetch data from current memtable, historical memtables, and 
SSTables in the correct order.
@@ -80,7 +79,7 @@ public class RowIteratorFactory
         // memtables
         for (Memtable memtable : memtables)
         {
-            iterators.add(new ConvertToColumnIterator(filter, comparator, p, 
memtable.getEntryIterator(startWith)));
+            iterators.add(new ConvertToColumnIterator(filter, p, 
memtable.getEntryIterator(startWith)));
         }
 
         for (SSTableReader sstable : sstables)
@@ -120,7 +119,7 @@ public class RowIteratorFactory
                 ColumnFamily cached = cfs.getRawCachedRow(key);
                 if (cached == null)
                     // not cached: collate
-                    filter.collateColumns(returnCF, colIters, comparator, 
gcBefore);
+                    filter.collateColumns(returnCF, colIters, gcBefore);
                 else
                 {
                     QueryFilter keyFilter = new QueryFilter(key, filter.path, 
filter.filter);
@@ -141,14 +140,12 @@ public class RowIteratorFactory
     private static class ConvertToColumnIterator extends 
AbstractIterator<IColumnIterator> implements CloseableIterator<IColumnIterator>
     {
         private final QueryFilter filter;
-        private final AbstractType comparator;
         private final Predicate<IColumnIterator> pred;
         private final Iterator<Map.Entry<DecoratedKey, ColumnFamily>> iter;
 
-        public ConvertToColumnIterator(QueryFilter filter, AbstractType 
comparator, Predicate<IColumnIterator> pred, Iterator<Map.Entry<DecoratedKey, 
ColumnFamily>> iter)
+        public ConvertToColumnIterator(QueryFilter filter, 
Predicate<IColumnIterator> pred, Iterator<Map.Entry<DecoratedKey, 
ColumnFamily>> iter)
         {
             this.filter = filter;
-            this.comparator = comparator;
             this.pred = pred;
             this.iter = iter;
         }
@@ -158,7 +155,7 @@ public class RowIteratorFactory
             while (iter.hasNext())
             {
                 Map.Entry<DecoratedKey, ColumnFamily> entry = iter.next();
-                IColumnIterator ici = 
filter.getMemtableColumnIterator(entry.getValue(), entry.getKey(), comparator);
+                IColumnIterator ici = 
filter.getMemtableColumnIterator(entry.getValue(), entry.getKey());
                 if (pred.apply(ici))
                     return ici;
             }

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java 
(original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java 
Thu Dec  8 17:31:07 2011
@@ -162,4 +162,14 @@ public class ThreadSafeSortedColumns ext
     {
         return getReverseSortedColumns().iterator();
     }
+
+    public Iterator<IColumn> iterator(ByteBuffer start)
+    {
+        return tailMap(start).values().iterator();
+    }
+
+    public Iterator<IColumn> reverseIterator(ByteBuffer start)
+    {
+        return descendingMap().tailMap(start).values().iterator();
+    }
 }

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
 (original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
 Thu Dec  8 17:31:07 2011
@@ -180,4 +180,14 @@ public class TreeMapBackedSortedColumns 
     {
         return getReverseSortedColumns().iterator();
     }
+
+    public Iterator<IColumn> iterator(ByteBuffer start)
+    {
+        return tailMap(start).values().iterator();
+    }
+
+    public Iterator<IColumn> reverseIterator(ByteBuffer start)
+    {
+        return descendingMap().tailMap(start).values().iterator();
+    }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/filter/IFilter.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/filter/IFilter.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/filter/IFilter.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/filter/IFilter.java Thu 
Dec  8 17:31:07 2011
@@ -42,7 +42,7 @@ public interface IFilter
      * returns an iterator that returns columns from the given memtable
      * matching the Filter criteria in sorted order.
      */
-    public abstract IColumnIterator getMemtableColumnIterator(ColumnFamily cf, 
DecoratedKey<?> key, AbstractType comparator);
+    public abstract IColumnIterator getMemtableColumnIterator(ColumnFamily cf, 
DecoratedKey<?> key);
 
     /**
      * Get an iterator that returns columns from the given SSTable using the 
opened file

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java 
(original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java 
Thu Dec  8 17:31:07 2011
@@ -50,7 +50,7 @@ public class NamesQueryFilter implements
         this(FBUtilities.singleton(column));
     }
 
-    public IColumnIterator getMemtableColumnIterator(ColumnFamily cf, 
DecoratedKey<?> key, AbstractType comparator)
+    public IColumnIterator getMemtableColumnIterator(ColumnFamily cf, 
DecoratedKey<?> key)
     {
         return Memtable.getNamesIterator(key, cf, this);
     }

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java 
Thu Dec  8 17:31:07 2011
@@ -55,20 +55,20 @@ public class QueryFilter
         superFilter = path.superColumnName == null ? null : new 
NamesQueryFilter(path.superColumnName);
     }
 
-    public IColumnIterator getMemtableColumnIterator(Memtable memtable, 
AbstractType comparator)
+    public IColumnIterator getMemtableColumnIterator(Memtable memtable)
     {
         ColumnFamily cf = memtable.getColumnFamily(key);
         if (cf == null)
             return null;
-        return getMemtableColumnIterator(cf, key, comparator);
+        return getMemtableColumnIterator(cf, key);
     }
 
-    public IColumnIterator getMemtableColumnIterator(ColumnFamily cf, 
DecoratedKey<?> key, AbstractType comparator)
+    public IColumnIterator getMemtableColumnIterator(ColumnFamily cf, 
DecoratedKey<?> key)
     {
         assert cf != null;
         if (path.superColumnName == null)
-            return filter.getMemtableColumnIterator(cf, key, comparator);
-        return superFilter.getMemtableColumnIterator(cf, key, comparator);
+            return filter.getMemtableColumnIterator(cf, key);
+        return superFilter.getMemtableColumnIterator(cf, key);
     }
 
     // TODO move gcBefore into a field
@@ -87,10 +87,10 @@ public class QueryFilter
     }
 
     // TODO move gcBefore into a field
-    public void collateColumns(final ColumnFamily returnCF, List<? extends 
CloseableIterator<IColumn>> toCollate, AbstractType comparator, final int 
gcBefore)
+    public void collateColumns(final ColumnFamily returnCF, List<? extends 
CloseableIterator<IColumn>> toCollate, final int gcBefore)
     {
         IFilter topLevelFilter = (superFilter == null ? filter : superFilter);
-        Comparator<IColumn> fcomp = 
topLevelFilter.getColumnComparator(comparator);
+        Comparator<IColumn> fcomp = 
topLevelFilter.getColumnComparator(returnCF.getComparator());
         // define a 'reduced' iterator that merges columns w/ the same name, 
which
         // greatly simplifies computing liveColumns in the presence of 
tombstones.
         MergeIterator.Reducer<IColumn, IColumn> reducer = new 
MergeIterator.Reducer<IColumn, IColumn>()

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java 
(original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java 
Thu Dec  8 17:31:07 2011
@@ -56,9 +56,9 @@ public class SliceQueryFilter implements
         this.count = count;
     }
 
-    public IColumnIterator getMemtableColumnIterator(ColumnFamily cf, 
DecoratedKey<?> key, AbstractType comparator)
+    public IColumnIterator getMemtableColumnIterator(ColumnFamily cf, 
DecoratedKey<?> key)
     {
-        return Memtable.getSliceIterator(key, cf, this, comparator);
+        return Memtable.getSliceIterator(key, cf, this);
     }
 
     public IColumnIterator getSSTableColumnIterator(SSTableReader sstable, 
DecoratedKey<?> key)

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java 
(original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java 
Thu Dec  8 17:31:07 2011
@@ -235,8 +235,8 @@ public class KeysSearcher extends Second
                     {
                         ColumnFamily expandedData = data;
                         data = expandedData.cloneMeShallow();
-                        IColumnIterator iter = 
dataFilter.getMemtableColumnIterator(expandedData, dk, baseCfs.getComparator());
-                        new QueryFilter(dk, path, 
dataFilter).collateColumns(data, Collections.singletonList(iter), 
baseCfs.getComparator(), baseCfs.gcBefore());
+                        IColumnIterator iter = 
dataFilter.getMemtableColumnIterator(expandedData, dk);
+                        new QueryFilter(dk, path, 
dataFilter).collateColumns(data, Collections.singletonList(iter), 
baseCfs.gcBefore());
                     }
 
                     rows.add(new Row(dk, data));

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/service/RowRepairResolver.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/RowRepairResolver.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/service/RowRepairResolver.java 
(original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/service/RowRepairResolver.java 
Thu Dec  8 17:31:07 2011
@@ -168,7 +168,7 @@ public class RowRepairResolver extends A
                 continue;
             iters.add(FBUtilities.closeableIterator(version.iterator()));
         }
-        filter.collateColumns(resolved, iters, resolved.metadata().comparator, 
Integer.MIN_VALUE);
+        filter.collateColumns(resolved, iters, Integer.MIN_VALUE);
         return ColumnFamilyStore.removeDeleted(resolved, Integer.MIN_VALUE);
     }
 

Modified: 
cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java?rev=1211999&r1=1211998&r2=1211999&view=diff
==============================================================================
--- 
cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java
 (original)
+++ 
cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java
 Thu Dec  8 17:31:07 2011
@@ -133,13 +133,53 @@ public class ArrayBackedSortedColumnsTes
         assertSame(names, map.getColumnNames());
     }
 
+    @Test
+    public void testIterator()
+    {
+        testIteratorInternal(false);
+        //testIteratorInternal(true);
+    }
+
+    private void testIteratorInternal(boolean reversed)
+    {
+        ISortedColumns map = 
ArrayBackedSortedColumns.factory().create(BytesType.instance, reversed);
+
+        List<ByteBuffer> names = new ArrayList<ByteBuffer>();
+        int[] values = new int[]{ 1, 2, 3, 5, 9 };
+        for (int v : values)
+            names.add(ByteBufferUtil.bytes(v));
+
+        for (int i = 0; i < values.length; ++i)
+            map.addColumn(new Column(ByteBufferUtil.bytes(values[reversed ? 
values.length - 1 - i : i])), HeapAllocator.instance);
+
+        //assertSame(new int[]{ 3, 5, 9 }, 
map.iterator(ByteBufferUtil.bytes(3)));
+        //assertSame(new int[]{ 5, 9 }, map.iterator(ByteBufferUtil.bytes(4)));
+
+        assertSame(new int[]{ 3, 2, 1 }, 
map.reverseIterator(ByteBufferUtil.bytes(3)));
+        assertSame(new int[]{ 3, 2, 1 }, 
map.reverseIterator(ByteBufferUtil.bytes(4)));
+
+        assertSame(map.iterator(), 
map.iterator(ByteBufferUtil.EMPTY_BYTE_BUFFER));
+    }
+
     private <T> void assertSame(Collection<T> c1, Collection<T> c2)
     {
-        Iterator<T> iter1 = c1.iterator();
-        Iterator<T> iter2 = c2.iterator();
+        assertSame(c1.iterator(), c2.iterator());
+    }
+
+    private <T> void assertSame(Iterator<T> iter1, Iterator<T> iter2)
+    {
         while (iter1.hasNext() && iter2.hasNext())
             assertEquals(iter1.next(), iter2.next());
         if (iter1.hasNext() || iter2.hasNext())
             fail("The collection don't have the same size");
     }
+
+    private void assertSame(int[] names, Iterator<IColumn> iter)
+    {
+        for (int name : names)
+        {
+            assert iter.hasNext();
+            assert name == ByteBufferUtil.toInt(iter.next().name());
+        }
+    }
 }


Reply via email to