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/07/10 19:49:02 UTC

svn commit: r793053 - in /incubator/cassandra/trunk: src/java/org/apache/cassandra/db/ src/java/org/apache/cassandra/db/filter/ src/java/org/apache/cassandra/io/ src/java/org/apache/cassandra/test/ test/unit/org/apache/cassandra/db/

Author: jbellis
Date: Fri Jul 10 17:49:01 2009
New Revision: 793053

URL: http://svn.apache.org/viewvc?rev=793053&view=rev
Log:
replace namesfilter with NamesQueryFilter.  mv filter code into separate package.
patch by jbellis; reviewed by Jun Rao for CASSANDRA-287

Added:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/AbstractColumnIterator.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/ColumnIterator.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java
      - copied, changed from r793052, incubator/cassandra/trunk/src/java/org/apache/cassandra/db/QueryFilter.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java
      - copied, changed from r793052, incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnIterator.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SimpleAbstractColumnIterator.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
      - copied, changed from r793052, incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SliceQueryFilter.java
Removed:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnIterator.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/NamesFilter.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/QueryFilter.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SliceQueryFilter.java
Modified:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Column.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SliceByNamesReadCommand.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SuperColumn.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/TimeFilter.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IFileReader.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IndexHelper.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTableReader.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SequenceFile.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/test/TestRunner.java
    incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/RemoveSuperColumnTest.java

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Column.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Column.java?rev=793053&r1=793052&r2=793053&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Column.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Column.java Fri Jul 10 17:49:01 2009
@@ -22,6 +22,7 @@
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.util.Collection;
+import java.util.Map;
 import java.nio.ByteBuffer;
 
 import org.apache.commons.lang.ArrayUtils;

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java?rev=793053&r1=793052&r2=793053&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java Fri Jul 10 17:49:01 2009
@@ -133,7 +133,7 @@
         this(cfName, columnType, ColumnComparatorFactory.getComparator(indexType));
     }
 
-    ColumnFamily cloneMeShallow()
+    public ColumnFamily cloneMeShallow()
     {
         ColumnFamily cf = new ColumnFamily(name_, type_, getComparator());
         cf.markedForDeleteAt = markedForDeleteAt;
@@ -218,7 +218,7 @@
 		addColumn(column);
     }
 
