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 2010/08/02 17:05:29 UTC
svn commit: r981542 - in /cassandra/trunk:
src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java
test/unit/org/apache/cassandra/io/StreamingTest.java
Author: jbellis
Date: Mon Aug 2 15:05:28 2010
New Revision: 981542
URL: http://svn.apache.org/viewvc?rev=981542&view=rev
Log:
add SimpleColumnReader to optimize start-from-beginning-of-row slices
patch by jbellis; reviewed by gdusbabek for CASSANDRA-1338
Modified:
cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java
cassandra/trunk/test/unit/org/apache/cassandra/io/StreamingTest.java
Modified: cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java?rev=981542&r1=981541&r2=981542&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java Mon Aug 2 15:05:28 2010
@@ -97,7 +97,7 @@ class SSTableSliceIterator implements IC
}
}
- reader = new ColumnGroupReader(ssTable, file);
+ reader = startColumn.length == 0 && !reversed ? new SimpleColumnReader(ssTable, file) : new ColumnGroupReader(ssTable, file);
}
public DecoratedKey getKey()
@@ -131,6 +131,70 @@ class SSTableSliceIterator implements IC
reader.close();
}
+ private class SimpleColumnReader extends AbstractIterator<IColumn> implements IColumnIterator
+ {
+ private final FileDataInput file;
+ private final ColumnFamily emptyColumnFamily;
+ private final int columns;
+ private int i;
+ private FileMark mark;
+
+ public SimpleColumnReader(SSTableReader ssTable, FileDataInput input)
+ {
+ this.file = input;
+ try
+ {
+ IndexHelper.skipBloomFilter(file);
+ IndexHelper.skipIndex(file);
+
+ emptyColumnFamily = ColumnFamily.serializer().deserializeFromSSTableNoColumns(ssTable.makeColumnFamily(), file);
+ columns = file.readInt();
+ mark = file.mark();
+ }
+ catch (IOException e)
+ {
+ throw new IOError(e);
+ }
+ }
+
+ protected IColumn computeNext()
+ {
+ if (i++ >= columns)
+ return endOfData();
+
+ IColumn column;
+ try
+ {
+ file.reset(mark);
+ column = emptyColumnFamily.getColumnSerializer().deserialize(file);
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException("error reading " + i + " of " + columns, e);
+ }
+ if (finishColumn.length > 0 && comparator.compare(column.name(), finishColumn) > 0)
+ return endOfData();
+
+ mark = file.mark();
+ return column;
+ }
+
+ public ColumnFamily getColumnFamily() throws IOException
+ {
+ return emptyColumnFamily;
+ }
+
+ public void close() throws IOException
+ {
+ file.close();
+ }
+
+ public DecoratedKey getKey()
+ {
+ throw new UnsupportedOperationException();
+ }
+ }
+
/**
* This is a reader that finds the block for a starting column and returns
* blocks before/after it for each next call. This function assumes that
Modified: cassandra/trunk/test/unit/org/apache/cassandra/io/StreamingTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/io/StreamingTest.java?rev=981542&r1=981541&r2=981542&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/io/StreamingTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/io/StreamingTest.java Mon Aug 2 15:05:28 2010
@@ -70,6 +70,9 @@ public class StreamingTest extends Clean
assertEquals(2, rows.size());
assert Arrays.equals(rows.get(0).key.key, "key".getBytes());
assert Arrays.equals(rows.get(1).key.key, "key3".getBytes());
+ assert rows.get(0).cf.getColumnsMap().size() == 1;
+ assert rows.get(1).cf.getColumnsMap().size() == 1;
+ assert rows.get(1).cf.getColumn("key3".getBytes()) != null;
// and that the index and filter were properly recovered
assert null != cfstore.getColumnFamily(QueryFilter.getIdentityFilter(Util.dk("key"), new QueryPath("Standard1")));