Author: jbellis
Date: Fri Apr 16 22:04:11 2010
New Revision: 935087

URL: http://svn.apache.org/viewvc?rev=935087&view=rev
Log:
move deletion code into DeletedColumn instead of using boolean isMarkedForDelete
patch by Sylvain Lebresne; reviewed by jbellis for CASSANDRA-699

Added:
    cassandra/trunk/src/java/org/apache/cassandra/db/DeletedColumn.java
Modified:
    cassandra/trunk/src/java/org/apache/cassandra/db/Column.java
    cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java
    cassandra/trunk/src/java/org/apache/cassandra/db/ColumnSerializer.java
    cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java
    cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableImport.java
    cassandra/trunk/test/unit/org/apache/cassandra/tools/SSTableExportTest.java

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/Column.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/Column.java?rev=935087&r1=935086&r2=935087&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/Column.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/Column.java Fri Apr 16 
22:04:11 2010
@@ -19,7 +19,6 @@
 package org.apache.cassandra.db;
 
 import java.util.Collection;
-import java.nio.ByteBuffer;
 import java.security.MessageDigest;
 import java.io.IOException;
 
@@ -39,19 +38,18 @@ import org.apache.cassandra.io.util.Data
 
 public class Column implements IColumn
 {
-    private static Logger logger_ = LoggerFactory.getLogger(Column.class);
+    private static Logger logger = LoggerFactory.getLogger(Column.class);
 
-    private static ColumnSerializer serializer_ = new ColumnSerializer();
+    private static ColumnSerializer serializer = new ColumnSerializer();
 
     public static ColumnSerializer serializer()
     {
-        return serializer_;
+        return serializer;
     }
 
-    private final byte[] name;
-    private final byte[] value;
-    private final long timestamp;
-    private final boolean isMarkedForDelete;
+    protected final byte[] name;
+    protected final byte[] value;
+    protected final long timestamp;
 
     Column(byte[] name)
     {
@@ -65,18 +63,12 @@ public class Column implements IColumn
 
     public Column(byte[] name, byte[] value, long timestamp)
     {
-        this(name, value, timestamp, false);
-    }
-
-    public Column(byte[] name, byte[] value, long timestamp, boolean isDeleted)
-    {
         assert name != null;
         assert value != null;
         assert name.length <= IColumn.MAX_NAME_LENGTH;
         this.name = name;
         this.value = value;
         this.timestamp = timestamp;
-        isMarkedForDelete = isDeleted;
     }
 
     public byte[] name()
@@ -111,16 +103,12 @@ public class Column implements IColumn
 
     public boolean isMarkedForDelete()
     {
-        return isMarkedForDelete;
+        return false;
     }
 
     public long getMarkedForDeleteAt()
     {
-        if (!isMarkedForDelete())
-        {
-            throw new IllegalStateException("column is not marked for delete");
-        }
-        return timestamp;
+        throw new IllegalStateException("column is not marked for delete");
     }
 
     public long mostRecentLiveChangeAt()
@@ -172,7 +160,7 @@ public class Column implements IColumn
         try
         {
             buffer.writeLong(timestamp);
-            buffer.writeBoolean(isMarkedForDelete);
+            buffer.writeBoolean(isMarkedForDelete());
         }
         catch (IOException e)
         {
@@ -183,14 +171,13 @@ public class Column implements IColumn
 
     public int getLocalDeletionTime()
     {
-        assert isMarkedForDelete;
-        return ByteBuffer.wrap(value).getInt();
+        throw new IllegalStateException("column is not marked for delete");
     }
 
     // note that we do not call this simply compareTo since it also makes 
sense to compare Columns by name
     public long comparePriority(Column o)
     {
-        if (isMarkedForDelete)
+        if (isMarkedForDelete())
         {
             // tombstone always wins ties.
             return timestamp < o.timestamp ? -1 : 1;

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java?rev=935087&r1=935086&r2=935087&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java Fri Apr 
16 22:04:11 2010
@@ -172,25 +172,35 @@ public class ColumnFamily implements ICo
 
     public void addColumn(QueryPath path, byte[] value, long timestamp)
     {
-        addColumn(path, value, timestamp, false);
+        assert path.columnName != null : path;
+        addColumn(path.superColumnName, new Column(path.columnName, value, 
timestamp));
+    }
+
+    public void addTombstone(QueryPath path, byte[] localDeletionTime, long 
timestamp)
+    {
+        addColumn(path.superColumnName, new DeletedColumn(path.columnName, 
localDeletionTime, timestamp));
     }
 
-    /** In most places the CF must be part of a QueryPath but here it is 
ignored. */
-    public void addColumn(QueryPath path, byte[] value, long timestamp, 
boolean deleted)
-       {
+    public void deleteColumn(QueryPath path, int localDeletionTime, long 
timestamp)
+    {
         assert path.columnName != null : path;
-               IColumn column;
-        if (path.superColumnName == null)
+        addColumn(path.superColumnName, new DeletedColumn(path.columnName, 
localDeletionTime, timestamp));
+    }
+
+    public void addColumn(byte[] superColumnName, Column column)
+    {
+        IColumn c;
+        if (superColumnName == null)
         {
-            column = new Column(path.columnName, value, timestamp, deleted);
+            c = column;
         }
         else
         {
             assert isSuper();
-            column = new SuperColumn(path.superColumnName, getSubComparator());
-            column.addColumn(new Column(path.columnName, value, timestamp, 
deleted)); // checks subcolumn name
+            c = new SuperColumn(superColumnName, getSubComparator());
+            c.addColumn(column); // checks subcolumn name
         }
-               addColumn(column);
+               addColumn(c);
     }
 
     public void clear()

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ColumnSerializer.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnSerializer.java?rev=935087&r1=935086&r2=935087&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnSerializer.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnSerializer.java Fri 
Apr 16 22:04:11 2010
@@ -58,6 +58,6 @@ public class ColumnSerializer implements
         {
             dis.readFully(value);
         }
-        return new Column(name, value, ts, delete);
+        return delete ? new DeletedColumn(name, value, ts) : new Column(name, 
value, ts);
     }
 }

Added: cassandra/trunk/src/java/org/apache/cassandra/db/DeletedColumn.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/DeletedColumn.java?rev=935087&view=auto
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/DeletedColumn.java (added)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/DeletedColumn.java Fri Apr 
16 22:04:11 2010
@@ -0,0 +1,58 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.db;
+
+import java.nio.ByteBuffer;
+
+import org.apache.cassandra.utils.FBUtilities;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DeletedColumn extends Column
+{
+    private static Logger logger = 
LoggerFactory.getLogger(DeletedColumn.class);
+    
+    public DeletedColumn(byte[] name, int localDeletionTime, long timestamp)
+    {
+        this(name, FBUtilities.toByteArray(localDeletionTime), timestamp);
+    }
+
+    public DeletedColumn(byte[] name, byte[] value, long ts)
+    {
+        super(name, value, ts);
+    }
+
+    @Override
+    public boolean isMarkedForDelete()
+    {
+        return true;
+    }
+
+    @Override
+    public long getMarkedForDeleteAt()
+    {
+        return timestamp;
+    }
+
+    @Override
+    public int getLocalDeletionTime()
+    {
+        return ByteBuffer.wrap(value()).getInt();
+    }
+}

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java?rev=935087&r1=935086&r2=935087&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java Fri Apr 
16 22:04:11 2010
@@ -183,9 +183,7 @@ public class RowMutation
         }
         else
         {
-            ByteBuffer bytes = ByteBuffer.allocate(4);
-            bytes.putInt(localDeleteTime);
-            columnFamily.addColumn(path, bytes.array(), timestamp, true);
+            columnFamily.deleteColumn(path, localDeleteTime, timestamp);
         }
 
         modifications_.put(cfName, columnFamily);

Modified: cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableImport.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableImport.java?rev=935087&r1=935086&r2=935087&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableImport.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableImport.java Fri 
Apr 16 22:04:11 2010
@@ -88,7 +88,11 @@ public class SSTableImport
         {
             JsonColumn col = new JsonColumn(c);
             QueryPath path = new QueryPath(cfamily.name(), null, 
hexToBytes(col.name));
-            cfamily.addColumn(path, hexToBytes(col.value), col.timestamp, 
col.isDeleted);
+            if (col.isDeleted) {
+                cfamily.addColumn(path, hexToBytes(col.value), col.timestamp);
+            } else {
+                cfamily.addTombstone(path, hexToBytes(col.value), 
col.timestamp);
+            }
         }
     }
     
@@ -112,7 +116,11 @@ public class SSTableImport
             {
                 JsonColumn col = new JsonColumn(c);
                 QueryPath path = new QueryPath(cfamily.name(), superName, 
hexToBytes(col.name));
-                cfamily.addColumn(path, hexToBytes(col.value), col.timestamp, 
col.isDeleted);
+                if (col.isDeleted) {
+                    cfamily.addColumn(path, hexToBytes(col.value), 
col.timestamp);
+                } else {
+                    cfamily.addTombstone(path, hexToBytes(col.value), 
col.timestamp);
+                }
             }
             
             SuperColumn superColumn = 
(SuperColumn)cfamily.getColumn(superName);

Modified: 
cassandra/trunk/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/tools/SSTableExportTest.java?rev=935087&r1=935086&r2=935087&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/tools/SSTableExportTest.java 
(original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/tools/SSTableExportTest.java 
Fri Apr 16 22:04:11 2010
@@ -64,14 +64,14 @@ public class SSTableExportTest extends S
         SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, 
partitioner);
         
         // Add rowA
-        cfamily.addColumn(new QueryPath("Standard1", null, "colA".getBytes()), 
"valA".getBytes(), 1, false);
+        cfamily.addColumn(new QueryPath("Standard1", null, "colA".getBytes()), 
"valA".getBytes(), 1);
         ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
         writer.append(Util.dk("rowA"), dob);
         dob.reset();
         cfamily.clear();
         
         // Add rowB
-        cfamily.addColumn(new QueryPath("Standard1", null, "colB".getBytes()), 
"valB".getBytes(), 1, false);
+        cfamily.addColumn(new QueryPath("Standard1", null, "colB".getBytes()), 
"valB".getBytes(), 1);
         ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
         writer.append(Util.dk("rowB"), dob);
         dob.reset();
@@ -102,21 +102,21 @@ public class SSTableExportTest extends S
         SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, 
partitioner);
         
         // Add rowA
-        cfamily.addColumn(new QueryPath("Standard1", null, "colA".getBytes()), 
"valA".getBytes(), 1, false);
+        cfamily.addColumn(new QueryPath("Standard1", null, "colA".getBytes()), 
"valA".getBytes(), 1);
         ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
         writer.append(Util.dk("rowA"), dob);
         dob.reset();
         cfamily.clear();
         
         // Add rowB
-        cfamily.addColumn(new QueryPath("Standard1", null, "colB".getBytes()), 
"valB".getBytes(), 1, false);
+        cfamily.addColumn(new QueryPath("Standard1", null, "colB".getBytes()), 
"valB".getBytes(), 1);
         ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
         writer.append(Util.dk("rowB"), dob);
         dob.reset();
         cfamily.clear();
 
         // Add rowExclude
-        cfamily.addColumn(new QueryPath("Standard1", null, "colX".getBytes()), 
"valX".getBytes(), 1, false);
+        cfamily.addColumn(new QueryPath("Standard1", null, "colX".getBytes()), 
"valX".getBytes(), 1);
         ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
         writer.append(Util.dk("rowExclude"), dob);
         dob.reset();
@@ -152,21 +152,21 @@ public class SSTableExportTest extends S
         SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, 
partitioner);
         
         // Add rowA
