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,