Author: jbellis
Date: Tue Jul 21 03:01:55 2009
New Revision: 796132
URL: http://svn.apache.org/viewvc?rev=796132&view=rev
Log:
add SubcolumnCompareWith option and subcolumnComparator code.
patch by jbellis; reviewed by Eric Evans for CASSANDRA-304
Modified:
incubator/cassandra/trunk/conf/storage-conf.xml
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SuperColumn.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SequenceFile.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java
incubator/cassandra/trunk/test/conf/storage-conf.xml
incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/RowTest.java
incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/SuperColumnTest.java
incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/TableTest.java
Modified: incubator/cassandra/trunk/conf/storage-conf.xml
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/conf/storage-conf.xml?rev=796132&r1=796131&r2=796132&view=diff
==============================================================================
--- incubator/cassandra/trunk/conf/storage-conf.xml (original)
+++ incubator/cassandra/trunk/conf/storage-conf.xml Tue Jul 21 03:01:55 2009
@@ -57,14 +57,21 @@
You can also specify the fully-qualified class name to a class
of your choice implementing
org.apache.cassandra.db.marshal.IType.
+ SuperColumns have a similar CompareSubcolumnsWith attribute.
+
+ (So to get the closest approximation to 0.3-style
supercolumns,
+ you would use CompareWith=UTF8Type
CompareSubcolumnsWith=LongType.)
+
if FlushPeriodInMinutes is configured and positive, it will be
flushed to disk with that period whether it is dirty or not.
This is intended for lightly-used columnfamilies so that they
- do not prevent commitlog segments from being purged. -->
+ do not prevent commitlog segments from being purged.
+
+ -->
<ColumnFamily CompareWith="UTF8Type" Name="Standard1"
FlushPeriodInMinutes="60"/>
<ColumnFamily CompareWith="UTF8Type" Name="Standard2"/>
- <ColumnFamily CompareWith="UUIDType" Name="StandardByTime1"/>
- <ColumnFamily ColumnType="Super" Name="Super1"/>
+ <ColumnFamily CompareWith="UUIDType" Name="StandardByUUID1"/>
+ <ColumnFamily ColumnType="Super" CompareWith="UTF8Type"
CompareSubcolumnsWith="UTF8Type" Name="Super1"/>
</Table>
</Tables>
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java?rev=796132&r1=796131&r2=796132&view=diff
==============================================================================
---
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
(original)
+++
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
Tue Jul 21 03:01:55 2009
@@ -26,6 +26,7 @@
public String cfName; // name of the column family
public String columnType; // type: super, standard, etc.
public AbstractType comparator; // name sorted, time stamp sorted
etc.
+ public AbstractType subcolumnComparator; // like comparator, for
supercolumns
// The user chosen names (n_) for various parts of data in a column family.
// CQL queries, for instance, will refer to/extract data within a column
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java?rev=796132&r1=796131&r2=796132&view=diff
==============================================================================
---
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
(original)
+++
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
Tue Jul 21 03:01:55 2009
@@ -20,6 +20,9 @@
import java.util.*;
import java.io.*;
+import java.lang.reflect.InvocationTargetException;
+
+import javax.xml.transform.TransformerException;
import org.apache.log4j.Logger;
@@ -27,6 +30,7 @@
import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.AsciiType;
import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.db.marshal.BytesType;
import org.apache.cassandra.utils.FileUtils;
import org.apache.cassandra.utils.XMLUtils;
import org.w3c.dom.Node;
@@ -317,22 +321,22 @@
for ( int j = 0; j < size2; ++j )
{
Node columnFamily = columnFamilies.item(j);
- String cName = XMLUtils.getAttributeValue(columnFamily,
"Name");
- if (cName == null)
+ String cfName = XMLUtils.getAttributeValue(columnFamily,
"Name");
+ if (cfName == null)
{
throw new ConfigurationException("ColumnFamily name
attribute is required");
}
- String xqlCF = xqlTable + "columnfami...@name='" + cName +
"']/";
+ String xqlCF = xqlTable + "columnfami...@name='" + cfName
+ "']/";
/* squirrel away the application column families */
- applicationColumnFamilies_.add(cName);
+ applicationColumnFamilies_.add(cfName);
// Parse out the column type
String rawColumnType =
XMLUtils.getAttributeValue(columnFamily, "ColumnType");
String columnType =
ColumnFamily.getColumnType(rawColumnType);
if (columnType == null)
{
- throw new ConfigurationException("Column " + cName + "
has invalid type " + rawColumnType);
+ throw new ConfigurationException("ColumnFamily " +
cfName + " has invalid type " + rawColumnType);
}
if (XMLUtils.getAttributeValue(columnFamily, "ColumnSort")
!= null)
@@ -341,25 +345,16 @@
}
// Parse out the column comparator
- Class<? extends AbstractType> typeClass;
- String compareWith =
XMLUtils.getAttributeValue(columnFamily, "CompareWith");
- if (compareWith == null)
+ AbstractType columnComparator =
getComparator(columnFamily, "CompareWith");
+ AbstractType subcolumnComparator;
+ if (columnType.equals("Super"))
{
- typeClass =
org.apache.cassandra.db.marshal.AsciiType.class;
+ subcolumnComparator = getComparator(columnFamily,
"CompareSubcolumnsWith");
}
- else
+ else if (XMLUtils.getAttributeValue(columnFamily,
"CompareSubcolumnsWith") != null)
{
- String className = compareWith.contains(".") ?
compareWith : "org.apache.cassandra.db.marshal." + compareWith;
- try
- {
- typeClass = (Class<? extends
AbstractType>)Class.forName(className);
- }
- catch (ClassNotFoundException e)
- {
- throw new ConfigurationException("Unable to load
class " + className + " for CompareWith attribute");
- }
+ throw new
ConfigurationException("CompareSubcolumnsWith is only a valid attribute on
super columnfamilies (not regular columnfamily " + cfName + ")");
}
- AbstractType columnComparator =
typeClass.getConstructor().newInstance();
// see if flush period is set
String flushPeriodInMinutes =
XMLUtils.getAttributeValue(columnFamily, "FlushPeriodInMinutes");
@@ -399,10 +394,11 @@
CFMetaData cfMetaData = new CFMetaData();
cfMetaData.tableName = tName;
- cfMetaData.cfName = cName;
+ cfMetaData.cfName = cfName;
cfMetaData.columnType = columnType;
cfMetaData.comparator = columnComparator;
+ cfMetaData.subcolumnComparator = columnComparator;
cfMetaData.n_rowKey = n_rowKey;
cfMetaData.n_columnMap = n_columnMap;
@@ -416,7 +412,7 @@
}
cfMetaData.flushPeriodInMinutes = flushPeriod;
- tableToCFMetaDataMap_.get(tName).put(cName, cfMetaData);
+ tableToCFMetaDataMap_.get(tName).put(cfName, cfMetaData);
}
}
@@ -430,6 +426,7 @@
data = new CFMetaData();
data.columnType = "Super";
data.comparator = new UTF8Type();
+ data.subcolumnComparator = new BytesType();
systemMetadata.put(HintedHandOffManager.HINTS_CF, data);
tableToCFMetaDataMap_.put("system", systemMetadata);
@@ -455,7 +452,31 @@
throw new RuntimeException(e);
}
}
-
+
+ private static AbstractType getComparator(Node columnFamily, String attr)
+ throws ConfigurationException, TransformerException,
NoSuchMethodException, InvocationTargetException, IllegalAccessException,
InstantiationException
+ {
+ Class<? extends AbstractType> typeClass;
+ String compareWith = XMLUtils.getAttributeValue(columnFamily, attr);
+ if (compareWith == null)
+ {
+ typeClass = AsciiType.class;
+ }
+ else
+ {
+ String className = compareWith.contains(".") ? compareWith :
"org.apache.cassandra.db.marshal." + compareWith;
+ try
+ {
+ typeClass = (Class<? extends
AbstractType>)Class.forName(className);
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new ConfigurationException("Unable to load class " +
className + " for " + attr + " attribute");
+ }
+ }
+ return typeClass.getConstructor().newInstance();
+ }
+
/**
* Create the table directory in each data directory
*/
@@ -776,6 +797,12 @@
return getCFMetaData(tableName, cfName).comparator;
}
+ public static AbstractType getSubComparator(String tableName, String
cfName)
+ {
+ assert tableName != null;
+ return getCFMetaData(tableName, cfName).comparator;
+ }
+
public static Map<String, Map<String, CFMetaData>>
getTableToColumnFamilyMap()
{
return tableToCFMetaDataMap_;
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=796132&r1=796131&r2=796132&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
Tue Jul 21 03:01:55 2009
@@ -40,6 +40,7 @@
import org.apache.cassandra.db.filter.QueryPath;
import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.MarshalException;
+import org.apache.cassandra.db.marshal.LongType;
/**
* Author : Avinash Lakshman ( [email protected]) & Prashant Malik (
[email protected] )
@@ -88,7 +89,8 @@
{
String columnType = DatabaseDescriptor.getColumnFamilyType(tableName,
cfName);
AbstractType comparator = DatabaseDescriptor.getComparator(tableName,
cfName);
- return new ColumnFamily(cfName, columnType, comparator);
+ AbstractType subcolumnComparator =
DatabaseDescriptor.getSubComparator(tableName, cfName);
+ return new ColumnFamily(cfName, columnType, comparator,
subcolumnComparator);
}
private String name_;
@@ -99,22 +101,27 @@
private AtomicInteger size_ = new AtomicInteger(0);
private ConcurrentSkipListMap<byte[], IColumn> columns_;
- public ColumnFamily(String cfName, String columnType, AbstractType
comparator)
+ public ColumnFamily(String cfName, String columnType, AbstractType
comparator, AbstractType subcolumnComparator)
{
name_ = cfName;
type_ = columnType;
- columnSerializer_ = columnType.equals("Standard") ?
Column.serializer() : SuperColumn.serializer();
+ columnSerializer_ = columnType.equals("Standard") ?
Column.serializer() : SuperColumn.serializer(subcolumnComparator);
columns_ = new ConcurrentSkipListMap<byte[], IColumn>(comparator);
}
public ColumnFamily cloneMeShallow()
{
- ColumnFamily cf = new ColumnFamily(name_, type_, getComparator());
+ ColumnFamily cf = new ColumnFamily(name_, type_, getComparator(),
getSubComparator());
cf.markedForDeleteAt = markedForDeleteAt;
cf.localDeletionTime = localDeletionTime;
return cf;
}
+ private AbstractType getSubComparator()
+ {
+ return (columnSerializer_ instanceof SuperColumnSerializer) ?
((SuperColumnSerializer)columnSerializer_).getComparator() : null;
+ }
+
ColumnFamily cloneMe()
{
ColumnFamily cf = cloneMeShallow();
@@ -190,6 +197,7 @@
}
else
{
+ assert isSuper();
try
{
getComparator().validate(path.superColumnName);
@@ -198,7 +206,7 @@
{
throw new MarshalException("Invalid supercolumn name in " +
path.columnFamilyName + " for " + getComparator().getClass().getName());
}
- column = new SuperColumn(path.superColumnName);
+ column = new SuperColumn(path.superColumnName, getSubComparator());
column.addColumn(new Column(path.columnName, value, timestamp,
deleted)); // checks subcolumn name
}
addColumn(column);
@@ -290,7 +298,7 @@
*/
ColumnFamily diff(ColumnFamily cfComposite)
{
- ColumnFamily cfDiff = new ColumnFamily(cfComposite.name(),
cfComposite.type_, getComparator());
+ ColumnFamily cfDiff = new ColumnFamily(cfComposite.name(),
cfComposite.type_, getComparator(), getSubComparator());
if (cfComposite.getMarkedForDeleteAt() > getMarkedForDeleteAt())
{
cfDiff.delete(cfComposite.getLocalDeletionTime(),
cfComposite.getMarkedForDeleteAt());
@@ -453,11 +461,15 @@
*/
public void serialize(ColumnFamily columnFamily, DataOutputStream dos)
throws IOException
{
+ // TODO whenever we change this we need to change the code in
SequenceFile to match in two places.
+ // This SUCKS and is inefficient to boot. let's fix this ASAP.
Collection<IColumn> columns = columnFamily.getSortedColumns();
dos.writeUTF(columnFamily.name());
dos.writeUTF(columnFamily.type_);
dos.writeUTF(columnFamily.getComparator().getClass().getCanonicalName());
+ AbstractType subcolumnComparator = columnFamily.getSubComparator();
+ dos.writeUTF(subcolumnComparator == null ? "" :
subcolumnComparator.getClass().getCanonicalName());
dos.writeInt(columnFamily.localDeletionTime);
dos.writeLong(columnFamily.markedForDeleteAt);
@@ -472,6 +484,7 @@
{
ColumnFamily cf = new ColumnFamily(dis.readUTF(),
dis.readUTF(),
+ readComparator(dis),
readComparator(dis));
cf.delete(dis.readInt(), dis.readLong());
int size = dis.readInt();
@@ -487,6 +500,11 @@
private AbstractType readComparator(DataInputStream dis) throws
IOException
{
String className = dis.readUTF();
+ if (className.equals(""))
+ {
+ return null;
+ }
+
try
{
return
(AbstractType)Class.forName(className).getConstructor().newInstance();
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=796132&r1=796131&r2=796132&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
Tue Jul 21 03:01:55 2009
@@ -293,7 +293,7 @@
if (DatabaseDescriptor.getColumnFamilyType(table_,
filter.getColumnFamilyName()).equals("Standard"))
startIColumn = new Column(filter.start);
else
- startIColumn = new SuperColumn(filter.start);
+ startIColumn = new SuperColumn(filter.start, null); // ok to not
have subcolumnComparator since we won't be adding columns to this object
// 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).
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java?rev=796132&r1=796131&r2=796132&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java
(original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java
Tue Jul 21 03:01:55 2009
@@ -44,6 +44,7 @@
import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.db.filter.QueryPath;
import org.apache.cassandra.db.marshal.MarshalException;
+import org.apache.cassandra.config.DatabaseDescriptor;
/**
@@ -173,7 +174,7 @@
}
else if (path.columnName == null)
{
- SuperColumn sc = new SuperColumn(path.superColumnName);
+ SuperColumn sc = new SuperColumn(path.superColumnName,
DatabaseDescriptor.getSubComparator(table_, cfName));
sc.markForDeleteAt(localDeleteTime, timestamp);
columnFamily.addColumn(sc);
}
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=796132&r1=796131&r2=796132&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
Tue Jul 21 03:01:55 2009
@@ -32,7 +32,6 @@
import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.io.ICompactSerializer;
-import org.apache.cassandra.db.marshal.LongType;
import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.MarshalException;
@@ -40,26 +39,26 @@
* Author : Avinash Lakshman ( [email protected]) & Prashant Malik (
[email protected] )
*/
-public final class SuperColumn implements IColumn, Serializable
+public final class SuperColumn implements IColumn
{
private static Logger logger_ = Logger.getLogger(SuperColumn.class);
- private static SuperColumnSerializer serializer_ = new
SuperColumnSerializer();
- static SuperColumnSerializer serializer()
+ static SuperColumnSerializer serializer(AbstractType comparator)
{
- return serializer_;
+ return new SuperColumnSerializer(comparator);
}
private byte[] name_;
// TODO make subcolumn comparator configurable
- private ConcurrentSkipListMap<byte[], IColumn> columns_ = new
ConcurrentSkipListMap<byte[], IColumn>(new LongType());
+ private ConcurrentSkipListMap<byte[], IColumn> columns_;
private int localDeletionTime = Integer.MIN_VALUE;
private long markedForDeleteAt = Long.MIN_VALUE;
private AtomicInteger size_ = new AtomicInteger(0);
- SuperColumn(byte[] name)
+ SuperColumn(byte[] name, AbstractType comparator)
{
name_ = name;
+ columns_ = new ConcurrentSkipListMap<byte[], IColumn>(comparator);
}
public AbstractType getComparator()
@@ -69,7 +68,7 @@
public SuperColumn cloneMeShallow()
{
- SuperColumn sc = new SuperColumn(name_);
+ SuperColumn sc = new SuperColumn(name_, getComparator());
sc.markForDeleteAt(localDeletionTime, markedForDeleteAt);
return sc;
}
@@ -253,7 +252,7 @@
public IColumn diff(IColumn columnNew)
{
- IColumn columnDiff = new SuperColumn(columnNew.name());
+ IColumn columnDiff = new SuperColumn(columnNew.name(),
((SuperColumn)columnNew).getComparator());
if (columnNew.getMarkedForDeleteAt() > getMarkedForDeleteAt())
{
((SuperColumn)columnDiff).markForDeleteAt(columnNew.getLocalDeletionTime(),
columnNew.getMarkedForDeleteAt());
@@ -329,6 +328,18 @@
class SuperColumnSerializer implements ICompactSerializer<IColumn>
{
+ private AbstractType comparator;
+
+ public SuperColumnSerializer(AbstractType comparator)
+ {
+ this.comparator = comparator;
+ }
+
+ public AbstractType getComparator()
+ {
+ return comparator;
+ }
+
public void serialize(IColumn column, DataOutputStream dos) throws
IOException
{
SuperColumn superColumn = (SuperColumn)column;
@@ -350,7 +361,7 @@
public IColumn deserialize(DataInputStream dis) throws IOException
{
byte[] name = ColumnSerializer.readName(dis);
- SuperColumn superColumn = new SuperColumn(name);
+ SuperColumn superColumn = new SuperColumn(name, comparator);
superColumn.markForDeleteAt(dis.readInt(), dis.readLong());
assert dis.available() > 0;
@@ -365,5 +376,4 @@
}
return superColumn;
}
-
}
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=796132&r1=796131&r2=796132&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
Tue Jul 21 03:01:55 2009
@@ -229,6 +229,7 @@
private String cfName_;
private String cfType_;
private AbstractType comparator_;
+ private String subComparatorName_;
private boolean isAscending_;
private List<IndexHelper.ColumnIndexInfo> columnIndexList_;
@@ -243,6 +244,7 @@
super(filename, 128 * 1024);
this.cfName_ = cfName;
this.comparator_ = comparator;
+ this.subComparatorName_ =
DatabaseDescriptor.getSubComparator(SSTableReader.parseTableName(filename),
cfName).getClass().getCanonicalName();
this.key_ = key;
this.isAscending_ = isAscending;
init(startColumn, position);
@@ -311,10 +313,11 @@
cfType_ = file_.readUTF();
String comparatorName = file_.readUTF();
assert
comparatorName.equals(comparator_.getClass().getCanonicalName());
+ String subComparatorName = file_.readUTF(); // subcomparator
localDeletionTime_ = file_.readInt();
markedForDeleteAt_ = file_.readLong();
int totalNumCols = file_.readInt();
- allColumnsSize_ = dataSize - (totalBytesRead + 3 * utfPrefix_
+ cfName.length() + cfType_.length() + comparatorName.length() + 4 + 8 + 4);
+ allColumnsSize_ = dataSize - (totalBytesRead + 4 * utfPrefix_
+ cfName.length() + cfType_.length() + comparatorName.length() +
subComparatorName.length() + 4 + 8 + 4);
columnStartPosition_ = file_.getFilePointer();
columnIndexList_ = getFullColumnIndexList(colIndexList,
totalNumCols);
@@ -349,6 +352,7 @@
bufOut.writeUTF(cfName_);
bufOut.writeUTF(cfType_);
bufOut.writeUTF(comparator_.getClass().getCanonicalName());
+ bufOut.writeUTF(subComparatorName_);
bufOut.writeInt(localDeletionTime_);
bufOut.writeLong(markedForDeleteAt_);
// now write the columns
@@ -534,6 +538,9 @@
String comparatorName = file_.readUTF();
dataSize -= (utfPrefix_ + comparatorName.length());
+ String subComparatorName = file_.readUTF();
+ dataSize -= (utfPrefix_ + subComparatorName.length());
+
/* read local deletion time */
int localDeletionTime = file_.readInt();
dataSize -=4;
@@ -561,11 +568,12 @@
}
// returned data size
- bufOut.writeInt(dataSizeReturned + utfPrefix_ * 2 +
cfName.length() + cfType.length() + 4 + 4 + 8 + 4);
+ bufOut.writeInt(dataSizeReturned + utfPrefix_ * 4 +
cfName.length() + cfType.length() + comparatorName.length() +
subComparatorName.length() + 4 + 4 + 8 + 4);
// echo back the CF data we read
bufOut.writeUTF(cfName);
bufOut.writeUTF(cfType);
bufOut.writeUTF(comparatorName);
+ bufOut.writeUTF(subComparatorName);
bufOut.writeInt(localDeletionTime);
bufOut.writeLong(markedForDeleteAt);
/* write number of columns */
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java?rev=796132&r1=796131&r2=796132&view=diff
==============================================================================
---
incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java
(original)
+++
incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java
Tue Jul 21 03:01:55 2009
@@ -33,6 +33,8 @@
import java.util.zip.Deflater;
import java.util.zip.Inflater;
+import org.apache.log4j.Logger;
+
import org.apache.cassandra.config.DatabaseDescriptor;
/**
@@ -41,6 +43,7 @@
public class FBUtilities
{
+ private static Logger logger_ = Logger.getLogger(FBUtilities.class);
private static InetAddress localInetAddress_;
@@ -380,6 +383,7 @@
public static byte[] readByteArray(DataInput in) throws IOException
{
int length = in.readInt();
+ logger_.debug(length);
byte[] bytes = new byte[length];
in.readFully(bytes);
return bytes;
Modified: incubator/cassandra/trunk/test/conf/storage-conf.xml
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/conf/storage-conf.xml?rev=796132&r1=796131&r2=796132&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/conf/storage-conf.xml (original)
+++ incubator/cassandra/trunk/test/conf/storage-conf.xml Tue Jul 21 03:01:55
2009
@@ -44,12 +44,13 @@
<ColumnFamily Name="Standard2"/>
<ColumnFamily CompareWith="LongType" Name="StandardLong1"/>
<ColumnFamily CompareWith="LongType" Name="StandardLong2"/>
- <ColumnFamily ColumnType="Super" Name="Super1"/>
- <ColumnFamily ColumnType="Super" Name="Super2"/>
+ <ColumnFamily ColumnType="Super" CompareSubcolumnsWith="LongType"
Name="Super1"/>
+ <ColumnFamily ColumnType="Super" CompareSubcolumnsWith="LongType"
Name="Super2"/>
</Table>
<Table Name = "Table2">
<ColumnFamily Name="Standard1"/>
<ColumnFamily Name="Standard3"/>
+ <ColumnFamily ColumnType="Super" Name="Super3"/>
</Table>
</Tables>
<Seeds>
Modified:
incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/RowTest.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/RowTest.java?rev=796132&r1=796131&r2=796132&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/RowTest.java
(original)
+++ incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/RowTest.java
Tue Jul 21 03:01:55 2009
@@ -24,6 +24,7 @@
import static junit.framework.Assert.assertEquals;
import org.apache.cassandra.db.filter.QueryPath;
+import org.apache.cassandra.db.marshal.AsciiType;
import static org.apache.cassandra.Util.column;
public class RowTest
@@ -45,10 +46,10 @@
@Test
public void testDiffSuperColumn()
{
- SuperColumn sc1 = new SuperColumn("one".getBytes());
+ SuperColumn sc1 = new SuperColumn("one".getBytes(), new AsciiType());
sc1.addColumn(column("subcolumn", "A", 0));
- SuperColumn sc2 = new SuperColumn("one".getBytes());
+ SuperColumn sc2 = new SuperColumn("one".getBytes(), new AsciiType());
sc2.markForDeleteAt(0, 0);
SuperColumn scDiff = (SuperColumn)sc1.diff(sc2);
Modified:
incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/SuperColumnTest.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/SuperColumnTest.java?rev=796132&r1=796131&r2=796132&view=diff
==============================================================================
---
incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/SuperColumnTest.java
(original)
+++
incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/SuperColumnTest.java
Tue Jul 21 03:01:55 2009
@@ -24,12 +24,13 @@
import static junit.framework.Assert.assertNull;
import static org.apache.cassandra.Util.column;
import static org.apache.cassandra.Util.getBytes;
+import org.apache.cassandra.db.marshal.LongType;
public class SuperColumnTest
{
@Test
public void testMissingSubcolumn() {
- SuperColumn sc = new SuperColumn("sc1".getBytes());
+ SuperColumn sc = new SuperColumn("sc1".getBytes(), new LongType());
sc.addColumn(new Column(getBytes(1), "value".getBytes(), 1));
assertNotNull(sc.getSubColumn(getBytes(1)));
assertNull(sc.getSubColumn(getBytes(2)));
Modified:
incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/TableTest.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/TableTest.java?rev=796132&r1=796131&r2=796132&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/TableTest.java
(original)
+++ incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/TableTest.java
Tue Jul 21 03:01:55 2009
@@ -31,6 +31,7 @@
import static org.apache.cassandra.Util.getBytes;
import org.apache.cassandra.db.filter.NamesQueryFilter;
import org.apache.cassandra.db.filter.QueryPath;
+import org.apache.cassandra.db.marshal.LongType;
import org.apache.cassandra.io.SSTableReader;
public class TableTest extends CleanupHelper
@@ -323,7 +324,7 @@
{
RowMutation rm = new RowMutation("Table1", ROW);
ColumnFamily cf = ColumnFamily.create("Table1", "Super1");
- SuperColumn sc = new SuperColumn("sc1".getBytes());
+ SuperColumn sc = new SuperColumn("sc1".getBytes(), new
LongType());
sc.addColumn(new Column(getBytes(1), "val1".getBytes(), 1L));
cf.addColumn(sc);
rm.add(cf);