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;",