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/08/07 18:24:12 UTC
svn commit: r802073 - in
/incubator/cassandra/trunk/src/java/org/apache/cassandra:
db/ColumnIndexer.java db/filter/SSTableNamesIterator.java
db/filter/SSTableSliceIterator.java db/filter/SliceQueryFilter.java
io/IndexHelper.java
Author: jbellis
Date: Fri Aug 7 16:24:12 2009
New Revision: 802073
URL: http://svn.apache.org/viewvc?rev=802073&view=rev
Log:
move comparator out of IndexInfo
patch by jbellis; reviewed by Jun Rao for CASSANDRA-332
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnIndexer.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
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IndexHelper.java
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnIndexer.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnIndexer.java?rev=802073&r1=802072&r2=802073&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnIndexer.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnIndexer.java Fri Aug 7 16:24:12 2009
@@ -129,7 +129,7 @@
/* if we hit the column index size that we have to index after, go ahead and index it. */
if (endPosition - startPosition >= DatabaseDescriptor.getColumnIndexSize())
{
- IndexHelper.IndexInfo cIndexInfo = new IndexHelper.IndexInfo(firstColumn.name(), column.name(), startPosition, endPosition - startPosition, null);
+ IndexHelper.IndexInfo cIndexInfo = new IndexHelper.IndexInfo(firstColumn.name(), column.name(), startPosition, endPosition - startPosition);
indexList.add(cIndexInfo);
indexSizeInBytes += cIndexInfo.serializedSize();
firstColumn = null;
@@ -138,7 +138,7 @@
// the last column may have fallen on an index boundary already. if not, index it explicitly.
if (indexList.isEmpty() || comparator.compare(indexList.get(indexList.size() - 1).lastName, column.name()) != 0)
{
- IndexHelper.IndexInfo cIndexInfo = new IndexHelper.IndexInfo(firstColumn.name(), column.name(), startPosition, endPosition - startPosition, null);
+ IndexHelper.IndexInfo cIndexInfo = new IndexHelper.IndexInfo(firstColumn.name(), column.name(), startPosition, endPosition - startPosition);
indexList.add(cIndexInfo);
indexSizeInBytes += cIndexInfo.serializedSize();
}
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=802073&r1=802072&r2=802073&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 Aug 7 16:24:12 2009
@@ -5,7 +5,9 @@
import org.apache.cassandra.db.ColumnFamily;
import org.apache.cassandra.db.IColumn;
+import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.io.*;
+import org.apache.cassandra.config.DatabaseDescriptor;
public class SSTableNamesIterator extends SimpleAbstractColumnIterator
{
@@ -37,16 +39,17 @@
/* Read the bloom filter summarizing the columns */
IndexHelper.defreezeBloomFilter(file);
- List<IndexHelper.IndexInfo> indexList = IndexHelper.deserializeIndex(ssTable.getTableName(), cfName, file);
+ List<IndexHelper.IndexInfo> indexList = IndexHelper.deserializeIndex(file);
cf = ColumnFamily.serializer().deserializeEmpty(file);
file.readInt(); // column count
/* get the various column ranges we have to read */
- SortedSet<IndexHelper.IndexInfo> ranges = new TreeSet<IndexHelper.IndexInfo>();
+ AbstractType comparator = DatabaseDescriptor.getComparator(SSTable.parseTableName(filename), cfName);
+ SortedSet<IndexHelper.IndexInfo> ranges = new TreeSet<IndexHelper.IndexInfo>(IndexHelper.getComparator(comparator));
for (byte[] name : columns)
{
- ranges.add(indexList.get(IndexHelper.indexFor(name, indexList)));
+ ranges.add(indexList.get(IndexHelper.indexFor(name, indexList, comparator)));
}
/* seek to the correct offset to the data */
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java?rev=802073&r1=802072&r2=802073&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java Fri Aug 7 16:24:12 2009
@@ -3,8 +3,6 @@
import java.util.*;
import java.io.IOException;
-import org.apache.commons.lang.ArrayUtils;
-
import org.apache.cassandra.db.IColumn;
import org.apache.cassandra.db.ColumnFamily;
import org.apache.cassandra.db.marshal.AbstractType;
@@ -20,12 +18,11 @@
protected boolean isAscending;
private byte[] startColumn;
private int curColumnIndex;
- private ColumnFamily curCF = null;
private ArrayList<IColumn> curColumns = new ArrayList<IColumn>();
private ColumnGroupReader reader;
private AbstractType comparator;
- public SSTableSliceIterator(String filename, String key, String cfName, AbstractType comparator, byte[] startColumn, boolean isAscending)
+ public SSTableSliceIterator(String filename, String key, AbstractType comparator, byte[] startColumn, boolean isAscending)
throws IOException
{
this.isAscending = isAscending;
@@ -33,10 +30,9 @@
/* Morph key into actual key based on the partition type. */
String decoratedKey = ssTable.getPartitioner().decorateKey(key);
- AbstractType comparator1 = DatabaseDescriptor.getComparator(ssTable.getTableName(), cfName);
long position = ssTable.getPosition(decoratedKey);
if (position >= 0)
- reader = new ColumnGroupReader(ssTable.getFilename(), decoratedKey, cfName, comparator1, startColumn, isAscending, position);
+ reader = new ColumnGroupReader(ssTable.getFilename(), decoratedKey, comparator, startColumn, isAscending, position);
this.comparator = comparator;
this.startColumn = startColumn;
curColumnIndex = isAscending ? 0 : -1;
@@ -64,8 +60,6 @@
private void getColumnsFromBuffer() throws IOException
{
- if (curCF == null)
- curCF = reader.getEmptyColumnFamily().cloneMeShallow();
curColumns.clear();
while (true)
{
@@ -84,7 +78,7 @@
public ColumnFamily getColumnFamily()
{
- return curCF;
+ return reader.getEmptyColumnFamily();
}
protected IColumn computeNext()
@@ -135,9 +129,6 @@
*/
public static class ColumnGroupReader
{
- private String key_;
- private String cfName_;
- private AbstractType comparator_;
private boolean isAscending_;
private ColumnFamily emptyColumnFamily;
@@ -147,27 +138,18 @@
private BufferedRandomAccessFile file_;
private Queue<IColumn> blockColumns = new ArrayDeque<IColumn>();
- public ColumnGroupReader(String filename, String key, String cfName, AbstractType comparator, byte[] startColumn, boolean isAscending, long position) throws IOException
+ public ColumnGroupReader(String filename, String key, AbstractType comparator, byte[] startColumn, boolean isAscending, long position) throws IOException
{
this.file_ = new BufferedRandomAccessFile(filename, "r");
- this.cfName_ = cfName;
- this.comparator_ = comparator;
- this.key_ = key;
this.isAscending_ = isAscending;
- init(startColumn, position);
- }
- private void init(byte[] startColumn, long position) throws IOException
- {
file_.seek(position);
String keyInDisk = file_.readUTF();
- assert keyInDisk.equals(key_);
+ assert keyInDisk.equals(key);
file_.readInt(); // row size
IndexHelper.skipBloomFilter(file_);
-
- /* read the index */
- indexList_ = IndexHelper.deserializeIndex(SSTableReader.parseTableName(file_.getPath()), cfName_, file_);
+ indexList_ = IndexHelper.deserializeIndex(file_);
/* need to do two things here.
* 1. move the file pointer to the beginning of the list of stored columns
@@ -184,10 +166,7 @@
}
else
{
- int index = Collections.binarySearch(indexList_, new IndexHelper.IndexInfo(startColumn, startColumn, 0, 0, comparator_));
- curRangeIndex_ = index < 0 ? -1 * (index + 1): index;
- if (curRangeIndex_ < 0)
- curRangeIndex_ = 0;
+ curRangeIndex_ = IndexHelper.indexFor(startColumn, indexList_, comparator);
}
}
@@ -201,29 +180,24 @@
return blockColumns.poll();
}
- private boolean getBlockFromCurIndex() throws IOException
+ public boolean getNextBlock() throws IOException
{
if (curRangeIndex_ < 0 || curRangeIndex_ >= indexList_.size())
return false;
- IndexHelper.IndexInfo curColPostion = indexList_.get(curRangeIndex_);
/* seek to the correct offset to the data, and calculate the data size */
+ IndexHelper.IndexInfo curColPostion = indexList_.get(curRangeIndex_);
file_.seek(columnStartPosition_ + curColPostion.offset);
while (file_.getFilePointer() < columnStartPosition_ + curColPostion.offset + curColPostion.width)
{
blockColumns.add(emptyColumnFamily.getColumnSerializer().deserialize(file_));
}
- return true;
- }
- public boolean getNextBlock() throws IOException
- {
- boolean result = getBlockFromCurIndex();
if (isAscending_)
curRangeIndex_++;
else
curRangeIndex_--;
- return result;
+ return true;
}
public void close() throws IOException
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java?rev=802073&r1=802072&r2=802073&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java Fri Aug 7 16:24:12 2009
@@ -33,7 +33,7 @@
public ColumnIterator getSSTableColumnIterator(SSTableReader sstable, AbstractType comparator) throws IOException
{
- return new SSTableSliceIterator(sstable.getFilename(), key, getColumnFamilyName(), comparator, start, isAscending);
+ return new SSTableSliceIterator(sstable.getFilename(), key, comparator, start, isAscending);
}
public void filterSuperColumn(SuperColumn superColumn, int gcBefore)
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=802073&r1=802072&r2=802073&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 Aug 7 16:24:12 2009
@@ -89,16 +89,15 @@
* Deserialize the index into a structure and return the number of bytes read.
* @throws IOException
*/
- public static ArrayList<IndexInfo> deserializeIndex(String tableName, String cfName, RandomAccessFile in) throws IOException
+ public static ArrayList<IndexInfo> deserializeIndex(RandomAccessFile in) throws IOException
{
ArrayList<IndexInfo> indexList = new ArrayList<IndexInfo>();
int columnIndexSize = in.readInt();
long start = in.getFilePointer();
- AbstractType comparator = DatabaseDescriptor.getComparator(tableName, cfName);
while (in.getFilePointer() < start + columnIndexSize)
{
- indexList.add(IndexInfo.deserialize(in, comparator));
+ indexList.add(IndexInfo.deserialize(in));
}
assert in.getFilePointer() == start + columnIndexSize;
@@ -121,33 +120,37 @@
return BloomFilter.serializer().deserialize(bufIn);
}
- public static int indexFor(byte[] name, List<IndexInfo> indexList)
+ public static int indexFor(byte[] name, List<IndexInfo> indexList, AbstractType comparator)
{
- IndexInfo target = new IndexInfo(name, name, 0, 0, indexList.get(0).comparator);
- int index = Collections.binarySearch(indexList, target);
+ IndexInfo target = new IndexInfo(name, name, 0, 0);
+ int index = Collections.binarySearch(indexList, target, getComparator(comparator));
return index < 0 ? -1 * (index + 1) : index;
}
- public static class IndexInfo implements Comparable<IndexInfo>
+ public static Comparator<IndexInfo> getComparator(final AbstractType nameComparator)
+ {
+ return new Comparator<IndexInfo>()
+ {
+ public int compare(IndexInfo o1, IndexInfo o2)
+ {
+ return nameComparator.compare(o1.lastName, o2.lastName);
+ }
+ };
+ }
+
+ public static class IndexInfo
{
public final long width;
public final byte[] lastName;
- private AbstractType comparator;
public final byte[] firstName;
public final long offset;
- public IndexInfo(byte[] firstName, byte[] lastName, long offset, long width, AbstractType comparator)
+ public IndexInfo(byte[] firstName, byte[] lastName, long offset, long width)
{
this.firstName = firstName;
this.lastName = lastName;
this.offset = offset;
this.width = width;
- this.comparator = comparator;
- }
-
- public int compareTo(IndexInfo rhs)
- {
- return comparator.compare(lastName, rhs.lastName);
}
public void serialize(DataOutputStream dos) throws IOException
@@ -163,9 +166,9 @@
return 2 + firstName.length + 2 + lastName.length + 8 + 8;
}
- public static IndexInfo deserialize(RandomAccessFile dis, AbstractType comparator) throws IOException
+ public static IndexInfo deserialize(RandomAccessFile dis) throws IOException
{
- return new IndexInfo(ColumnSerializer.readName(dis), ColumnSerializer.readName(dis), dis.readLong(), dis.readLong(), comparator);
+ return new IndexInfo(ColumnSerializer.readName(dis), ColumnSerializer.readName(dis), dis.readLong(), dis.readLong());
}
}