Author: jbellis
Date: Mon Nov 29 19:36:08 2010
New Revision: 1040241

URL: http://svn.apache.org/viewvc?rev=1040241&view=rev
Log:
add ExpiringColumn support to sstable import/export
patch by Sylvain Lebresne; reviewed by jbellis for CASSANDRA-1754

Modified:
    cassandra/branches/cassandra-0.7/CHANGES.txt
    
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableExport.java
    
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableImport.java
    cassandra/branches/cassandra-0.7/test/resources/SimpleCF.json
    
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
    
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableImportTest.java

Modified: cassandra/branches/cassandra-0.7/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/CHANGES.txt?rev=1040241&r1=1040240&r2=1040241&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.7/CHANGES.txt Mon Nov 29 19:36:08 2010
@@ -17,6 +17,7 @@ dev
  * Validate that column names in column_metadata are valid for the
    defined comparator, and decode properly in cli (CASSANDRA-1773)
  * use cross-platform newlines in cli (CASSANDRA-1786)
+ * add ExpiringColumn support to sstable import/export (CASSANDRA-1754)
 
 
 0.7.0-rc1

Modified: 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableExport.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableExport.java?rev=1040241&r1=1040240&r2=1040241&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableExport.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableExport.java
 Mon Nov 29 19:36:08 2010
@@ -31,6 +31,7 @@ import org.apache.cassandra.config.Datab
 import org.apache.cassandra.db.ColumnFamily;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.IColumn;
+import org.apache.cassandra.db.ExpiringColumn;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.io.sstable.*;
@@ -95,6 +96,12 @@ public class SSTableExport
             json.append(column.timestamp());
             json.append(", ");
             json.append(column.isMarkedForDelete());
+            if (column instanceof ExpiringColumn) {
+              json.append(", ");
+              json.append(((ExpiringColumn)column).getTimeToLive());
+              json.append(", ");
+              json.append(((ExpiringColumn)column).getLocalDeletionTime());
+            }
             json.append("]");
             if (iter.hasNext())
                 json.append(", ");

Modified: 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableImport.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableImport.java?rev=1040241&r1=1040240&r2=1040241&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableImport.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableImport.java
 Mon Nov 29 19:36:08 2010
@@ -28,6 +28,7 @@ import org.apache.cassandra.config.Confi
 import org.apache.cassandra.db.ColumnFamily;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.SuperColumn;
+import org.apache.cassandra.db.ExpiringColumn;
 import org.apache.cassandra.db.ColumnFamilyType;
 import org.apache.cassandra.db.filter.QueryPath;
 import org.apache.cassandra.dht.IPartitioner;
@@ -68,15 +69,22 @@ public class SSTableImport
         private String value;
         private long timestamp;
         private boolean isDeleted;
+        private int ttl;
+        private int localExpirationTime;
         
         private JsonColumn(Object obj) throws ClassCastException
         {
             JSONArray colSpec = (JSONArray)obj;
-            assert colSpec.size() == 4;
+            assert colSpec.size() == 4 || colSpec.size() == 6;
             name = (String)colSpec.get(0);
             value = (String)colSpec.get(1);
             timestamp = (Long)colSpec.get(2);
             isDeleted = (Boolean)colSpec.get(3);
+            if (colSpec.size() == 6)
+            {
+                ttl = (int)(long)((Long)colSpec.get(4));
+                localExpirationTime = (int)(long)((Long)colSpec.get(5));
+            }
         }
     }
 
