Author: eevans
Date: Wed Dec 2 18:32:25 2009
New Revision: 886238
URL: http://svn.apache.org/viewvc?rev=886238&view=rev
Log:
add count and del commands to CLI
Patch by gabriele renzi; reviewed by eevans for CASSANDRA-594
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/cli/Cli.g
incubator/cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/cli/Cli.g
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/cli/Cli.g?rev=886238&r1=886237&r2=886238&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/cli/Cli.g (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/cli/Cli.g Wed Dec
2 18:32:25 2009
@@ -45,6 +45,8 @@
NODE_SHOW_TABLES;
NODE_THRIFT_GET;
NODE_THRIFT_SET;
+ NODE_THRIFT_COUNT;
+ NODE_THRIFT_DEL;
// Internal Nodes.
NODE_COLUMN_ACCESS;
@@ -69,7 +71,9 @@
stmt
: connectStmt
| exitStmt
+ | countStmt
| describeTable
+ | delStmt
| getStmt
| helpStmt
| setStmt
@@ -100,6 +104,14 @@
: K_SET columnFamilyExpr '=' value -> ^(NODE_THRIFT_SET columnFamilyExpr
value)
;
+countStmt
+ : K_COUNT columnFamilyExpr -> ^(NODE_THRIFT_COUNT columnFamilyExpr)
+ ;
+
+delStmt
+ : K_DEL columnFamilyExpr -> ^(NODE_THRIFT_DEL columnFamilyExpr)
+ ;
+
showStmt
: showClusterName
| showVersion
@@ -162,7 +174,9 @@
//
K_CONFIG: 'CONFIG';
K_CONNECT: 'CONNECT';
+K_COUNT: 'COUNT';
K_CLUSTER: 'CLUSTER';
+K_DEL: 'DEL';
K_DESCRIBE: 'DESCRIBE';
K_GET: 'GET';
K_HELP: 'HELP';
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java?rev=886238&r1=886237&r2=886238&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java
(original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java
Wed Dec 2 18:32:25 2009
@@ -59,6 +59,12 @@
case CliParser.NODE_THRIFT_SET:
executeSet(ast);
break;
+ case CliParser.NODE_THRIFT_DEL:
+ executeDelete(ast);
+ break;
+ case CliParser.NODE_THRIFT_COUNT:
+ executeCount(ast);
+ break;
case CliParser.NODE_SHOW_CLUSTER_NAME:
executeShowProperty(ast, "cluster name");
break;
@@ -102,6 +108,9 @@
css_.out.println("get <tbl>.<cf>['<rowKey>']
Get a slice of columns.");
css_.out.println("get <tbl>.<cf>['<rowKey>']['<colKey>']
Get a column value.");
css_.out.println("set <tbl>.<cf>['<rowKey>']['<colKey>'] = '<value>'
Set a column.");
+ css_.out.println("count <tbl>.<cf>['<rowKey>']
Count columns in row.");
+ css_.out.println("del <tbl>.<cf>['<rowKey>']
Delete row.");
+ css_.out.println("del <tbl>.<cf>['<rowKey>']['<colKey>']
Delete column.");
}
private void cleanupAndExit()
@@ -109,7 +118,78 @@
CliMain.disconnect();
System.exit(0);
}
+ private void executeCount(CommonTree ast) throws TException,
InvalidRequestException, UnavailableException, TimedOutException
+ {
+ if (!CliMain.isConnected())
+ return;
+
+ int childCount = ast.getChildCount();
+ assert(childCount == 1);
+
+ CommonTree columnFamilySpec = (CommonTree)ast.getChild(0);
+ assert(columnFamilySpec.getType() == CliParser.NODE_COLUMN_ACCESS);
+
+ String tableName = CliCompiler.getTableName(columnFamilySpec);
+ String key = CliCompiler.getKey(columnFamilySpec);
+ String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec);
+ int columnSpecCnt = CliCompiler.numColumnSpecifiers(columnFamilySpec);
+
+ if (columnSpecCnt == 0)
+ {
+ ColumnParent cp = new ColumnParent(columnFamily, null);
+ int count = thriftClient_.get_count(tableName, key, cp,
ConsistencyLevel.ONE);
+ css_.out.printf("%d columns\n", count);
+ }
+ else
+ {
+ //TODO could support sub columns?
+ css_.err.println("Only column count for a top level row key
supported");
+ return;
+ }
+ }
+
+ private void executeDelete(CommonTree ast) throws TException,
InvalidRequestException, UnavailableException, TimedOutException
+ {
+ if (!CliMain.isConnected())
+ return;
+
+ int childCount = ast.getChildCount();
+ assert(childCount == 1);
+
+ CommonTree columnFamilySpec = (CommonTree)ast.getChild(0);
+ assert(columnFamilySpec.getType() == CliParser.NODE_COLUMN_ACCESS);
+
+ String tableName = CliCompiler.getTableName(columnFamilySpec);
+ String key = CliCompiler.getKey(columnFamilySpec);
+ String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec);
+ int columnSpecCnt = CliCompiler.numColumnSpecifiers(columnFamilySpec);
+ // assume simple columnFamily for now
+ String columnName = null;
+ final byte[] name;
+ if (columnSpecCnt == 0)
+ {
+ // table.cf['key']
+ name = null;
+ }
+ else
+ {
+ assert columnSpecCnt == 1;
+ // table.cf['key']['column']
+ columnName = CliCompiler.getColumn(columnFamilySpec, 0);
+ try
+ {
+ name = columnName.getBytes("UTF-8");
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+ thriftClient_.remove(tableName, key, new ColumnPath(columnFamily,
null, name), System.currentTimeMillis(), ConsistencyLevel.ONE);
+ css_.out.println(String.format("%s removed.", (columnSpecCnt == 0) ?
"row" : "column"));
+ }
+
// Execute GET statement
private void executeGet(CommonTree ast) throws TException,
NotFoundException, InvalidRequestException, UnavailableException,
TimedOutException
{
@@ -132,7 +212,7 @@
{
// table.cf['key']
SliceRange range = new SliceRange(ArrayUtils.EMPTY_BYTE_ARRAY,
ArrayUtils.EMPTY_BYTE_ARRAY, true, 1000000);
- List<ColumnOrSuperColumn> columns =
thriftClient_.get_slice(tableName, key, new ColumnParent(columnFamily, null),
new SlicePredicate(null, range), ConsistencyLevel.ONE);
+ List<ColumnOrSuperColumn> columns =
thriftClient_.get_slice(tableName, key, new ColumnParent(columnFamily, null),
new SlicePredicate(null, range), ConsistencyLevel.ONE);
int size = columns.size();
for (ColumnOrSuperColumn cosc : columns)
{
@@ -217,7 +297,7 @@
/* for now (until we support batch sets) */
assert(false);
}
- }
+ }
private void executeShowProperty(CommonTree ast, String propertyName)
throws TException
{
@@ -268,7 +348,7 @@
String desc = columnMap.get("Desc");
String columnFamilyType = columnMap.get("Type");
String sort = columnMap.get("CompareWith");
- String flushperiod = columnMap.get("FlushPeriodInMinutes");
+ String flushperiod = columnMap.get("FlushPeriodInMinutes");
css_.out.println(desc);
css_.out.println("Column Family Type: " + columnFamilyType);
css_.out.println("Column Sorted By: " + sort);
@@ -283,7 +363,7 @@
}
// process a statement of the form: connect hostname/port
- private void executeConnect(CommonTree ast) throws TException
+ private void executeConnect(CommonTree ast)
{
int portNumber = Integer.parseInt(ast.getChild(1).getText());
Tree idList = ast.getChild(0);