Author: xedin
Date: Wed Nov 30 21:18:27 2011
New Revision: 1208796

URL: http://svn.apache.org/viewvc?rev=1208796&view=rev
Log:
(CQL) INSERT/UPDATE/DELETE/TRUNCATE commands should allow CF names to be 
qualified by keyspace
patch by Pavel Yaskevich; reviewed by Paul Cannon for CASSANDRA-3419

Modified:
    cassandra/branches/cassandra-1.0/CHANGES.txt
    
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/AbstractModification.java
    cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/Cql.g
    
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/DeleteStatement.java
    
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/QueryProcessor.java
    
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/UpdateStatement.java

Modified: cassandra/branches/cassandra-1.0/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/CHANGES.txt?rev=1208796&r1=1208795&r2=1208796&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0/CHANGES.txt (original)
+++ cassandra/branches/cassandra-1.0/CHANGES.txt Wed Nov 30 21:18:27 2011
@@ -3,6 +3,8 @@
  * filter out unavailable cipher suites when using encryption (CASSANDRA-3178)
  * (HADOOP) add old-style api support for CFIF and CFRR (CASSANDRA-2799)
  * Support TimeUUIDType column names in Stress.java tool (CASSANDRA-3541)
+ * (CQL) INSERT/UPDATE/DELETE/TRUNCATE commands should allow CF names to
+   be qualified by keyspace (CASSANDRA-3419)
 
 
 1.0.5

Modified: 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/AbstractModification.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/AbstractModification.java?rev=1208796&r1=1208795&r2=1208796&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/AbstractModification.java
 (original)
+++ 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/AbstractModification.java
 Wed Nov 30 21:18:27 2011
