Author: jbellis
Date: Fri Dec 10 16:29:37 2010
New Revision: 1044422

URL: http://svn.apache.org/viewvc?rev=1044422&view=rev
Log:
add TTL support to CLI
patch by Pavel Yaskevich; reviewed by Sylvain Lebresne for CASSANDRA-1838

Modified:
    cassandra/branches/cassandra-0.7/CHANGES.txt
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/Cli.g
    
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java
    
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliUserHelp.java
    
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/cli/CliTest.java

Modified: cassandra/branches/cassandra-0.7/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/CHANGES.txt?rev=1044422&r1=1044421&r2=1044422&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.7/CHANGES.txt Fri Dec 10 16:29:37 2010
@@ -4,6 +4,7 @@ dev
  * infer org.apache.cassandra.locator for replication strategy classes
    when not otherwise specified
  * validation that generates less garbage (CASSANDRA-1814)
+ * add TTL support to CLI (CASSANDRA-1838)
 
 
 0.7.0-rc2

Modified: 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/Cli.g
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/Cli.g?rev=1044422&r1=1044421&r2=1044422&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/Cli.g 
(original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/Cli.g 
Fri Dec 10 16:29:37 2010
@@ -240,8 +240,8 @@ typeIdentifier
     ;
 
 setStatement
-    : SET columnFamilyExpr '=' value 
-        -> ^(NODE_THRIFT_SET columnFamilyExpr value)
+    : SET columnFamilyExpr '=' objectValue=value (WITH TTL '=' ttlValue=value)?
+        -> ^(NODE_THRIFT_SET columnFamilyExpr $objectValue ( $ttlValue )?)
     ;
 
 countStatement
@@ -525,6 +525,7 @@ LIST:       'LIST';
 LIMIT:      'LIMIT';
 TRUNCATE:   'TRUNCATE';
 ASSUME:     'ASSUME';
+TTL:        'TTL';
 
 IP_ADDRESS 
     : IntegerLiteral '.' IntegerLiteral '.' IntegerLiteral '.' IntegerLiteral

Modified: 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java?rev=1044422&r1=1044421&r2=1044422&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java
 Fri Dec 10 16:29:37 2010
@@ -319,8 +319,9 @@ public class CliClient extends CliUserHe
                 for (Column col : superColumn.getColumns())
                 {
                     validator = getValidatorForValue(cfDef, col.getName());
-                    sessionState.out.printf("%n     (column=%s, value=%s, 
timestamp=%d)", formatSubcolumnName(keyspace, columnFamily, col),
-                                    validator.getString(col.value), 
col.timestamp);
+                    sessionState.out.printf("%n     (column=%s, value=%s, 
timestamp=%d%s)", formatSubcolumnName(keyspace, columnFamily, col),
+                                                    
validator.getString(col.value), col.timestamp,
+                                                    col.isSetTtl() ? 
String.format(", ttl=%d", col.getTtl()) : "");
                 }
                 
                 sessionState.out.println(")");
@@ -329,8 +330,9 @@ public class CliClient extends CliUserHe
             {
                 Column column = cosc.column;
                 validator = getValidatorForValue(cfDef, column.getName());
-                sessionState.out.printf("=> (column=%s, value=%s, 
timestamp=%d)%n", formatColumnName(keyspace, columnFamily, column),
-                                validator.getString(column.value), 
column.timestamp);
+                sessionState.out.printf("=> (column=%s, value=%s, 
timestamp=%d%s)%n", formatColumnName(keyspace, columnFamily, column),
+                                                
validator.getString(column.value), column.timestamp,
+                                                column.isSetTtl() ? 
String.format(", ttl=%d", column.getTtl()) : "");
             }
         }
         
@@ -453,8 +455,9 @@ public class CliClient extends CliUserHe
         }
 
         // print results
