You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2010/10/14 22:59:04 UTC
svn commit: r1022706 - in /cassandra/trunk: CHANGES.txt
src/java/org/apache/cassandra/cli/Cli.g
src/java/org/apache/cassandra/cli/CliClient.java
Author: jbellis
Date: Thu Oct 14 20:59:04 2010
New Revision: 1022706
URL: http://svn.apache.org/viewvc?rev=1022706&view=rev
Log:
add cli support for get_range_slices.
patch by Jim Ancona; reviewed by jbellis for CASSANDRA-1088
Modified:
cassandra/trunk/CHANGES.txt
cassandra/trunk/src/java/org/apache/cassandra/cli/Cli.g
cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java
Modified: cassandra/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1022706&r1=1022705&r2=1022706&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Thu Oct 14 20:59:04 2010
@@ -38,6 +38,7 @@ dev
avoid synchronization bottleneck (CASSANDRA-1481)
* PropertyFileSnitch configuration file renamed to
cassandra-topology.properties
+ * add cli support for get_range_slices (CASSANDRA-1088)
0.7-beta2
Modified: cassandra/trunk/src/java/org/apache/cassandra/cli/Cli.g
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cli/Cli.g?rev=1022706&r1=1022705&r2=1022706&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cli/Cli.g (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cli/Cli.g Thu Oct 14 20:59:04 2010
@@ -55,6 +55,7 @@ tokens {
NODE_UPDATE_KEYSPACE;
NODE_RENAME_COLUMN_FAMILY;
NODE_UPDATE_COLUMN_FAMILY;
+ NODE_LIST;
// Internal Nodes.
NODE_COLUMN_ACCESS;
@@ -65,6 +66,9 @@ tokens {
ARRAY;
HASH;
PAIR;
+
+ NODE_LIMIT;
+ NODE_KEY_RANGE_ACCESS;
}
@parser::header {
@@ -117,6 +121,7 @@ statement
| helpStatement
| setStatement
| showStatement
+ | listStatement
| -> ^(NODE_NO_OP)
;
@@ -170,6 +175,8 @@ helpStatement
-> ^(NODE_HELP NODE_THRIFT_DEL)
| K_HELP K_COUNT
-> ^(NODE_HELP NODE_THRIFT_COUNT)
+ | K_HELP K_LIST
+ -> ^(NODE_HELP NODE_LIST)
| K_HELP
-> ^(NODE_HELP)
| '?'
@@ -207,6 +214,15 @@ showStatement
| showTables
;
+listStatement
+ : K_LIST keyRangeExpr limitClause?
+ -> ^(NODE_LIST keyRangeExpr limitClause?)
+ ;
+
+limitClause
+ : K_LIMIT^ IntegerLiteral
+ ;
+
showClusterName
: K_SHOW K_CLUSTER K_NAME
-> ^(NODE_SHOW_CLUSTER_NAME)
@@ -315,6 +331,11 @@ columnFamilyExpr
-> ^(NODE_COLUMN_ACCESS columnFamily rowKey ($a+)?)
;
+keyRangeExpr
+ : columnFamily '[' startKey ':' endKey ']' ('[' columnOrSuperColumn ']')?
+ -> ^(NODE_KEY_RANGE_ACCESS columnFamily startKey endKey columnOrSuperColumn?)
+ ;
+
table: Identifier;
columnName: Identifier;
@@ -351,6 +372,10 @@ rowKey: (Identifier | StringLiteral);
value: (Identifier | IntegerLiteral | StringLiteral);
+startKey: (Identifier | StringLiteral);
+
+endKey: (Identifier | StringLiteral);
+
columnOrSuperColumn: (Identifier | IntegerLiteral | StringLiteral);
host: id+=Identifier (id+=DOT id+=Identifier)* -> ^(NODE_ID_LIST $id+);
@@ -395,6 +420,8 @@ K_FAMILY: 'FAMILY';
K_WITH: 'WITH';
K_AND: 'AND';
K_UPDATE: 'UPDATE';
+K_LIST: 'LIST';
+K_LIMIT: 'LIMIT';
// private syntactic rules
fragment
Modified: cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java?rev=1022706&r1=1022705&r2=1022706&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java Thu Oct 14 20:59:04 2010
@@ -22,6 +22,7 @@ import java.math.BigInteger;
import java.util.*;
import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang.StringUtils;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.Tree;
@@ -145,6 +146,9 @@ public class CliClient
case CliParser.NODE_CONNECT:
executeConnect(ast);
break;
+ case CliParser.NODE_LIST:
+ executeList(ast);
+ break;
case CliParser.NODE_NO_OP:
// comment lines come here; they are treated as no ops.
break;
@@ -376,6 +380,14 @@ public class CliClient
css_.out.println("count bar['testkey']['my super']");
css_.out.println("count baz['testkey']");
break;
+
+ case CliParser.NODE_LIST:
+ css_.out.println("list <cf>['<startKey>':'<endKey']\n");
+ css_.out.println("list <cf>['<startKey>':'<endKey'] limit M\n");
+ css_.out.println("list <cf>['<startKey>':'<endKey']['<super>']\n");
+ css_.out.println("list <cf>['<startKey>':'<endKey']['<super>'] limit M\n");
+ css_.out.println("List a range of rows in the column or supercolumn family.\n");
+ break;
default:
css_.out.println("?");
@@ -419,6 +431,9 @@ public class CliClient
css_.out.println("del <cf>['<key>']['<super>']['<col>'] Delete sub column.");
css_.out.println("count <cf>['<key>'] Count columns in record.");
css_.out.println("count <cf>['<key>']['<super>'] Count columns in a super column.");
+ css_.out.println("list <cf>['<startKey>':'<endKey'] List rows in the column family.");
+ css_.out.println("list <cf>['<startKey>':'<endKey']['<super>'] List the super column across rows.");
+ css_.out.println("list ... limit N Limit the list results to N.");
}
}
@@ -1041,6 +1056,104 @@ public class CliClient
css_.out.println(thriftClient_.system_rename_column_family(columnName, columnNewName));
}
+ private void executeList(CommonTree ast)
+ throws TException, InvalidRequestException, NotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException, UnavailableException, TimedOutException, UnsupportedEncodingException
+ {
+ if (!CliMain.isConnected())
+ return;
+
+ // AST check
+ assert (ast.getChildCount() == 1 || ast.getChildCount() == 2) : "Incorrect AST Construct!";
+
+ CommonTree keyRangeSpec = (CommonTree) ast.getChild(0);
+ assert (keyRangeSpec.getType() == CliParser.NODE_KEY_RANGE_ACCESS);
+
+ // extract key range, column family, and super column name
+ String columnFamily = keyRangeSpec.getChild(0).getText();
+ String startKey = CliUtils.unescapeSQLString(keyRangeSpec.getChild(1).getText());
+ String endKey = CliUtils.unescapeSQLString(keyRangeSpec.getChild(2).getText());
+
+ String superColumnName = null;
+ if (keyRangeSpec.getChildCount() == 4)
+ {
+ superColumnName = CliUtils.unescapeSQLString(keyRangeSpec.getChild(3).getText());
+ }
+
+ // extract LIMIT clause
+ int limitCount = Integer.MAX_VALUE;
+ if (ast.getChildCount() == 2)
+ {
+ CommonTree limitSpec = (CommonTree) ast.getChild(1);
+ assert (limitSpec.getType() == CliParser.NODE_LIMIT);
+ limitCount = Integer.parseInt(limitSpec.getChild(0).getText());
+ }
+ assert (limitCount > 0) : "Limit count should be > 0!";
+
+ List<String> cfnames = new ArrayList<String>();
+ for (CfDef cfd : keyspacesMap.get(keySpace).cf_defs)
+ {
+ cfnames.add(cfd.name);
+ }
+
+ int idx = cfnames.indexOf(columnFamily);
+ if (idx == -1)
+ {
+ css_.out.println("No such column family: " + columnFamily);
+ return;
+ }
+
+ // read all columns and superColumns
+ SlicePredicate predicate = new SlicePredicate();
+ SliceRange sliceRange = new SliceRange();
+ sliceRange.setStart(new byte[0]).setFinish(new byte[0]);
+ predicate.setSlice_range(sliceRange);
+
+ // set the key range
+ KeyRange range = new KeyRange(10);
+ range.setStart_key(startKey.getBytes()).setEnd_key(endKey.getBytes());
+
+ ColumnParent columnParent = new ColumnParent(columnFamily);
+ if (StringUtils.isNotBlank(superColumnName))
+ {
+ columnParent.setSuper_column(superColumnName.getBytes());
+ }
+
+ List<KeySlice> keySlices = thriftClient_.get_range_slices(columnParent, predicate, range, ConsistencyLevel.ONE);
+ int toIndex = keySlices.size();
+ if (limitCount < keySlices.size()) // limitCount could be Integer.MAX_VALUE
+ toIndex = limitCount;
+ List<KeySlice> limitSlices = keySlices.subList(0, toIndex);
+
+ for (KeySlice ks : limitSlices)
+ {
+ css_.out.printf("-------------------\nRowKey: %s\n", new String(ks.key, "UTF-8"));
+ Iterator<ColumnOrSuperColumn> iterator = ks.getColumnsIterator();
+ while (iterator.hasNext())
+ {
+ ColumnOrSuperColumn columnOrSuperColumn = iterator.next();
+ if (columnOrSuperColumn.column != null)
+ {
+ Column col = columnOrSuperColumn.column;
+ css_.out.printf("=> (column=%s, value=%s, timestamp=%d)\n",
+ formatColumnName(keySpace, columnFamily, col), new String(col.value, "UTF-8"), col.timestamp);
+ }
+ else if (columnOrSuperColumn.super_column != null)
+ {
+ SuperColumn superCol = columnOrSuperColumn.super_column;
+ css_.out.printf("=> (super_column=%s,", formatSuperColumnName(keySpace, columnFamily, superCol));
+ for (Column col : superCol.columns)
+ {
+ css_.out.printf("\n (column=%s, value=%s, timestamp=%d)",
+ formatSubcolumnName(keySpace, columnFamily, col), new String(col.value, "UTF-8"), col.timestamp);
+ }
+ css_.out.println(")");
+ }
+ }
+ }
+
+ css_.out.printf("\n%d Row%s Returned.\n", limitSlices.size(), (limitSlices.size() > 1 ? "s" : ""));
+ }
+
private void executeShowVersion() throws TException
{
if (!CliMain.isConnected())