Author: jbellis
Date: Tue Jul 20 02:18:36 2010
New Revision: 965714

URL: http://svn.apache.org/viewvc?rev=965714&view=rev
Log:
handle subcolumn queries in cache fast-path, fixing system test regressions 
introduced in CASSANDRA-1267.  patch by jbellis

Modified:
    cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java

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=965714&r1=965713&r2=965714&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Tue 
Jul 20 02:18:36 2010
@@ -837,13 +837,35 @@ public class ColumnFamilyStore implement
             // we can skip the filter step entirely, and we can help out 
removeDeleted by re-caching the result
             // if any tombstones have aged out since last time.  (This means 
that the row cache will treat gcBefore as
             // max(gcBefore, all previous gcBefore), which is fine for 
correctness.)
+            //
+            // But, if the filter is asking for less columns than we have 
cached, we fall back to the slow path
+            // since we have to copy out a subset.
             if (filter.filter instanceof SliceQueryFilter)
             {
                 SliceQueryFilter sliceFilter = (SliceQueryFilter) 
filter.filter;
-                if (sliceFilter.start.length == 0 && sliceFilter.finish.length 
== 0 && sliceFilter.count > cached.getColumnCount())
+                if (sliceFilter.start.length == 0 && sliceFilter.finish.length 
== 0)
                 {
-                    removeDeletedColumnsOnly(cached, gcBefore);
-                    return removeDeletedCF(cached, gcBefore);
+                    if (cached.isSuper() && filter.path.superColumnName != 
null)
+                    {
+                        // subcolumns from named supercolumn
+                        IColumn sc = 
cached.getColumn(filter.path.superColumnName);
+                        if (sc == null || sliceFilter.count >= 
sc.getSubColumns().size())
+                        {
+                            ColumnFamily cf = cached.cloneMeShallow();
+                            if (sc != null)
+                                cf.addColumn(sc);
+                            return removeDeleted(cf, gcBefore);
+                        }
+                    }
+                    else
+                    {
+                        // top-level columns
+                        if (sliceFilter.count >= cached.getColumnCount())
+                        {
+                            removeDeletedColumnsOnly(cached, gcBefore);
+                            return removeDeletedCF(cached, gcBefore);
+                        }
+                    }
                 }
             }
             


Reply via email to