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;