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/31 17:47:20 UTC
svn commit: r1029407 - in
/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli: Cli.g
CliClient.java CliUserHelp.java
Author: jbellis
Date: Sun Oct 31 16:47:20 2010
New Revision: 1029407
URL: http://svn.apache.org/viewvc?rev=1029407&view=rev
Log:
Cli grammar refactoring and better error messages
patch by Pavel Yaskevich; reviewed by jbellis for CASSANDRA-1668
Modified:
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
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=1029407&r1=1029406&r2=1029407&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 Sun Oct 31 16:47:20 2010
@@ -42,7 +42,7 @@ tokens {
NODE_NO_OP;
NODE_SHOW_CLUSTER_NAME;
NODE_SHOW_VERSION;
- NODE_SHOW_TABLES;
+ NODE_SHOW_KEYSPACES;
NODE_THRIFT_GET;
NODE_THRIFT_GET_WITH_CONDITIONS;
NODE_THRIFT_SET;
@@ -87,7 +87,22 @@ package org.apache.cassandra.cli;
{
public void reportError(RecognitionException e)
{
- throw new RuntimeException("Syntax error at position " + e.charPositionInLine + ": " + this.getErrorMessage(e, this.getTokenNames()));
+ StringBuilder errorMessage = new StringBuilder("Syntax error at position " + e.charPositionInLine + ": ");
+
+ if (e instanceof NoViableAltException)
+ {
+ int index = e.charPositionInLine;
+ String error = this.input.substring(index, index);
+ String statement = this.input.substring(0, this.input.size() - 1);
+
+ errorMessage.append("unexpected \"" + error + "\" for `" + statement + "`.");
+ }
+ else
+ {
+ errorMessage.append(this.getErrorMessage(e, this.getTokenNames()));
+ }
+
+ throw new RuntimeException(errorMessage.toString());
}
}
@@ -95,7 +110,18 @@ package org.apache.cassandra.cli;
{
public void reportError(RecognitionException e)
{
- throw new RuntimeException("Syntax error at position " + e.charPositionInLine + ": " + this.getErrorMessage(e, this.getTokenNames()));
+ String errorMessage;
+
+ if (e instanceof NoViableAltException)
+ {
+ errorMessage = "Command not found: `" + this.input + "`. Type 'help' or '?' for help.";
+ }
+ else
+ {
+ errorMessage = "Syntax error at position " + e.charPositionInLine + ": " + this.getErrorMessage(e, this.getTokenNames());
+ }
+
+ throw new RuntimeException(errorMessage);
}
}
@@ -117,7 +143,7 @@ statement
| updateColumnFamily
| delColumnFamily
| delKeyspace
- | useTable
+ | useKeyspace
| delStatement
| getStatement
| helpStatement
@@ -129,70 +155,70 @@ statement
;
connectStatement
- : K_CONNECT host SLASH port
+ : CONNECT host '/' port
-> ^(NODE_CONNECT host port)
- | K_CONNECT ipaddr SLASH port
- -> ^(NODE_CONNECT ipaddr port)
+ | CONNECT ip_address '/' port
+ -> ^(NODE_CONNECT ip_address port)
;
helpStatement
- : K_HELP K_HELP
+ : HELP HELP
-> ^(NODE_HELP NODE_HELP)
- | K_HELP K_CONNECT
+ | HELP CONNECT
-> ^(NODE_HELP NODE_CONNECT)
- | K_HELP K_USE
+ | HELP USE
-> ^(NODE_HELP NODE_USE_TABLE)
- | K_HELP K_DESCRIBE K_TABLE
+ | HELP DESCRIBE KEYSPACE
-> ^(NODE_HELP NODE_DESCRIBE_TABLE)
- | K_HELP K_EXIT
+ | HELP EXIT
-> ^(NODE_HELP NODE_EXIT)
- | K_HELP K_QUIT
+ | HELP QUIT
-> ^(NODE_HELP NODE_EXIT)
- | K_HELP K_SHOW K_CLUSTER K_NAME
+ | HELP SHOW CLUSTER NAME
-> ^(NODE_HELP NODE_SHOW_CLUSTER_NAME)
- | K_HELP K_SHOW K_TABLES
- -> ^(NODE_HELP NODE_SHOW_TABLES)
- | K_HELP K_SHOW K_VERSION
+ | HELP SHOW KEYSPACES
+ -> ^(NODE_HELP NODE_SHOW_KEYSPACES)
+ | HELP SHOW VERSION
-> ^(NODE_HELP NODE_SHOW_VERSION)
- | K_HELP K_CREATE K_TABLE
+ | HELP CREATE KEYSPACE
-> ^(NODE_HELP NODE_ADD_KEYSPACE)
- | K_HELP K_UPDATE K_TABLE
+ | HELP UPDATE KEYSPACE
-> ^(NODE_HELP NODE_UPDATE_KEYSPACE)
- | K_HELP K_CREATE K_COLUMN K_FAMILY
+ | HELP CREATE COLUMN FAMILY
-> ^(NODE_HELP NODE_ADD_COLUMN_FAMILY)
- | K_HELP K_UPDATE K_COLUMN K_FAMILY
+ | HELP UPDATE COLUMN FAMILY
-> ^(NODE_HELP NODE_UPDATE_COLUMN_FAMILY)
- | K_HELP K_DROP K_TABLE
+ | HELP DROP KEYSPACE
-> ^(NODE_HELP NODE_DEL_KEYSPACE)
- | K_HELP K_DROP K_COLUMN K_FAMILY
+ | HELP DROP COLUMN FAMILY
-> ^(NODE_HELP NODE_DEL_COLUMN_FAMILY)
- | K_HELP K_GET
+ | HELP GET
-> ^(NODE_HELP NODE_THRIFT_GET)
- | K_HELP K_SET
+ | HELP SET
-> ^(NODE_HELP NODE_THRIFT_SET)
- | K_HELP K_DEL
+ | HELP DEL
-> ^(NODE_HELP NODE_THRIFT_DEL)
- | K_HELP K_COUNT
+ | HELP COUNT
-> ^(NODE_HELP NODE_THRIFT_COUNT)
- | K_HELP K_LIST
+ | HELP LIST
-> ^(NODE_HELP NODE_LIST)
- | K_HELP K_TRUNCATE
+ | HELP TRUNCATE
-> ^(NODE_HELP NODE_TRUNCATE)
- | K_HELP
+ | HELP
-> ^(NODE_HELP)
| '?'
-> ^(NODE_HELP)
;
exitStatement
- : K_QUIT -> ^(NODE_EXIT)
- | K_EXIT -> ^(NODE_EXIT)
+ : QUIT -> ^(NODE_EXIT)
+ | EXIT -> ^(NODE_EXIT)
;
getStatement
- : K_GET columnFamilyExpr ('AS' typeIdentifier)?
+ : GET columnFamilyExpr ('AS' typeIdentifier)?
-> ^(NODE_THRIFT_GET columnFamilyExpr ( ^(CONVERT_TO_TYPE typeIdentifier) )? )
- | K_GET columnFamily 'WHERE' getCondition ('AND' getCondition)* ('LIMIT' limit=IntegerLiteral)*
+ | GET columnFamily 'WHERE' getCondition ('AND' getCondition)* ('LIMIT' limit=IntegerLiteral)*
-> ^(NODE_THRIFT_GET_WITH_CONDITIONS columnFamily ^(CONDITIONS getCondition+) ^(NODE_LIMIT $limit)*)
;
@@ -210,99 +236,100 @@ typeIdentifier
;
setStatement
- : K_SET columnFamilyExpr '=' value
+ : SET columnFamilyExpr '=' value
-> ^(NODE_THRIFT_SET columnFamilyExpr value)
;
countStatement
- : K_COUNT columnFamilyExpr
+ : COUNT columnFamilyExpr
-> ^(NODE_THRIFT_COUNT columnFamilyExpr)
;
delStatement
- : K_DEL columnFamilyExpr
+ : DEL columnFamilyExpr
-> ^(NODE_THRIFT_DEL columnFamilyExpr)
;
showStatement
: showClusterName
| showVersion
- | showTables
+ | showKeyspaces
;
listStatement
- : K_LIST columnFamily keyRangeExpr? ('LIMIT' limit=IntegerLiteral)?
+ : LIST columnFamily keyRangeExpr? ('LIMIT' limit=IntegerLiteral)?
-> ^(NODE_LIST columnFamily keyRangeExpr? ^(NODE_LIMIT $limit)?)
;
truncateStatement
- : K_TRUNCATE columnFamily
+ : TRUNCATE columnFamily
-> ^(NODE_TRUNCATE columnFamily)
;
showClusterName
- : K_SHOW K_CLUSTER K_NAME
+ : SHOW CLUSTER NAME
-> ^(NODE_SHOW_CLUSTER_NAME)
;
addKeyspace
- : K_CREATE K_TABLE keyValuePairExpr
+ : CREATE KEYSPACE keyValuePairExpr
-> ^(NODE_ADD_KEYSPACE keyValuePairExpr)
;
addColumnFamily
- : K_CREATE K_COLUMN K_FAMILY keyValuePairExpr
+ : CREATE COLUMN FAMILY keyValuePairExpr
-> ^(NODE_ADD_COLUMN_FAMILY keyValuePairExpr)
;
updateKeyspace
- : K_UPDATE K_TABLE keyValuePairExpr
+ : UPDATE KEYSPACE keyValuePairExpr
-> ^(NODE_UPDATE_KEYSPACE keyValuePairExpr)
;
updateColumnFamily
- : K_UPDATE K_COLUMN K_FAMILY keyValuePairExpr
+ : UPDATE COLUMN FAMILY keyValuePairExpr
-> ^(NODE_UPDATE_COLUMN_FAMILY keyValuePairExpr)
;
delKeyspace
- : K_DROP K_TABLE keyspace
+ : DROP KEYSPACE keyspace
-> ^(NODE_DEL_KEYSPACE keyspace)
;
delColumnFamily
- : K_DROP K_COLUMN K_FAMILY columnFamily
+ : DROP COLUMN FAMILY columnFamily
-> ^(NODE_DEL_COLUMN_FAMILY columnFamily)
;
showVersion
- : K_SHOW K_VERSION
+ : SHOW VERSION
-> ^(NODE_SHOW_VERSION)
;
-showTables
- : K_SHOW K_TABLES
- -> ^(NODE_SHOW_TABLES)
+showKeyspaces
+ : SHOW KEYSPACES
+ -> ^(NODE_SHOW_KEYSPACES)
;
describeTable
- : K_DESCRIBE K_TABLE table
- -> ^(NODE_DESCRIBE_TABLE table)
+ : DESCRIBE KEYSPACE keyspace
+ -> ^(NODE_DESCRIBE_TABLE keyspace)
;
-useTable
- : K_USE table ( username )? ( password )?
- -> ^(NODE_USE_TABLE table ( username )? ( password )?)
+useKeyspace
+ : USE keyspace ( username )? ( password )?
+ -> ^(NODE_USE_TABLE keyspace ( username )? ( password )?)
;
keyValuePairExpr
- : objectName ( (K_AND | K_WITH) keyValuePair )*
+ : objectName ( (AND | WITH) keyValuePair )*
-> ^(NODE_NEW_KEYSPACE_ACCESS objectName ( keyValuePair )* )
;
keyValuePair
- : attr_name '=' attrValue -> attr_name attrValue
+ : attr_name '=' attrValue
+ -> attr_name attrValue
;
attrValue
@@ -328,58 +355,87 @@ hashElementPair
-> ^(PAIR rowKey value)
;
-
-
columnFamilyExpr
: columnFamily '[' rowKey ']'
- ( '[' a+=columnOrSuperColumn ']'
- ('[' a+=columnOrSuperColumn ']')?
+ ( '[' column=columnOrSuperColumn ']'
+ ('[' super_column=columnOrSuperColumn ']')?
)?
- -> ^(NODE_COLUMN_ACCESS columnFamily rowKey ($a+)?)
+ -> ^(NODE_COLUMN_ACCESS columnFamily rowKey ($column ($super_column)? )?)
;
keyRangeExpr
: '[' ( startKey? ':' endKey? )? ']'
-> ^(NODE_KEY_RANGE startKey? endKey?)
;
-
-table: Identifier;
-
-columnName: Identifier;
-attr_name: Identifier;
-
-attrValueString: (Identifier | StringLiteral);
+columnName
+ : Identifier
+ ;
+
+attr_name
+ : Identifier
+ ;
+
+attrValueString
+ : (Identifier | StringLiteral)
+ ;
-attrValueInt: IntegerLiteral;
-
-attrValueDouble: DoubleLiteral;
+attrValueInt
+ : IntegerLiteral
+ ;
+
+attrValueDouble
+ : DoubleLiteral
+ ;
-objectName: Identifier;
-
-keyspace: Identifier;
-
-replica_placement_strategy: StringLiteral;
-
-replication_factor: IntegerLiteral;
-
-keyspaceNewName: Identifier;
-
-comparator: StringLiteral;
+objectName
+ : Identifier
+ ;
+
+keyspace
+ : Identifier
+ ;
+
+replica_placement_strategy
+ : StringLiteral
+ ;
+
+replication_factor
+ : IntegerLiteral
+ ;
+
+keyspaceNewName
+ : Identifier
+ ;
+
+comparator
+ : StringLiteral
+ ;
-command: Identifier;
+command : Identifier
+ ;
-newColumnFamily: Identifier;
-
-username: Identifier;
-
-password: StringLiteral;
-
-columnFamily: Identifier;
-
-rowKey: (Identifier | StringLiteral);
-
-value: (Identifier | IntegerLiteral | StringLiteral | functionCall );
+newColumnFamily
+ : Identifier
+ ;
+
+username: Identifier
+ ;
+
+password: StringLiteral
+ ;
+
+columnFamily
+ : Identifier
+ ;
+
+rowKey
+ : (Identifier | StringLiteral)
+ ;
+
+value
+ : (Identifier | IntegerLiteral | StringLiteral | functionCall)
+ ;
functionCall
: functionName=Identifier '(' functionArgument ')'
@@ -390,17 +446,36 @@ functionArgument
: Identifier | StringLiteral | IntegerLiteral
;
-startKey: (Identifier | StringLiteral);
-
-endKey: (Identifier | StringLiteral);
-
-columnOrSuperColumn: (Identifier | IntegerLiteral | StringLiteral);
-
-host: id+=Identifier (id+=DOT id+=Identifier)* -> ^(NODE_ID_LIST $id+);
+startKey
+ : (Identifier | StringLiteral)
+ ;
+
+endKey
+ : (Identifier | StringLiteral)
+ ;
+
+columnOrSuperColumn
+ : (Identifier | IntegerLiteral | StringLiteral)
+ ;
+
+host
+ : host_name
+ -> ^(NODE_ID_LIST host_name)
+ ;
+
+host_name
+ : Identifier ('.' Identifier)*
+ ;
+
+ip_address
+ : IP_ADDRESS
+ -> ^(NODE_ID_LIST IP_ADDRESS)
+ ;
-ipaddr: id+=IntegerLiteral id+=DOT id+=IntegerLiteral id+=DOT id+=IntegerLiteral id+=DOT id+=IntegerLiteral -> ^(NODE_ID_LIST $id+);
-port: IntegerLiteral;
+port
+ : IntegerLiteral
+ ;
//
// Lexer Section
@@ -412,34 +487,38 @@ port: IntegerLiteral;
// CLI is case-insensitive with respect to these keywords.
// However, they MUST be listed in upper case here.
//
-K_CONFIG: 'CONFIG';
-K_CONNECT: 'CONNECT';
-K_COUNT: 'COUNT';
-K_CLUSTER: 'CLUSTER';
-K_DEL: 'DEL';
-K_DESCRIBE: 'DESCRIBE';
-K_USE: 'USE';
-K_GET: 'GET';
-K_HELP: 'HELP';
-K_EXIT: 'EXIT';
-K_FILE: 'FILE';
-K_NAME: 'NAME';
-K_QUIT: 'QUIT';
-K_SET: 'SET';
-K_SHOW: 'SHOW';
-K_TABLE: 'KEYSPACE';
-K_TABLES: 'KEYSPACES';
-K_VERSION: 'API VERSION';
-K_CREATE: 'CREATE';
-K_DROP: 'DROP';
-K_COLUMN: 'COLUMN';
-K_FAMILY: 'FAMILY';
-K_WITH: 'WITH';
-K_AND: 'AND';
-K_UPDATE: 'UPDATE';
-K_LIST: 'LIST';
-K_LIMIT: 'LIMIT';
-K_TRUNCATE: 'TRUNCATE';
+CONFIG: 'CONFIG';
+CONNECT: 'CONNECT';
+COUNT: 'COUNT';
+CLUSTER: 'CLUSTER';
+DEL: 'DEL';
+DESCRIBE: 'DESCRIBE';
+USE: 'USE';
+GET: 'GET';
+HELP: 'HELP';
+EXIT: 'EXIT';
+FILE: 'FILE';
+NAME: 'NAME';
+QUIT: 'QUIT';
+SET: 'SET';
+SHOW: 'SHOW';
+KEYSPACE: 'KEYSPACE';
+KEYSPACES: 'KEYSPACES';
+VERSION: 'API VERSION';
+CREATE: 'CREATE';
+DROP: 'DROP';
+COLUMN: 'COLUMN';
+FAMILY: 'FAMILY';
+WITH: 'WITH';
+AND: 'AND';
+UPDATE: 'UPDATE';
+LIST: 'LIST';
+LIMIT: 'LIMIT';
+TRUNCATE: 'TRUNCATE';
+
+IP_ADDRESS
+ : IntegerLiteral '.' IntegerLiteral '.' IntegerLiteral '.' IntegerLiteral
+ ;
// private syntactic rules
fragment
@@ -465,7 +544,7 @@ IntegerLiteral
;
DoubleLiteral
- : Digit+ DOT Digit+;
+ : Digit+ '.' Digit+;
Identifier
: (Letter | Alnum) (Alnum | '_' | '-' )*
@@ -481,14 +560,6 @@ StringLiteral
// syntactic elements
//
-DOT
- : '.'
- ;
-
-SLASH
- : '/'
- ;
-
SEMICOLON
: ';'
;
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=1029407&r1=1029406&r2=1029407&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 Sun Oct 31 16:47:20 2010
@@ -156,7 +156,7 @@ public class CliClient extends CliUserHe
case CliParser.NODE_SHOW_VERSION:
executeShowVersion();
break;
- case CliParser.NODE_SHOW_TABLES:
+ case CliParser.NODE_SHOW_KEYSPACES:
executeShowKeySpaces();
break;
case CliParser.NODE_DESCRIBE_TABLE:
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=1029407&r1=1029406&r2=1029407&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 Sun Oct 31 16:47:20 2010
@@ -119,7 +119,7 @@ public class CliUserHelp {
state.out.println("Displays the API version number.");
break;
- case CliParser.NODE_SHOW_TABLES:
+ case CliParser.NODE_SHOW_KEYSPACES:
state.out.println("show keyspaces\n");
state.out.println("Displays a list of the keyspaces available on the currently connected cluster.");
break;