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