-    void clear()
+    public void clear()
     {
         if (logger_.isDebugEnabled())
           logger_.debug("clearing");
@@ -230,7 +230,7 @@
      * If we find an old column that has the same name
      * the ask it to resolve itself else add the new column .
     */
-    void addColumn(IColumn column)
+    public void addColumn(IColumn column)
     {
         String name = column.name();
         IColumn oldColumn = columns_.get(name);

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=793053&r1=793052&r2=793053&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Fri Jul 10 17:49:01 2009
@@ -39,9 +39,12 @@
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.*;
 import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor;
+import org.apache.cassandra.db.filter.QueryFilter;
+import org.apache.cassandra.db.filter.ColumnIterator;
+import org.apache.cassandra.db.filter.NamesQueryFilter;
+
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.collections.IteratorUtils;
-import org.apache.commons.collections.comparators.ReverseComparator;
 
 import org.cliffc.high_scale_lib.NonBlockingHashMap;
 import org.cliffc.high_scale_lib.NonBlockingHashSet;
@@ -663,8 +666,7 @@
                 // don't operate directly on the supercolumn, it could be the one in the memtable.
                 // instead, create a new SC and add in the subcolumns that qualify.
                 cf.remove(cname);
-                SuperColumn sc = new SuperColumn(cname);
-                sc.markForDeleteAt(c.getLocalDeletionTime(), c.getMarkedForDeleteAt());
+                SuperColumn sc = ((SuperColumn)c).cloneMeShallow();
                 for (IColumn subColumn : c.getSubColumns())
                 {
                     if (subColumn.timestamp() > minTimestamp)
@@ -1556,8 +1558,23 @@
      * only the latest version of a column is returned
      */
     public ColumnFamily getColumnFamily(QueryFilter filter)
-    throws IOException, ExecutionException, InterruptedException
+    throws IOException
     {
+        String[] values = RowMutation.getColumnAndColumnFamily(filter.columnFamilyColumn);
+
+        // if we are querying subcolumns of a supercolumn, fetch the supercolumn with NQF, then filter in-memory.
+        if (values.length > 1)
+        {
+            QueryFilter nameFilter = new NamesQueryFilter(filter.key, values[0], values[1]);
+            ColumnFamily cf = getColumnFamily(nameFilter);
+            for (IColumn column : cf.getAllColumns())
+            {
+                filter.filterSuperColumn((SuperColumn) column);
+            }
+            return removeDeleted(cf);
+        }
+
+        // we are querying top-level columns, do a merging fetch with indexes.
         sstableLock_.readLock().lock();
         List<ColumnIterator> iterators = new ArrayList<ColumnIterator>();
         try
@@ -1606,7 +1623,7 @@
             Comparator<IColumn> comparator = filter.getColumnComparator();
             Iterator collated = IteratorUtils.collatedIterator(comparator, iterators);
             if (!collated.hasNext())
-                return ColumnFamily.create(table_, filter.getColumnFamilyName());
+                return ColumnFamily.create(table_, columnFamily_);
 
             filter.collectColumns(returnCF, collated);
 

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=793053&r1=793052&r2=793053&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 10 17:49:01 2009
@@ -23,7 +23,6 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.commons.collections.comparators.ReverseComparator;
 import org.apache.commons.lang.ArrayUtils;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
@@ -33,6 +32,8 @@
 import org.apache.cassandra.io.SSTableWriter;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.DestructivePQIterator;
+import org.apache.cassandra.db.filter.*;
+
 import org.apache.log4j.Logger;
 
 /**
@@ -234,8 +235,7 @@
                     if (subColumn != null)
                     {
                         columnFamily = cFamily.cloneMeShallow();
-                        SuperColumn container = new SuperColumn(superColumn.name());
-                        container.markForDeleteAt(superColumn.getLocalDeletionTime(), superColumn.getMarkedForDeleteAt());
+                        SuperColumn container = superColumn.cloneMeShallow();
                         container.addColumn(subColumn);
                         columnFamily.addColumn(container);
                     }
@@ -321,42 +321,28 @@
     /**
      * obtain an iterator of columns in this memtable in the specified order starting from a given column.
      */
-    ColumnIterator getColumnIterator(final String key, final String cfName, final boolean isAscending, String startColumn)
+    public ColumnIterator getSliceIterator(SliceQueryFilter filter)
     {
-        ColumnFamily cf = columnFamilies_.get(key);
-        final ColumnFamily columnFamily;
-        if (cf != null)
-            columnFamily = cf.cloneMeShallow();
-        else
-            columnFamily = ColumnFamily.create(table_, cfName);
+        ColumnFamily cf = columnFamilies_.get(filter.key);
+        final ColumnFamily columnFamily = cf == null ? ColumnFamily.create(table_, filter.getColumnFamilyName()) : cf.cloneMeShallow();
 
         final IColumn columns[] = (cf == null ? columnFamily : cf).getAllColumns().toArray(new IColumn[columnFamily.getAllColumns().size()]);
         // TODO if we are dealing with supercolumns, we need to clone them while we have the read lock since they can be modified later
-        if (!isAscending)
+        if (!filter.isAscending)
             ArrayUtils.reverse(columns);
         IColumn startIColumn;
-        if (DatabaseDescriptor.getColumnFamilyType(table_, cfName).equals("Standard"))
-            startIColumn = new Column(startColumn);
+        if (DatabaseDescriptor.getColumnFamilyType(table_, filter.getColumnFamilyName()).equals("Standard"))
+            startIColumn = new Column(filter.start);
         else
-            startIColumn = new SuperColumn(startColumn);
+            startIColumn = new SuperColumn(filter.start);
 
         // 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 = new Comparator<IColumn>()
-        {
-            public int compare(IColumn column1, IColumn column2)
-            {
-                return column1.name().compareTo(column2.name());
-            }
-        };
-        if (!isAscending)
-        {
-            comparator = new ReverseComparator(comparator);
-        }
+        Comparator<IColumn> comparator = filter.getColumnComparator();
         int index = Arrays.binarySearch(columns, startIColumn, comparator);
         final int startIndex = index < 0 ? -(index + 1) : index;
 
-        return new ColumnIterator()
+        return new AbstractColumnIterator()
         {
             private int curIndex_ = startIndex;
 
@@ -374,12 +360,39 @@
             {
                 return columns[curIndex_++];
             }
+        };
+    }
+
+    public ColumnIterator getNamesIterator(final NamesQueryFilter filter)
+    {
+        ColumnFamily cf = columnFamilies_.get(filter.key);
+        final ColumnFamily columnFamily = cf == null ? ColumnFamily.create(table_, filter.getColumnFamilyName()) : cf.cloneMeShallow();
+        final Map<String, IColumn> columnsContainer = cf == null ? null : cf.getColumns();
 
-            public void close() throws IOException {}
+        return new SimpleAbstractColumnIterator()
+        {
+            private Iterator<String> iter = filter.columns.iterator();
+            private String current;
 
-            public void remove()
+            public ColumnFamily getColumnFamily()
             {
-                throw new UnsupportedOperationException();
+                return columnFamily;
+            }
+
+            protected IColumn computeNext()
+            {
+                if (columnsContainer == null)
+                {
+                    return endOfData();
+                }
+                while (iter.hasNext())
+                {
+                    current = iter.next();
+                    IColumn column = columnsContainer.get(current);
+                    if (column != null)
+                        return column;
+                }
+                return endOfData();
             }
         };
     }

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SliceByNamesReadCommand.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SliceByNamesReadCommand.java?rev=793053&r1=793052&r2=793053&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SliceByNamesReadCommand.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SliceByNamesReadCommand.java Fri Jul 10 17:49:01 2009
@@ -20,22 +20,20 @@
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 
 import org.apache.commons.lang.StringUtils;
 
 public class SliceByNamesReadCommand extends ReadCommand
 {
     public final String columnFamily;
-    public final List<String> columnNames;
+    public final SortedSet<String> columnNames;
 
-    public SliceByNamesReadCommand(String table, String key, String columnFamily, List<String> columnNames)
+    public SliceByNamesReadCommand(String table, String key, String columnFamily, Collection<String> columnNames)
     {
         super(table, key, CMD_TYPE_GET_SLICE_BY_NAMES);
         this.columnFamily = columnFamily;
-        this.columnNames = Collections.unmodifiableList(columnNames);
+        this.columnNames = new TreeSet<String>(columnNames);
     }
 
     @Override

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SuperColumn.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SuperColumn.java?rev=793053&r1=793052&r2=793053&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SuperColumn.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SuperColumn.java Fri Jul 10 17:49:01 2009
@@ -24,6 +24,7 @@
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.Set;
+import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.commons.lang.ArrayUtils;
@@ -62,6 +63,13 @@
     	name_ = name;
     }
 
+    public SuperColumn cloneMeShallow()
+    {
+        SuperColumn sc = new SuperColumn(name_);
+        sc.markForDeleteAt(localDeletionTime, markedForDeleteAt);
+        return sc;
+    }
+
 	public boolean isMarkedForDelete()
 	{
 		return markedForDeleteAt > Long.MIN_VALUE;

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java?rev=793053&r1=793052&r2=793053&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java Fri Jul 10 17:49:01 2009
@@ -43,6 +43,10 @@
 import org.apache.cassandra.net.io.StreamContextManager;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.*;
+import org.apache.cassandra.db.filter.QueryFilter;
+import org.apache.cassandra.db.filter.SliceQueryFilter;
+import org.apache.cassandra.db.filter.NamesQueryFilter;
+
 import org.apache.log4j.Logger;
 
 /**
@@ -495,6 +499,7 @@
     /**
      * Selects the row associated with the given key.
     */
+    @Deprecated // CF should be our atom of work, not Row
     public Row get(String key) throws IOException
     {        
         Row row = new Row(table_, key);
@@ -520,13 +525,14 @@
     /**
      * Selects the specified column family for the specified key.
     */
-    public ColumnFamily get(String key, String cf) throws IOException
+    @Deprecated // single CFs could be larger than memory
+    public ColumnFamily get(String key, String columnFamilyColumn) throws IOException
     {
-        String[] values = RowMutation.getColumnAndColumnFamily(cf);
+        String[] values = RowMutation.getColumnAndColumnFamily(columnFamilyColumn);
         long start = System.currentTimeMillis();
         ColumnFamilyStore cfStore = columnFamilyStores_.get(values[0]);
-        assert cfStore != null : "Column family " + cf + " has not been defined";
-        ColumnFamily columnFamily = cfStore.getColumnFamily(key, cf, new IdentityFilter());
+        assert cfStore != null : "Column family " + columnFamilyColumn + " has not been defined";
+        ColumnFamily columnFamily = cfStore.getColumnFamily(key, columnFamilyColumn, new IdentityFilter());
         long timeTaken = System.currentTimeMillis() - start;
         dbAnalyticsSource_.updateReadStatistics(timeTaken);
         return columnFamily;
@@ -567,19 +573,11 @@
      *  param @ cf - column family we are interested in.
      *  param @ columns - columns that are part of the above column family.
     */
-    public Row getRow(String key, String cf, List<String> columns) throws IOException
+    public Row getRow(String key, String columnFamilyColumn, SortedSet<String> columns) throws IOException
     {
-    	Row row = new Row(table_, key);
-        String[] values = RowMutation.getColumnAndColumnFamily(cf);
-        ColumnFamilyStore cfStore = columnFamilyStores_.get(values[0]);
-
-        if ( cfStore != null )
-        {
-        	ColumnFamily columnFamily = cfStore.getColumnFamily(key, cf, new NamesFilter(new ArrayList<String>(columns)));
-        	if ( columnFamily != null )
-        		row.addColumnFamily(columnFamily);
-        }
-    	return row;
+        // TODO for large CFs we will want a specialized iterator
+        QueryFilter filter = new NamesQueryFilter(key, columnFamilyColumn, columns);
+        return getRow(key, filter);
     }
 
     /**
@@ -587,12 +585,17 @@
     */
     public Row getRow(String key, String cfName, String start, String finish, boolean isAscending, int offset, int count) throws IOException
     {
+        QueryFilter filter = new SliceQueryFilter(key, cfName, start, finish, isAscending, offset, count);
+        return getRow(key, filter);
+    }
+
+    private Row getRow(String key, QueryFilter filter) throws IOException
+    {
+        ColumnFamilyStore cfStore = columnFamilyStores_.get(filter.getColumnFamilyName());
         Row row = new Row(table_, key);
-        ColumnFamilyStore cfStore = columnFamilyStores_.get(cfName);
         long start1 = System.currentTimeMillis();
         try
         {
-            QueryFilter filter = new SliceQueryFilter(key, cfName, start, finish, isAscending, offset, count);
             ColumnFamily columnFamily = cfStore.getColumnFamily(filter);
             if (columnFamily != null)
                 row.addColumnFamily(columnFamily);

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/TimeFilter.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/TimeFilter.java?rev=793053&r1=793052&r2=793053&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/TimeFilter.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/TimeFilter.java Fri Jul 10 17:49:01 2009
@@ -74,8 +74,7 @@
             for (IColumn column : columns)
             {
                 SuperColumn superColumn = (SuperColumn) column;
-                SuperColumn filteredSuperColumn = new SuperColumn(superColumn.name());
-                filteredSuperColumn.markForDeleteAt(column.getLocalDeletionTime(), column.getMarkedForDeleteAt());
+                SuperColumn filteredSuperColumn = superColumn.cloneMeShallow();
                 filteredCf.addColumn(filteredSuperColumn);
                 Collection<IColumn> subColumns = superColumn.getSubColumns();
                 for (IColumn subColumn : subColumns)

Added: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/AbstractColumnIterator.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/AbstractColumnIterator.java?rev=793053&view=auto
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/AbstractColumnIterator.java (added)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/AbstractColumnIterator.java Fri Jul 10 17:49:01 2009
@@ -0,0 +1,14 @@
+package org.apache.cassandra.db.filter;
+
+import java.io.IOException;
+
+public abstract class AbstractColumnIterator implements ColumnIterator
+{
+    public void close() throws IOException
+    {}
+
+    public void remove()
+    {
+        throw new UnsupportedOperationException();
+    }
+}

Added: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/ColumnIterator.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/ColumnIterator.java?rev=793053&view=auto
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/ColumnIterator.java (added)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/ColumnIterator.java Fri Jul 10 17:49:01 2009
@@ -0,0 +1,20 @@
+package org.apache.cassandra.db.filter;
+
+import java.util.Iterator;
+import java.io.IOException;
+
+import org.apache.cassandra.db.IColumn;
+import org.apache.cassandra.db.ColumnFamily;
+
+public interface ColumnIterator extends Iterator<IColumn>
+{
+    /**
+     *  returns the CF of the column being iterated.
+     *  The CF is only guaranteed to be available after a call to next() or hasNext().
+     */
+    public abstract ColumnFamily getColumnFamily();
+
+    /** clean up any open resources */
+    public void close() throws IOException;
+}
+

Added: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java?rev=793053&view=auto
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java (added)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java Fri Jul 10 17:49:01 2009
@@ -0,0 +1,59 @@
+package org.apache.cassandra.db.filter;
+
+import java.io.IOException;
+import java.util.SortedSet;
+import java.util.Arrays;
+import java.util.TreeSet;
+
+import org.apache.cassandra.io.SSTableReader;
+import org.apache.cassandra.utils.ReducingIterator;
+import org.apache.cassandra.db.filter.ColumnIterator;
+import org.apache.cassandra.db.Memtable;
+import org.apache.cassandra.db.ColumnFamily;
+import org.apache.cassandra.db.IColumn;
+import org.apache.cassandra.db.SuperColumn;
+
+public class NamesQueryFilter extends QueryFilter
+{
+    public final SortedSet<String> columns;
+
+    public NamesQueryFilter(String key, String columnFamilyColumn, SortedSet<String> columns)
+    {
+        super(key, columnFamilyColumn);
+        this.columns = columns;
+    }
+
+    public NamesQueryFilter(String key, String columnFamilyColumn, String column)
+    {
+        this(key, columnFamilyColumn, new TreeSet<String>(Arrays.asList(column)));
+    }
+
+    public ColumnIterator getMemColumnIterator(Memtable memtable)
+    {
+        return memtable.getNamesIterator(this);
+    }
+
+    public ColumnIterator getSSTableColumnIterator(SSTableReader sstable) throws IOException
+    {
+        return new SSTableNamesIterator(sstable.getFilename(), key, getColumnFamilyName(), columns);
+    }
+
+    public void filterSuperColumn(SuperColumn superColumn)
+    {
+        for (IColumn column : superColumn.getSubColumns())
+        {
+            if (!columns.contains(column.name()))
+            {
+                superColumn.remove(column.name());
+            }
+        }
+    }
+
+    public void collectColumns(ColumnFamily returnCF, ReducingIterator<IColumn> reducedColumns)
+    {
+        for (IColumn column : reducedColumns)
+        {
+            returnCF.addColumn(column);
+        }
+    }
+}

Copied: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java (from r793052, incubator/cassandra/trunk/src/java/org/apache/cassandra/db/QueryFilter.java)
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java?p2=incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java&p1=incubator/cassandra/trunk/src/java/org/apache/cassandra/db/QueryFilter.java&r1=793052&r2=793053&rev=793053&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/QueryFilter.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java Fri Jul 10 17:49:01 2009
@@ -1,16 +1,12 @@
-package org.apache.cassandra.db;
+package org.apache.cassandra.db.filter;
 
 import java.io.IOException;
-import java.util.List;
 import java.util.Comparator;
 import java.util.Iterator;
-import java.util.Collection;
-
-import org.apache.commons.collections.comparators.ReverseComparator;
-import org.apache.commons.collections.IteratorUtils;
 
 import org.apache.cassandra.io.SSTableReader;
 import org.apache.cassandra.utils.ReducingIterator;
+import org.apache.cassandra.db.*;
 
 public abstract class QueryFilter
 {
@@ -42,7 +38,13 @@
      */
     public abstract void collectColumns(ColumnFamily returnCF, ReducingIterator<IColumn> reducedColumns);
 
-    protected Comparator<IColumn> getColumnComparator()
+    /**
+     * subcolumns of a supercolumn are unindexed, so to pick out parts of those we operate in-memory.
+     * @param superColumn
+     */
+    public abstract void filterSuperColumn(SuperColumn superColumn);
+
+    public Comparator<IColumn> getColumnComparator()
     {
         return new Comparator<IColumn>()
         {
@@ -84,6 +86,6 @@
 
     public String getColumnFamilyName()
     {
-        return RowMutation.getColumnAndColumnFamily(columnFamilyColumn)[0]);
+        return RowMutation.getColumnAndColumnFamily(columnFamilyColumn)[0];
     }
 }

Added: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java?rev=793053&view=auto
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java (added)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java Fri Jul 10 17:49:01 2009
@@ -0,0 +1,45 @@
+package org.apache.cassandra.db.filter;
+
+import java.io.IOException;
+import java.util.SortedSet;
+import java.util.Iterator;
+
+import org.apache.cassandra.db.ColumnFamily;
+import org.apache.cassandra.db.IColumn;
+import org.apache.cassandra.io.SSTableReader;
+import org.apache.cassandra.io.DataInputBuffer;
+
+public class SSTableNamesIterator extends SimpleAbstractColumnIterator
+{
+    private ColumnFamily cf;
+    private Iterator<IColumn> iter;
+    public final SortedSet<String> columns;
+
+    // TODO make this actually iterate so we don't have to read + deserialize + filter data that we don't need due to merging other sstables
+    public SSTableNamesIterator(String filename, String key, String cfName, SortedSet<String> columns) throws IOException
+    {
+        this.columns = columns;
+        SSTableReader ssTable = SSTableReader.open(filename);
+        DataInputBuffer buffer = ssTable.next(key, cfName, columns);
+        cf = ColumnFamily.serializer().deserialize(buffer);
+        iter = cf.getAllColumns().iterator();
+    }
+
+    public ColumnFamily getColumnFamily()
+    {
+        return cf;
+    }
+
+    protected IColumn computeNext()
+    {
+        if (iter == null)
+            return endOfData();
+        while (iter.hasNext())
+        {
+            IColumn c = iter.next();
+            if (columns.contains(c.name()))
+                return c;
+        }
+        return endOfData();
+    }
+}

Copied: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java (from r793052, incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnIterator.java)
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java?p2=incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java&p1=incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnIterator.java&r1=793052&r2=793053&rev=793053&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnIterator.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java Fri Jul 10 17:49:01 2009
@@ -1,133 +1,105 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.db;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.apache.cassandra.io.DataInputBuffer;
-import org.apache.cassandra.io.DataOutputBuffer;
-import org.apache.cassandra.io.SSTableReader;
-import org.apache.cassandra.io.SequenceFile.ColumnGroupReader;
-import com.google.common.collect.AbstractIterator;
-
-public interface ColumnIterator extends Iterator<IColumn>
-{
-    /**
-     *  returns the CF of the column being iterated.
-     *  The CF is only guaranteed to be available after a call to next() or hasNext().
-     */
-    public abstract ColumnFamily getColumnFamily();
-
-    /** clean up any open resources */
-    public void close() throws IOException;
-}
-
-/**
- *  A Column Iterator over SSTable
- */
-class SSTableColumnIterator extends AbstractIterator<IColumn> implements ColumnIterator
-{
-    protected boolean isAscending;
-    private String startColumn;
-    private DataOutputBuffer outBuf = new DataOutputBuffer();
-    private DataInputBuffer inBuf = new DataInputBuffer();
-    private int curColumnIndex;
-    private ColumnFamily curCF = null;
-    private ArrayList<IColumn> curColumns = new ArrayList<IColumn>();
-    private ColumnGroupReader reader;
-
-    public SSTableColumnIterator(String filename, String key, String cfName, String startColumn, boolean isAscending)
-    throws IOException
-    {
-        this.isAscending = isAscending;
-        SSTableReader ssTable = SSTableReader.open(filename);
-        reader = ssTable.getColumnGroupReader(key, cfName, startColumn, isAscending);
-        this.startColumn = startColumn;
-        curColumnIndex = isAscending ? 0 : -1;
-    }
-
-    private boolean isColumnNeeded(IColumn column)
-    {
-        if (isAscending)
-            return (column.name().compareTo(startColumn) >= 0);
-        else
-            return (column.name().compareTo(startColumn) <= 0);
-    }
-
-    private void getColumnsFromBuffer() throws IOException
-    {
-        inBuf.reset(outBuf.getData(), outBuf.getLength());
-        ColumnFamily columnFamily = ColumnFamily.serializer().deserialize(inBuf);
-
-        if (curCF == null)
-            curCF = columnFamily.cloneMeShallow();
-        curColumns.clear();
-        for (IColumn column : columnFamily.getAllColumns())
-            if (isColumnNeeded(column))
-                curColumns.add(column);
-
-        if (isAscending)
-            curColumnIndex = 0;
-        else
-            curColumnIndex = curColumns.size() - 1;
-    }
-
-    public ColumnFamily getColumnFamily()
-    {
-        return curCF;
-    }
-
-    protected IColumn computeNext()
-    {
-        while (true)
-        {
-            if (isAscending)
-            {
-                if (curColumnIndex < curColumns.size())
-                {
-                    return curColumns.get(curColumnIndex++);
-                }
-            }
-            else
-            {
-                if (curColumnIndex >= 0)
-                {
-                    return curColumns.get(curColumnIndex--);
-                }
-            }
-
-            try
-            {
-                if (!reader.getNextBlock(outBuf))
-                    return endOfData();
-                getColumnsFromBuffer();
-            }
-            catch (IOException e)
-            {
-                throw new RuntimeException(e);
-            }
-        }
-    }
-
-    public void close() throws IOException
-    {
-        reader.close();
-    }
-}
+package org.apache.cassandra.db.filter;
+
+import java.util.ArrayList;
+import java.io.IOException;
+
+import org.apache.cassandra.db.IColumn;
+import org.apache.cassandra.db.ColumnFamily;
+import org.apache.cassandra.io.DataOutputBuffer;
+import org.apache.cassandra.io.DataInputBuffer;
+import org.apache.cassandra.io.SequenceFile;
+import org.apache.cassandra.io.SSTableReader;
+import com.google.common.collect.AbstractIterator;
+
+/**
+ *  A Column Iterator over SSTable
+ */
+class SSTableSliceIterator extends AbstractIterator<IColumn> implements ColumnIterator
+{
+    protected boolean isAscending;
+    private String startColumn;
+    private DataOutputBuffer outBuf = new DataOutputBuffer();
+    private DataInputBuffer inBuf = new DataInputBuffer();
+    private int curColumnIndex;
+    private ColumnFamily curCF = null;
+    private ArrayList<IColumn> curColumns = new ArrayList<IColumn>();
+    private SequenceFile.ColumnGroupReader reader;
+
+    public SSTableSliceIterator(String filename, String key, String cfName, String startColumn, boolean isAscending)
+    throws IOException
+    {
+        this.isAscending = isAscending;
+        SSTableReader ssTable = SSTableReader.open(filename);
+        reader = ssTable.getColumnGroupReader(key, cfName, startColumn, isAscending);
+        this.startColumn = startColumn;
+        curColumnIndex = isAscending ? 0 : -1;
+    }
+
+    private boolean isColumnNeeded(IColumn column)
+    {
+        if (isAscending)
+            return (column.name().compareTo(startColumn) >= 0);
+        else
+            return (column.name().compareTo(startColumn) <= 0);
+    }
+
+    private void getColumnsFromBuffer() throws IOException
+    {
+        inBuf.reset(outBuf.getData(), outBuf.getLength());
+        ColumnFamily columnFamily = ColumnFamily.serializer().deserialize(inBuf);
+
+        if (curCF == null)
+            curCF = columnFamily.cloneMeShallow();
+        curColumns.clear();
+        for (IColumn column : columnFamily.getAllColumns())
+            if (isColumnNeeded(column))
+                curColumns.add(column);
+
+        if (isAscending)
+            curColumnIndex = 0;
+        else
+            curColumnIndex = curColumns.size() - 1;
+    }
+
+    public ColumnFamily getColumnFamily()
+    {
+        return curCF;
+    }
+
+    protected IColumn computeNext()
+    {
+        while (true)
+        {
+            if (isAscending)
+            {
+                if (curColumnIndex < curColumns.size())
+                {
+                    return curColumns.get(curColumnIndex++);
+                }
+            }
+            else
+            {
+                if (curColumnIndex >= 0)
+                {
+                    return curColumns.get(curColumnIndex--);
+                }
+            }
+
+            try
+            {
+                if (!reader.getNextBlock(outBuf))
+                    return endOfData();
+                getColumnsFromBuffer();
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    public void close() throws IOException
+    {
+        reader.close();
+    }
+}

Added: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SimpleAbstractColumnIterator.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SimpleAbstractColumnIterator.java?rev=793053&view=auto
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SimpleAbstractColumnIterator.java (added)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SimpleAbstractColumnIterator.java Fri Jul 10 17:49:01 2009
@@ -0,0 +1,11 @@
+package org.apache.cassandra.db.filter;
+
+import java.io.IOException;
+
+import org.apache.cassandra.db.IColumn;
+import com.google.common.collect.AbstractIterator;
+
+public abstract class SimpleAbstractColumnIterator extends AbstractIterator<IColumn> implements ColumnIterator
+{
+    public void close() throws IOException {}
+}

Copied: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java (from r793052, incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SliceQueryFilter.java)
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java?p2=incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java&p1=incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SliceQueryFilter.java&r1=793052&r2=793053&rev=793053&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SliceQueryFilter.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java Fri Jul 10 17:49:01 2009
@@ -1,4 +1,4 @@
-package org.apache.cassandra.db;
+package org.apache.cassandra.db.filter;
 
 import java.io.IOException;
 import java.util.Comparator;
@@ -7,6 +7,7 @@
 
 import org.apache.cassandra.io.SSTableReader;
 import org.apache.cassandra.utils.ReducingIterator;
+import org.apache.cassandra.db.*;
 
 public class SliceQueryFilter extends QueryFilter
 {
@@ -26,16 +27,22 @@
 
     public ColumnIterator getMemColumnIterator(Memtable memtable)
     {
-        return memtable.getColumnIterator(key, columnFamilyColumn, isAscending, start);
+        return memtable.getSliceIterator(this);
     }
 
     public ColumnIterator getSSTableColumnIterator(SSTableReader sstable) throws IOException
     {
-        return new SSTableColumnIterator(sstable.getFilename(), key, columnFamilyColumn, start, isAscending);
+        return new SSTableSliceIterator(sstable.getFilename(), key, getColumnFamilyName(), start, isAscending);
+    }
+
+    public void filterSuperColumn(SuperColumn superColumn)
+    {
+        // TODO write this after CASSANDRA-240 is done
+        throw new UnsupportedOperationException();
     }
 
     @Override
-    protected Comparator<IColumn> getColumnComparator()
+    public Comparator<IColumn> getColumnComparator()
     {
         Comparator<IColumn> comparator = super.getColumnComparator();
         return isAscending ? comparator : new ReverseComparator(comparator);

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IFileReader.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IFileReader.java?rev=793053&r1=793052&r2=793053&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IFileReader.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IFileReader.java Fri Jul 10 17:49:01 2009
@@ -20,6 +20,7 @@
 
 import java.io.IOException;
 import java.util.List;
+import java.util.SortedSet;
 
 /**
  * Interface to read from the SequenceFile abstraction.
@@ -78,7 +79,7 @@
      * @return number of bytes read.
      *
     */
-    public long next(String key, DataOutputBuffer bufOut, String columnFamilyName, List<String> columnNames, IndexHelper.TimeRange timeRange, long position) throws IOException;
+    public long next(String key, DataOutputBuffer bufOut, String columnFamilyName, SortedSet<String> columnNames, IndexHelper.TimeRange timeRange, long position) throws IOException;
 
     /**
      * Close the file after reading.

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IndexHelper.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IndexHelper.java?rev=793053&r1=793052&r2=793053&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IndexHelper.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IndexHelper.java Fri Jul 10 17:49:01 2009
@@ -221,7 +221,7 @@
 	 * @param totalNumCols the total number of columns
 	 * @return a list of subranges which contain all the columns in columnNames
 	 */
-	static List<ColumnRange> getMultiColumnRangesFromNameIndex(List<String> columnNames, List<IndexHelper.ColumnIndexInfo> columnIndexList, int dataSize, int totalNumCols)
+	static List<ColumnRange> getMultiColumnRangesFromNameIndex(SortedSet<String> columnNames, List<IndexHelper.ColumnIndexInfo> columnIndexList, int dataSize, int totalNumCols)
 	{
 		List<ColumnRange> columnRanges = new ArrayList<ColumnRange>();				
 

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTableReader.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTableReader.java?rev=793053&r1=793052&r2=793053&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTableReader.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTableReader.java Fri Jul 10 17:49:01 2009
@@ -285,12 +285,12 @@
         }
     }
 
-    public DataInputBuffer next(final String clientKey, String cfName, List<String> columnNames) throws IOException
+    public DataInputBuffer next(final String clientKey, String cfName, SortedSet<String> columnNames) throws IOException
     {
         return next(clientKey, cfName, columnNames, null);
     }
 
-    public DataInputBuffer next(final String clientKey, String cfName, List<String> columnNames, IndexHelper.TimeRange timeRange) throws IOException
+    public DataInputBuffer next(final String clientKey, String cfName, SortedSet<String> columnNames, IndexHelper.TimeRange timeRange) throws IOException
     {
         IFileReader dataReader = null;
         try
@@ -327,8 +327,8 @@
     {
         String[] values = RowMutation.getColumnAndColumnFamily(columnFamilyColumn);
         String columnFamilyName = values[0];
-        List<String> cnNames = (values.length == 1) ? null : Arrays.asList(values[1]);
-        return next(clientKey, columnFamilyName, cnNames);
+        SortedSet<String> columnNames = (values.length == 1) ? null : new TreeSet<String>(Arrays.asList(values[1]));
+        return next(clientKey, columnFamilyName, columnNames);
     }
 
     /**

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=793053&r1=793052&r2=793053&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 10 17:49:01 2009
@@ -20,10 +20,7 @@
 
 import java.io.*;
 import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Arrays;
+import java.util.*;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.utils.BloomFilter;
@@ -485,7 +482,7 @@
          * @return number of bytes that were read.
          * @throws IOException
          */
-        public long next(String key, DataOutputBuffer bufOut, String columnFamilyName, List<String> columnNames, IndexHelper.TimeRange timeRange, long position) throws IOException
+        public long next(String key, DataOutputBuffer bufOut, String columnFamilyName, SortedSet<String> columnNames, IndexHelper.TimeRange timeRange, long position) throws IOException
         {
             assert timeRange == null || columnNames == null; // at most one may be non-null
 
@@ -597,7 +594,7 @@
             bufOut.write(file_, dataSize);
         }
 
-        private void readColumns(String key, DataOutputBuffer bufOut, String columnFamilyName, List<String> cNames)
+        private void readColumns(String key, DataOutputBuffer bufOut, String columnFamilyName, SortedSet<String> cNames)
                 throws IOException
         {
             int dataSize = file_.readInt();
@@ -655,9 +652,6 @@
                 dataSize -= 4;
 
                 // TODO: this is name sorted - but eventually this should be sorted by the same criteria as the col index
-                /* sort the required list of columns */
-                cNames = new ArrayList<String>(cNames);
-                Collections.sort(cNames);
                 /* get the various column ranges we have to read */
                 List<IndexHelper.ColumnRange> columnRanges = IndexHelper.getMultiColumnRangesFromNameIndex(cNames, columnIndexList, dataSize, totalNumCols);
 

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/test/TestRunner.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/test/TestRunner.java?rev=793053&r1=793052&r2=793053&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/test/TestRunner.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/test/TestRunner.java Fri Jul 10 17:49:01 2009
@@ -17,10 +17,7 @@
  */
 package org.apache.cassandra.test;
 
-import java.util.Collection;
-import java.util.Random;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
 import org.apache.cassandra.db.ColumnFamily;
 import org.apache.cassandra.db.IColumn;
@@ -84,7 +81,7 @@
         System.out.println(row);
         */
         
-        List<String> list = new ArrayList<String>();
+        TreeSet<String> list = new TreeSet<String>();
         list.add("SuperColumn-0");
         list.add("SuperColumn-189");
         list.add("SuperColumn-23");

Modified: incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/RemoveSuperColumnTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/RemoveSuperColumnTest.java?rev=793053&r1=793052&r2=793053&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/RemoveSuperColumnTest.java (original)
+++ incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/RemoveSuperColumnTest.java Fri Jul 10 17:49:01 2009
@@ -30,6 +30,8 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertEquals;
 
+import org.apache.cassandra.db.filter.NamesQueryFilter;
+
 public class RemoveSuperColumnTest
 {
     @Test
@@ -125,11 +127,7 @@
         List<ColumnFamily> families;
         ColumnFamily resolved;
 
-        families = store.getColumnFamilies("key1", "Super2:SC1", new NamesFilter(Arrays.asList("Column2")));
-        resolved = ColumnFamilyStore.removeDeleted(ColumnFamily.resolve(families));
-        validateNewDataFamily(resolved);
-
-        resolved = store.getColumnFamily("key1", "Super2:SC1:Column2", new IdentityFilter());
+        resolved = store.getColumnFamily(new NamesQueryFilter("key1", "Super2:SC1", "Column2"));
         validateNewDataFamily(resolved);
     }