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:07 UTC

svn commit: r793054 - in /incubator/cassandra/trunk/src/java/org/apache/cassandra/db: Memtable.java Table.java TimeFilter.java filter/SSTableNamesIterator.java filter/SSTableTimeIterator.java filter/TimeQueryFilter.java

Author: jbellis
Date: Fri Jul 10 17:49:06 2009
New Revision: 793054

URL: http://svn.apache.org/viewvc?rev=793054&view=rev
Log:
add TimeQueryFilter; remove old TimeFilter.
patch by jbellis; reviewed by Jun Rao for CASSANDRA-287

Added:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableTimeIterator.java
      - copied, changed from r793053, incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/TimeQueryFilter.java
Removed:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/TimeFilter.java
Modified:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java

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=793054&r1=793053&r2=793054&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:06 2009
@@ -365,9 +365,8 @@
 
     public ColumnIterator getNamesIterator(final NamesQueryFilter filter)
     {
-        ColumnFamily cf = columnFamilies_.get(filter.key);
+        final 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();
 
         return new SimpleAbstractColumnIterator()
         {
@@ -381,14 +380,14 @@
 
             protected IColumn computeNext()
             {
-                if (columnsContainer == null)
+                if (cf == null)
                 {
                     return endOfData();
                 }
                 while (iter.hasNext())
                 {
                     current = iter.next();
-                    IColumn column = columnsContainer.get(current);
+                    IColumn column = cf.getColumn(current);
                     if (column != null)
                         return column;
                 }
@@ -397,6 +396,38 @@
         };
     }
 
+    public ColumnIterator getTimeIterator(final TimeQueryFilter filter)
+    {
+        final ColumnFamily cf = columnFamilies_.get(filter.key);
+        final ColumnFamily columnFamily = cf == null ? ColumnFamily.create(table_, filter.getColumnFamilyName()) : cf.cloneMeShallow();
+
+        return new SimpleAbstractColumnIterator()
+        {
+            private Iterator<IColumn> iter = cf == null ? null : cf.getAllColumns().iterator();
+
+            public ColumnFamily getColumnFamily()
+            {
+                return columnFamily;
+            }
+
+            protected IColumn computeNext()
+            {
+                if (iter == null)
+                {
+                    return endOfData();
+                }
+                while (iter.hasNext())
+                {
+                    IColumn column = iter.next();
+                    if (column.timestamp() < filter.since)
+                        break;
+                    return column;
+                }
+                return endOfData();
+            }
+        };
+    }
+
     void clearUnsafe()
     {
         columnFamilies_.clear();

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=793054&r1=793053&r2=793054&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:06 2009
@@ -46,6 +46,7 @@
 import org.apache.cassandra.db.filter.QueryFilter;
 import org.apache.cassandra.db.filter.SliceQueryFilter;
 import org.apache.cassandra.db.filter.NamesQueryFilter;
+import org.apache.cassandra.db.filter.TimeQueryFilter;
 
 import org.apache.log4j.Logger;
 
@@ -550,19 +551,10 @@
         return row;
     }
     
-    public Row getRow(String key, String cf, long sinceTimeStamp) throws IOException
+    public Row getRow(String key, String columnFamilyColumn, long sinceTimeStamp) throws IOException
     {
-        Row row = new Row(table_, key);
-        String[] values = RowMutation.getColumnAndColumnFamily(cf);
-        ColumnFamilyStore cfStore = columnFamilyStores_.get(values[0]);
-        long start1 = System.currentTimeMillis();
-        assert cfStore != null : "Column family " + cf + " has not been defined";
-        ColumnFamily columnFamily = cfStore.getColumnFamily(key, cf, new TimeFilter(sinceTimeStamp));
-        if ( columnFamily != null )
-            row.addColumnFamily(columnFamily);
-        long timeTaken = System.currentTimeMillis() - start1;
-        dbAnalyticsSource_.updateReadStatistics(timeTaken);
-        return row;
+        QueryFilter filter = new TimeQueryFilter(key, columnFamilyColumn, sinceTimeStamp);
+        return getRow(key, filter);
     }
 
     /**

Modified: 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=793054&r1=793053&r2=793054&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java Fri Jul 10 17:49:06 2009
@@ -21,8 +21,11 @@
         this.columns = columns;
         SSTableReader ssTable = SSTableReader.open(filename);
         DataInputBuffer buffer = ssTable.next(key, cfName, columns);
-        cf = ColumnFamily.serializer().deserialize(buffer);
-        iter = cf.getAllColumns().iterator();
+        if (buffer.getLength() > 0)
+        {
+            cf = ColumnFamily.serializer().deserialize(buffer);
+            iter = cf.getAllColumns().iterator();
+        }
     }
 
     public ColumnFamily getColumnFamily()

Copied: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableTimeIterator.java (from r793053, 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/SSTableTimeIterator.java?p2=incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableTimeIterator.java&p1=incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java&r1=793053&r2=793054&rev=793054&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableTimeIterator.java Fri Jul 10 17:49:06 2009
@@ -1,28 +1,30 @@
 package org.apache.cassandra.db.filter;
 
-import java.io.IOException;
-import java.util.SortedSet;
 import java.util.Iterator;
+import java.io.IOException;
 
 import org.apache.cassandra.db.ColumnFamily;
 import org.apache.cassandra.db.IColumn;
 import org.apache.cassandra.io.SSTableReader;
 import org.apache.cassandra.io.DataInputBuffer;
+import org.apache.cassandra.io.IndexHelper;
 
-public class SSTableNamesIterator extends SimpleAbstractColumnIterator
+public class SSTableTimeIterator extends SimpleAbstractColumnIterator
 {
     private ColumnFamily cf;
     private Iterator<IColumn> iter;
-    public final SortedSet<String> columns;
+    public final long since;
 
-    // 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
+    public SSTableTimeIterator(String filename, String key, String cfName, long since) throws IOException
     {
-        this.columns = columns;
+        this.since = since;
         SSTableReader ssTable = SSTableReader.open(filename);
-        DataInputBuffer buffer = ssTable.next(key, cfName, columns);
-        cf = ColumnFamily.serializer().deserialize(buffer);
-        iter = cf.getAllColumns().iterator();
+        DataInputBuffer buffer = ssTable.next(key, cfName, null, new IndexHelper.TimeRange(since, Long.MAX_VALUE));
+        if (buffer.getLength() > 0)
+        {
+            cf = ColumnFamily.serializer().deserialize(buffer);
+            iter = cf.getAllColumns().iterator();
+        }
     }
 
     public ColumnFamily getColumnFamily()
@@ -37,8 +39,9 @@
         while (iter.hasNext())
         {
             IColumn c = iter.next();
-            if (columns.contains(c.name()))
-                return c;
+            if (c.timestamp() < since)
+                break;
+            return c;
         }
         return endOfData();
     }

Added: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/TimeQueryFilter.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/TimeQueryFilter.java?rev=793054&view=auto
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/TimeQueryFilter.java (added)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/TimeQueryFilter.java Fri Jul 10 17:49:06 2009
@@ -0,0 +1,54 @@
+package org.apache.cassandra.db.filter;
+
+import java.io.IOException;
+import java.util.Comparator;
+
+import org.apache.cassandra.db.*;
+import org.apache.cassandra.io.SSTableReader;
+import org.apache.cassandra.utils.ReducingIterator;
+
+public class TimeQueryFilter extends QueryFilter
+{
+    public final long since;
+
+    public TimeQueryFilter(String key, String columnFamilyColumn, long since)
+    {
+        super(key, columnFamilyColumn);
+        this.since = since;
+    }
+
+    public ColumnIterator getMemColumnIterator(Memtable memtable)
+    {
+        return memtable.getTimeIterator(this);
+    }
+
+    public ColumnIterator getSSTableColumnIterator(SSTableReader sstable) throws IOException
+    {
+        return new SSTableTimeIterator(sstable.getFilename(), key, getColumnFamilyName(), since);
+    }
+
+    @Override
+    public Comparator<IColumn> getColumnComparator()
+    {
+        return ColumnComparatorFactory.timestampComparator_;
+    }
+
+    public void collectColumns(ColumnFamily returnCF, ReducingIterator<IColumn> reducedColumns)
+    {
+        for (IColumn column : reducedColumns)
+        {
+            returnCF.addColumn(column);
+        }
+    }
+
+    public void filterSuperColumn(SuperColumn superColumn)
+    {
+        for (IColumn column : superColumn.getSubColumns())
+        {
+            if (column.timestamp() < since)
+            {
+                superColumn.remove(column.name());
+            }
+        }
+    }
+}