-        sessionState.out.printf("=> (column=%s, value=%s, timestamp=%d)%n",
-                                formatColumnName(keySpace, columnFamily, 
column), valueAsString, column.timestamp);
+        sessionState.out.printf("=> (column=%s, value=%s, timestamp=%d%s)%n",
+                                formatColumnName(keySpace, columnFamily, 
column), valueAsString, column.timestamp,
+                                column.isSetTtl() ? String.format(", ttl=%d", 
column.getTtl()) : "");
     }
 
     /**
@@ -612,10 +615,30 @@ public class CliClient extends CliUserHe
         if(superColumnName != null)
             parent.setSuper_column(superColumnName);
 
-        // do the insert
-        thriftClient.insert(getKeyAsBytes(columnFamily, keyTree), parent, new 
Column(columnName, columnValueInBytes,
-                FBUtilities.timestampMicros()), ConsistencyLevel.ONE);
+        Column columnToInsert = new Column(columnName, columnValueInBytes, 
FBUtilities.timestampMicros());
         
+        // children count = 3 mean that we have ttl in arguments
+        if (statement.getChildCount() == 3)
+        {
+            String ttl = statement.getChild(2).getText();
+
+            try
+            {
+                columnToInsert.setTtl(Integer.valueOf(ttl));
+            }
+            catch (NumberFormatException e)
+            {
+                sessionState.err.println(String.format("TTL '%s' is invalid, 
should be a positive integer.", ttl));
+                return;
+            }
+            catch (Exception e)
+            {
+                throw new RuntimeException(e.getMessage());
+            }
+        }
+
+        // do the insert
+        thriftClient.insert(getKeyAsBytes(columnFamily, keyTree), parent, 
columnToInsert, ConsistencyLevel.ONE);
         sessionState.out.println("Value inserted.");
     }
 
@@ -1814,8 +1837,9 @@ public class CliClient extends CliUserHe
                     Column col = columnOrSuperColumn.column;
                     validator = getValidatorForValue(columnFamilyDef, 
col.getName());
 
-                    sessionState.out.printf("=> (column=%s, value=%s, 
timestamp=%d)%n",
-                                    formatColumnName(keySpace, 
columnFamilyName, col), validator.getString(col.value), col.timestamp);
+                    sessionState.out.printf("=> (column=%s, value=%s, 
timestamp=%d%s)%n",
+                                    formatColumnName(keySpace, 
columnFamilyName, col), validator.getString(col.value), col.timestamp,
+                                    col.isSetTtl() ? String.format(", ttl=%d", 
col.getTtl()) : "");
                 }
                 else if (columnOrSuperColumn.super_column != null)
                 {
@@ -1826,8 +1850,9 @@ public class CliClient extends CliUserHe
                     {
                         validator = getValidatorForValue(columnFamilyDef, 
col.getName());
 
-                        sessionState.out.printf("%n     (column=%s, value=%s, 
timestamp=%d)",
-                                        formatSubcolumnName(keySpace, 
columnFamilyName, col), validator.getString(col.value), col.timestamp);
+                        sessionState.out.printf("%n     (column=%s, value=%s, 
timestamp=%d%s)",
+                                        formatSubcolumnName(keySpace, 
columnFamilyName, col), validator.getString(col.value), col.timestamp,
+                                        col.isSetTtl() ? String.format(", 
ttl=%d", col.getTtl()) : "");
                     }
 
                     sessionState.out.println(")");

Modified: 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliUserHelp.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliUserHelp.java?rev=1044422&r1=1044421&r2=1044422&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliUserHelp.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliUserHelp.java
 Fri Dec 10 16:29:37 2010
@@ -248,12 +248,15 @@ public class CliUserHelp {
                 state.out.println("set <cf>['<key>']['<col>'] = 
<function>(<argument>);");
                 state.out.println("set <cf>['<key>']['<super>']['<col>'] = 
<function>(<argument>);");
                 state.out.println("set <cf>[<key>][<function>(<col>)] = 
<value> || <function>;");
+                state.out.println("set <cf>[<key>][<function>(<col>) || <col>] 
= <value> || <function> with ttl = <secs>;");
                 state.out.println("Available functions: " + 
CliClient.Function.getFunctionNames() + "\n");
                 state.out.println("examples:");
                 state.out.println("set bar['testkey']['my super']['test 
col']='this is a test';");
                 state.out.println("set baz['testkey']['test col']='this is 
also a test';");
                 state.out.println("set diz[testkey][testcol] = utf8('this is 
utf8 string.');");
                 state.out.println("set bar[testkey][timeuuid()] = utf('hello 
world');");
+                state.out.println("set bar[testkey][timeuuid()] = utf('hello 
world') with ttl = 30;");
+                state.out.println("set diz[testkey][testcol] = 'this is utf8 
string.' with ttl = 150;");
                 break;
 
             case CliParser.NODE_THRIFT_DEL:
@@ -339,8 +342,8 @@ public class CliUserHelp {
             state.out.println("get <cf> where <column> = <value> [and <column> 
> <value> and ...] [limit int];  ");
             state.out.println("get <cf>['<key>']['<col>'] (as <type>)*;        
              Get a column value.");
             state.out.println("get <cf>['<key>']['<super>']['<col>'] (as 
<type>)*;       Get a sub column value.");
-            state.out.println("set <cf>['<key>']['<col>'] = <value>;           
                    Set a column.");
-            state.out.println("set <cf>['<key>']['<super>']['<col>'] = 
<value>;                Set a sub column.");
+            state.out.println("set <cf>['<key>']['<col>'] = <value> (with ttl 
= <secs>)*;          Set a column.");
+            state.out.println("set <cf>['<key>']['<super>']['<col>'] = <value> 
(with ttl = <secs>)*;   Set a sub column.");
             state.out.println("del <cf>['<key>'];                              
                   Delete record.");
             state.out.println("del <cf>['<key>']['<col>'];                     
                   Delete column.");
             state.out.println("del <cf>['<key>']['<super>']['<col>'];          
               Delete sub column.");

Modified: 
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/cli/CliTest.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/cli/CliTest.java?rev=1044422&r1=1044421&r2=1044422&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/cli/CliTest.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/cli/CliTest.java
 Fri Dec 10 16:29:37 2010
@@ -99,6 +99,8 @@ public class CliTest extends CleanupHelp
         "get CF7[3][lexicaluuid(550e8400-e29b-41d4-a716-446655440000)];",
         "get sCf1['hello'][1][9999];",
         "set sCf1['hello'][1][9999] = 938;",
+        "set sCf1['hello'][1][9999] = 938 with ttl = 30;",
+        "set sCf1['hello'][1][9999] = 938 with ttl = 560;",
         "list sCf1;",
         "del SCF1['hello'][1][9999];",
         "assume sCf1 comparator as utf8;",


Reply via email to