-        cfamily.addColumn(new QueryPath("Super4", "superA".getBytes(), 
"colA".getBytes()), "valA".getBytes(), 1, false);
+        cfamily.addColumn(new QueryPath("Super4", "superA".getBytes(), 
"colA".getBytes()), "valA".getBytes(), 1);
         ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
         writer.append(Util.dk("rowA"), dob);
         dob.reset();
         cfamily.clear();
         
         // Add rowB
-        cfamily.addColumn(new QueryPath("Super4", "superB".getBytes(), 
"colB".getBytes()), "valB".getBytes(), 1, false);
+        cfamily.addColumn(new QueryPath("Super4", "superB".getBytes(), 
"colB".getBytes()), "valB".getBytes(), 1);
         ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
         writer.append(Util.dk("rowB"), dob);
         dob.reset();
         cfamily.clear();
 
         // Add rowExclude
-        cfamily.addColumn(new QueryPath("Super4", "superX".getBytes(), 
"colX".getBytes()), "valX".getBytes(), 1, false);
+        cfamily.addColumn(new QueryPath("Super4", "superX".getBytes(), 
"colX".getBytes()), "valX".getBytes(), 1);
         ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
         writer.append(Util.dk("rowExclude"), dob);
         dob.reset();
@@ -200,14 +200,14 @@ public class SSTableExportTest extends S
         SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, 
partitioner);
         
         // Add rowA
-        cfamily.addColumn(new QueryPath("Standard1", null, "name".getBytes()), 
"val".getBytes(), 1, false);
+        cfamily.addColumn(new QueryPath("Standard1", null, "name".getBytes()), 
"val".getBytes(), 1);
         ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
         writer.append(Util.dk("rowA"), dob);
         dob.reset();
         cfamily.clear();
 
         // Add rowExclude
-        cfamily.addColumn(new QueryPath("Standard1", null, "name".getBytes()), 
"val".getBytes(), 1, false);
+        cfamily.addColumn(new QueryPath("Standard1", null, "name".getBytes()), 
"val".getBytes(), 1);
         ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
         writer.append(Util.dk("rowExclude"), dob);
         dob.reset();


Reply via email to