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);


Reply via email to