@@ -94,9 +102,16 @@ public class SSTableImport
         {
             JsonColumn col = new JsonColumn(c);
             QueryPath path = new QueryPath(cfm.cfName, null, 
ByteBuffer.wrap(hexToBytes(col.name)));
-            if (col.isDeleted) {
+            if (col.ttl > 0)
+            {
+                cfamily.addColumn(null, new 
ExpiringColumn(ByteBuffer.wrap(hexToBytes(col.name)), 
ByteBuffer.wrap(hexToBytes(col.value)), col.timestamp, col.ttl, 
col.localExpirationTime));
+            }
+            else if (col.isDeleted)
+            {
                 cfamily.addTombstone(path, 
ByteBuffer.wrap(hexToBytes(col.value)), col.timestamp);
-            } else {
+            }
+            else
+            {
                 cfamily.addColumn(path, 
ByteBuffer.wrap(hexToBytes(col.value)), col.timestamp);
             }
         }
@@ -124,9 +139,16 @@ public class SSTableImport
             {
                 JsonColumn col = new JsonColumn(c);
                 QueryPath path = new QueryPath(cfm.cfName, superName, 
ByteBuffer.wrap(hexToBytes(col.name)));
-                if (col.isDeleted) {
+                if (col.ttl > 0)
+                {
+                    cfamily.addColumn(superName, new 
ExpiringColumn(ByteBuffer.wrap(hexToBytes(col.name)), 
ByteBuffer.wrap(hexToBytes(col.value)), col.timestamp, col.ttl, 
col.localExpirationTime));
+                }
+                else if (col.isDeleted)
+                {
                     cfamily.addTombstone(path, 
ByteBuffer.wrap(hexToBytes(col.value)), col.timestamp);
-                } else {
+                }
+                else
+                {
                     cfamily.addColumn(path, 
ByteBuffer.wrap(hexToBytes(col.value)), col.timestamp);
                 }
             }

Modified: cassandra/branches/cassandra-0.7/test/resources/SimpleCF.json
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/resources/SimpleCF.json?rev=1040241&r1=1040240&r2=1040241&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/test/resources/SimpleCF.json (original)
+++ cassandra/branches/cassandra-0.7/test/resources/SimpleCF.json Mon Nov 29 
19:36:08 2010
@@ -1,4 +1,4 @@
 {
- "726f7741": [["636f6c4141", "76616c4141", 1, false], ["636f6c4142", 
"76616c4142", 1, false]],
+ "726f7741": [["636f6c4141", "76616c4141", 1, false], ["636f6c4142", 
"76616c4142", 1, false], ["636f6c4143", "76616c4143", 1, false, 42, 2000000000 
]],
  "726f7742": [["636f6c4241", "76616c4241", 1, false], ["636f6c4242", 
"76616c4242", 1, false]]
 }

Modified: 
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableExportTest.java?rev=1040241&r1=1040240&r2=1040241&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
 Mon Nov 29 19:36:08 2010
@@ -28,6 +28,7 @@ import java.util.Arrays;
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamily;
+import org.apache.cassandra.db.ExpiringColumn;
 import org.apache.cassandra.db.filter.QueryFilter;
 import org.apache.cassandra.db.filter.QueryPath;
 import org.apache.cassandra.dht.IPartitioner;
@@ -90,13 +91,16 @@ public class SSTableExportTest extends S
     }
 
     @Test
-    public void testExportSimpleCf() throws IOException    {
+    public void testExportSimpleCf() throws IOException
+    {
         File tempSS = tempSSTableFile("Keyspace1", "Standard1");
         ColumnFamily cfamily = ColumnFamily.create("Keyspace1", "Standard1");
         SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2);
         
+        int nowInSec = (int)(System.currentTimeMillis() / 1000);
         // Add rowA
         cfamily.addColumn(new QueryPath("Standard1", null, 
ByteBufferUtil.bytes("colA")), ByteBufferUtil.bytes("valA"), 1);
+        cfamily.addColumn(null, new 
ExpiringColumn(ByteBufferUtil.bytes("colExp"), ByteBufferUtil.bytes("valExp"), 
1, 42, nowInSec));
         writer.append(Util.dk("rowA"), cfamily);
         cfamily.clear();
         
@@ -121,6 +125,10 @@ public class SSTableExportTest extends S
         JSONArray rowA = (JSONArray)json.get(asHex("rowA"));
         JSONArray colA = (JSONArray)rowA.get(0);
         assert Arrays.equals(hexToBytes((String)colA.get(1)), 
"valA".getBytes());
+
+        JSONArray colExp = (JSONArray)rowA.get(1);
+        assert ((Long)colExp.get(4)) == 42;
+        assert ((Long)colExp.get(5)) == nowInSec;
         
         JSONArray rowB = (JSONArray)json.get(asHex("rowB"));
         JSONArray colB = (JSONArray)rowB.get(0);

Modified: 
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableImportTest.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableImportTest.java?rev=1040241&r1=1040240&r2=1040241&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableImportTest.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableImportTest.java
 Mon Nov 29 19:36:08 2010
@@ -27,9 +27,11 @@ import org.apache.cassandra.SchemaLoader
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamily;
 import org.apache.cassandra.db.DeletedColumn;
+import org.apache.cassandra.db.ExpiringColumn;
 import org.apache.cassandra.db.IColumn;
 import org.apache.cassandra.db.filter.QueryFilter;
 import org.apache.cassandra.db.filter.QueryPath;
+import org.apache.cassandra.db.columniterator.IColumnIterator;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.sstable.SSTableReader;
 import static org.apache.cassandra.utils.FBUtilities.hexToBytes;
@@ -41,6 +43,9 @@ import org.json.simple.parser.ParseExcep
 import org.junit.Test;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+
+import org.apache.cassandra.utils.FBUtilities;
+
 public class SSTableImportTest extends SchemaLoader
 {   
     @Test
@@ -53,10 +58,16 @@ public class SSTableImportTest extends S
 
         // Verify results
         SSTableReader reader = 
SSTableReader.open(Descriptor.fromFilename(tempSS.getPath()));
-        QueryFilter qf = QueryFilter.getNamesFilter(Util.dk("rowA"), new 
QueryPath("Standard1", null, null), ByteBufferUtil.bytes("colAA"));
-        ColumnFamily cf = 
qf.getSSTableColumnIterator(reader).getColumnFamily();
+        QueryFilter qf = QueryFilter.getIdentityFilter(Util.dk("rowA"), new 
QueryPath("Standard1"));
+        IColumnIterator iter = qf.getSSTableColumnIterator(reader);
+        ColumnFamily cf = iter.getColumnFamily();
+        while (iter.hasNext()) cf.addColumn(iter.next());
         assert 
cf.getColumn(ByteBufferUtil.bytes("colAA")).value().equals(ByteBuffer.wrap(hexToBytes("76616c4141")));
         assert !(cf.getColumn(ByteBufferUtil.bytes("colAA")) instanceof 
DeletedColumn);
+        IColumn expCol = cf.getColumn(ByteBufferUtil.bytes("colAC"));
+        assert 
expCol.value().equals(ByteBuffer.wrap(hexToBytes("76616c4143")));
+        assert expCol instanceof ExpiringColumn;
+        assert ((ExpiringColumn)expCol).getTimeToLive() == 42 && 
((ExpiringColumn)expCol).getLocalDeletionTime() == 2000000000;
     }
 
     @Test


Reply via email to