@@ -31,19 +31,21 @@ public abstract class AbstractModificati
 {
     public static final ConsistencyLevel defaultConsistency = 
ConsistencyLevel.ONE;
 
+    protected final String keyspace;
     protected final String columnFamily;
     protected final ConsistencyLevel cLevel;
     protected final Long timestamp;
     protected final int timeToLive;
     protected final String keyName;
 
-    public AbstractModification(String columnFamily, String keyAlias, 
Attributes attrs)
+    public AbstractModification(String keyspace, String columnFamily, String 
keyAlias, Attributes attrs)
     {
-        this(columnFamily, keyAlias, attrs.getConsistencyLevel(), 
attrs.getTimestamp(), attrs.getTimeToLive());
+        this(keyspace, columnFamily, keyAlias, attrs.getConsistencyLevel(), 
attrs.getTimestamp(), attrs.getTimeToLive());
     }
 
-    public AbstractModification(String columnFamily, String keyAlias, 
ConsistencyLevel cLevel, Long timestamp, int timeToLive)
+    public AbstractModification(String keyspace, String columnFamily, String 
keyAlias, ConsistencyLevel cLevel, Long timestamp, int timeToLive)
     {
+        this.keyspace = keyspace;
         this.columnFamily = columnFamily;
         this.cLevel = cLevel;
         this.timestamp = timestamp;
@@ -51,6 +53,11 @@ public abstract class AbstractModificati
         this.keyName = keyAlias.toUpperCase();
     }
 
+    public String getKeyspace()
+    {
+        return keyspace;
+    }
+
     public String getColumnFamily()
     {
         return columnFamily;

Modified: 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/Cql.g
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/Cql.g?rev=1208796&r1=1208795&r2=1208796&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/Cql.g 
(original)
+++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/Cql.g 
Wed Nov 30 21:18:27 2011
@@ -33,6 +33,7 @@ options {
     import java.util.Collections;
     import java.util.List;
     import java.util.ArrayList;
+    import org.apache.cassandra.utils.Pair;
     import org.apache.cassandra.thrift.ConsistencyLevel;
     import org.apache.cassandra.thrift.InvalidRequestException;
 
@@ -115,7 +116,7 @@ query returns [CQLStatement stmnt]
     | updateStatement endStmnt { $stmnt = new 
CQLStatement(StatementType.UPDATE, $updateStatement.expr); }
     | batchStatement { $stmnt = new CQLStatement(StatementType.BATCH, 
$batchStatement.expr); }
     | useStatement      { $stmnt = new CQLStatement(StatementType.USE, 
$useStatement.keyspace); }
-    | truncateStatement { $stmnt = new CQLStatement(StatementType.TRUNCATE, 
$truncateStatement.cfam); }
+    | truncateStatement { $stmnt = new CQLStatement(StatementType.TRUNCATE, 
$truncateStatement.cf); }
     | deleteStatement endStmnt { $stmnt = new 
CQLStatement(StatementType.DELETE, $deleteStatement.expr); }
     | createKeyspaceStatement { $stmnt = new 
CQLStatement(StatementType.CREATE_KEYSPACE, $createKeyspaceStatement.expr); }
     | createColumnFamilyStatement { $stmnt = new 
CQLStatement(StatementType.CREATE_COLUMNFAMILY, 
$createColumnFamilyStatement.expr); }
@@ -219,13 +220,13 @@ insertStatement returns [UpdateStatement
           List<Term> columnNames  = new ArrayList<Term>();
           List<Term> columnValues = new ArrayList<Term>();
       }
-      K_INSERT K_INTO columnFamily=( IDENT | STRING_LITERAL | INTEGER )
+      K_INSERT K_INTO (keyspace=(IDENT | STRING_LITERAL | INTEGER) '.')? 
columnFamily=( IDENT | STRING_LITERAL | INTEGER )
           '(' key_alias=term ( ',' column_name=term  { 
columnNames.add($column_name.item); } )+ ')'
         K_VALUES
           '(' key=term ( ',' column_value=term { 
columnValues.add($column_value.item); })+ ')'
         ( usingClause[attrs] )?
       {
-          return new UpdateStatement($columnFamily.text, key_alias.getText(), 
columnNames, columnValues, Collections.singletonList(key), attrs);
+          return new UpdateStatement($keyspace.text, $columnFamily.text, 
key_alias.getText(), columnNames, columnValues, Collections.singletonList(key), 
attrs);
       }
     ;
 
@@ -311,14 +312,14 @@ updateStatement returns [UpdateStatement
           Map<Term, Operation> columns = new HashMap<Term, Operation>();
           List<Term> keyList = null;
       }
-      K_UPDATE columnFamily=( IDENT | STRING_LITERAL | INTEGER )
+      K_UPDATE (keyspace=(IDENT | STRING_LITERAL | INTEGER) '.')? 
columnFamily=( IDENT | STRING_LITERAL | INTEGER )
           ( usingClause[attrs] )?
           K_SET termPairWithOperation[columns] (',' 
termPairWithOperation[columns])*
           K_WHERE ( key_alias=term ('=' key=term { keyList = 
Collections.singletonList(key); }
                                     |
                                     K_IN '(' keys=termList { keyList = 
$keys.items; } ')' ))
       {
-          return new UpdateStatement($columnFamily.text, key_alias.getText(), 
columns, keyList, attrs);
+          return new UpdateStatement($keyspace.text, $columnFamily.text, 
key_alias.getText(), columns, keyList, attrs);
       }
     ;
 
@@ -340,13 +341,13 @@ deleteStatement returns [DeleteStatement
       }
       K_DELETE
           ( cols=termList { columnsList = $cols.items; })?
-          K_FROM columnFamily=( IDENT | STRING_LITERAL | INTEGER )
+          K_FROM (keyspace=(IDENT | STRING_LITERAL | INTEGER) '.')? 
columnFamily=( IDENT | STRING_LITERAL | INTEGER )
           ( usingClauseDelete[attrs] )?
           ( K_WHERE key_alias=term ('=' key=term           { keyList = 
Collections.singletonList(key); }
                                    | K_IN '(' keys=termList { keyList = 
$keys.items; } ')')
                   )?
       {
-          return new DeleteStatement(columnsList, $columnFamily.text, 
key_alias.getText(), keyList, attrs);
+          return new DeleteStatement(columnsList, $keyspace.text, 
$columnFamily.text, key_alias.getText(), keyList, attrs);
       }
     ;
 
@@ -481,8 +482,8 @@ relation returns [Relation rel]
     ;
 
 // TRUNCATE <CF>;
-truncateStatement returns [String cfam]
-    : K_TRUNCATE columnFamily=( IDENT | STRING_LITERAL | INTEGER ) { $cfam = 
$columnFamily.text; } endStmnt
+truncateStatement returns [Pair<String,String> cf]
+    : K_TRUNCATE (keyspace=( IDENT | STRING_LITERAL | INTEGER ) '.')? 
columnFamily=( IDENT | STRING_LITERAL | INTEGER ) { $cf = new Pair<String, 
String>($keyspace.text, $columnFamily.text); } endStmnt
     ;
 
 endStmnt

Modified: 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/DeleteStatement.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/DeleteStatement.java?rev=1208796&r1=1208795&r2=1208796&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/DeleteStatement.java
 (original)
+++ 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/DeleteStatement.java
 Wed Nov 30 21:18:27 2011
@@ -46,9 +46,9 @@ public class DeleteStatement extends Abs
     private List<Term> columns;
     private List<Term> keys;
     
-    public DeleteStatement(List<Term> columns, String columnFamily, String 
keyName, List<Term> keys, Attributes attrs)
+    public DeleteStatement(List<Term> columns, String keyspace, String 
columnFamily, String keyName, List<Term> keys, Attributes attrs)
     {
-        super(columnFamily, keyName, attrs);
+        super(keyspace, columnFamily, keyName, attrs);
 
         this.columns = columns;
         this.keys = keys;
@@ -118,8 +118,9 @@ public class DeleteStatement extends Abs
 
     public String toString()
     {
-        return String.format("DeleteStatement(columns=%s, columnFamily=%s, 
consistency=%s keys=%s)",
+        return String.format("DeleteStatement(columns=%s, keyspace=%s, 
columnFamily=%s, consistency=%s keys=%s)",
                              columns,
+                             keyspace,
                              columnFamily,
                              cLevel,
                              keys);

Modified: 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/QueryProcessor.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/QueryProcessor.java?rev=1208796&r1=1208795&r2=1208796&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/QueryProcessor.java
 (original)
+++ 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/QueryProcessor.java
 Wed Nov 30 21:18:27 2011
@@ -53,6 +53,7 @@ import org.apache.cassandra.thrift.*;
 import org.apache.cassandra.thrift.Column;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.Pair;
 
 import com.google.common.base.Predicates;
 import com.google.common.collect.Maps;
@@ -265,16 +266,18 @@ public class QueryProcessor
     private static void batchUpdate(ClientState clientState, 
List<UpdateStatement> updateStatements, ConsistencyLevel consistency)
     throws InvalidRequestException, UnavailableException, TimedOutException
     {
-        String keyspace = clientState.getKeyspace();
+        String globalKeyspace = clientState.getKeyspace();
         List<IMutation> rowMutations = new ArrayList<IMutation>();
         List<String> cfamsSeen = new ArrayList<String>();
 
         for (UpdateStatement update : updateStatements)
         {
+            String keyspace = update.keyspace == null ? globalKeyspace : 
update.keyspace;
+
             // Avoid unnecessary authorizations.
             if (!(cfamsSeen.contains(update.getColumnFamily())))
             {
-                clientState.hasColumnFamilyAccess(update.getColumnFamily(), 
Permission.WRITE);
+                clientState.hasColumnFamilyAccess(keyspace, 
update.getColumnFamily(), Permission.WRITE);
                 cfamsSeen.add(update.getColumnFamily());
             }
 
@@ -705,13 +708,15 @@ public class QueryProcessor
                 return result;
             
             case TRUNCATE:
-                String columnFamily = (String)statement.statement;
-                validateColumnFamily(keyspace, columnFamily);
-                clientState.hasColumnFamilyAccess(columnFamily, 
Permission.WRITE);
+                Pair<String, String> columnFamily = (Pair<String, 
String>)statement.statement;
+                keyspace = columnFamily.left == null ? 
clientState.getKeyspace() : columnFamily.left;
+
+                validateColumnFamily(keyspace, columnFamily.right);
+                clientState.hasColumnFamilyAccess(keyspace, 
columnFamily.right, Permission.WRITE);
                 
                 try
                 {
-                    StorageProxy.truncateBlocking(keyspace, columnFamily);
+                    StorageProxy.truncateBlocking(keyspace, 
columnFamily.right);
                 }
                 catch (TimeoutException e)
                 {
@@ -727,6 +732,9 @@ public class QueryProcessor
             
             case DELETE:
                 DeleteStatement delete = (DeleteStatement)statement.statement;
+
+                keyspace = delete.keyspace == null ? clientState.getKeyspace() 
: delete.keyspace;
+
                 try
                 {
                     StorageProxy.mutate(delete.prepareRowMutations(keyspace, 
clientState), delete.getConsistencyLevel());

Modified: 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/UpdateStatement.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/UpdateStatement.java?rev=1208796&r1=1208795&r2=1208796&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/UpdateStatement.java
 (original)
+++ 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/UpdateStatement.java
 Wed Nov 30 21:18:27 2011
@@ -37,7 +37,6 @@ import org.apache.cassandra.thrift.Inval
 
 import static org.apache.cassandra.cql.QueryProcessor.validateColumn;
 
-import static org.apache.cassandra.cql.Operation.OperationType;
 import static 
org.apache.cassandra.thrift.ThriftValidation.validateColumnFamily;
 import static 
org.apache.cassandra.thrift.ThriftValidation.validateCommutativeForWrite;
 
@@ -54,20 +53,22 @@ public class UpdateStatement extends Abs
     /**
      * Creates a new UpdateStatement from a column family name, columns map, 
consistency
      * level, and key term.
-     * 
+     *
+     * @param keyspace Keyspace (optional)
      * @param columnFamily column family name
      * @param keyName alias key name
      * @param columns a map of column name/values pairs
      * @param keys the keys to update
      * @param attrs additional attributes for statement (CL, timestamp, 
timeToLive)
      */
-    public UpdateStatement(String columnFamily,
+    public UpdateStatement(String keyspace,
+                           String columnFamily,
                            String keyName,
                            Map<Term, Operation> columns,
                            List<Term> keys,
                            Attributes attrs)
     {
-        super(columnFamily, keyName, attrs);
+        super(keyspace, columnFamily, keyName, attrs);
 
         this.columns = columns;
         this.keys = keys;
@@ -77,7 +78,8 @@ public class UpdateStatement extends Abs
      * Creates a new UpdateStatement from a column family name, a consistency 
level,
      * key, and lists of column names and values.  It is intended for use with 
the
      * alternate update format, <code>INSERT</code>.
-     * 
+     *
+     * @param keyspace Keyspace (optional)
      * @param columnFamily column family name
      * @param keyName alias key name
      * @param columnNames list of column names
@@ -85,14 +87,15 @@ public class UpdateStatement extends Abs
      * @param keys the keys to update
      * @param attrs additional attributes for statement (CL, timestamp, 
timeToLive)
      */
-    public UpdateStatement(String columnFamily,
+    public UpdateStatement(String keyspace,
+                           String columnFamily,
                            String keyName,
                            List<Term> columnNames,
                            List<Term> columnValues,
                            List<Term> keys,
                            Attributes attrs)
     {
-        super(columnFamily, keyName, attrs);
+        super(keyspace, columnFamily, keyName, attrs);
 
         this.columnNames = columnNames;
         this.columnValues = columnValues;
@@ -266,7 +269,8 @@ public class UpdateStatement extends Abs
     
     public String toString()
     {
-        return String.format("UpdateStatement(columnFamily=%s, keys=%s, 
columns=%s, consistency=%s, timestamp=%s, timeToLive=%s)",
+        return String.format("UpdateStatement(keyspace=%s, columnFamily=%s, 
keys=%s, columns=%s, consistency=%s, timestamp=%s, timeToLive=%s)",
+                             keyspace,
                              columnFamily,
                              keys,
                              columns,


Reply via email to