Author: jbellis
Date: Tue Apr 27 18:45:49 2010
New Revision: 938601
URL: http://svn.apache.org/viewvc?rev=938601&view=rev
Log:
allow null predicates in Deletions. patch by Sylvain Lebresne; reviewed by
jbellis for CASSANDRA-1027
Modified:
cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
cassandra/trunk/test/system/test_thrift_server.py
Modified:
cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java?rev=938601&r1=938600&r2=938601&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
Tue Apr 27 18:45:49 2010
@@ -260,11 +260,6 @@ public class ThriftValidation
public static void validateDeletion(String keyspace, String cfName,
Deletion del) throws InvalidRequestException
{
- if (del.super_column == null && del.predicate == null)
- {
- throw new InvalidRequestException("A Deletion must have a
SuperColumn, a SlicePredicate or both.");
- }
-
if (del.predicate != null)
{
validateSlicePredicate(keyspace, cfName, del.super_column,
del.predicate);
Modified: cassandra/trunk/test/system/test_thrift_server.py
URL:
http://svn.apache.org/viewvc/cassandra/trunk/test/system/test_thrift_server.py?rev=938601&r1=938600&r2=938601&view=diff
==============================================================================
--- cassandra/trunk/test/system/test_thrift_server.py (original)
+++ cassandra/trunk/test/system/test_thrift_server.py Tue Apr 27 18:45:49 2010
@@ -395,6 +395,24 @@ class TestMutations(ThriftTester):
for key in keys:
_assert_no_columnpath(key, ColumnPath(column_family,
column=c.name))
+ def test_batch_mutate_remove_standard_row(self):
+ _empty_login('Keyspace1')
+ column_families = ['Standard1', 'Standard2']
+ keys = ['key_%d' % i for i in range(11,21)]
+ _insert_multi(keys)
+
+ mutations = [Mutation(deletion=Deletion(20))]
+ mutation_map = dict((column_family, mutations) for column_family in
column_families)
+
+ keyed_mutations = dict((key, mutation_map) for key in keys)
+
+ client.batch_mutate(keyed_mutations, ConsistencyLevel.ONE)
+
+ for column_family in column_families:
+ for c in _SIMPLE_COLUMNS:
+ for key in keys:
+ _assert_no_columnpath(key, ColumnPath(column_family,
column=c.name))
+
def test_batch_mutate_remove_super_columns_with_standard_under(self):
_empty_login('Keyspace1')
column_families = ['Super1', 'Super2']
@@ -448,6 +466,33 @@ class TestMutations(ThriftTester):
for c in sc.columns:
for key in keys:
waitfor(ZERO_WAIT, _assert_no_columnpath, key,
ColumnPath('Super1', super_column=sc.name))
+
+ def test_batch_mutate_remove_super_columns_entire_row(self):
+ _empty_login('Keyspace1')
+
+ keys = ['key_%d' % i for i in range(17,21)]
+
+ for key in keys:
+ _insert_super(key)
+
+ mutations = []
+
+ mutations.append(Mutation(deletion=Deletion(20)))
+
+ mutation_map = {'Super1': mutations}
+
+ keyed_mutations = dict((key, mutation_map) for key in keys)
+
+ # Sanity check
+ for sc in _SUPER_COLUMNS:
+ for key in keys:
+ _assert_columnpath_exists(key, ColumnPath('Super1',
super_column=sc.name))
+
+ client.batch_mutate(keyed_mutations, ConsistencyLevel.ZERO)
+
+ for sc in _SUPER_COLUMNS:
+ for key in keys:
+ waitfor(ZERO_WAIT, _assert_no_columnpath, key,
ColumnPath('Super1', super_column=sc.name))
def test_batch_mutate_insertions_and_deletions(self):
_empty_login('Keyspace1')
@@ -503,13 +548,6 @@ class TestMutations(ThriftTester):
super_column='sc1',
column=c))
- def test_batch_mutate_validates_deletions(self):
- _empty_login('Keyspace1')
- def empty_deletion():
- client.batch_mutate({'key_33': {'Standard1':
[Mutation(deletion=Deletion(2))]}},
- ConsistencyLevel.ONE)
- _expect_exception(empty_deletion, InvalidRequestException)
-
def
test_batch_mutate_does_not_accept_cosc_and_deletion_in_same_mutation(self):
def too_full():
_empty_login('Keyspace1')
@@ -996,6 +1034,7 @@ class TestMutations(ThriftTester):
_expect_missing(lambda: client.get('key1', ColumnPath('Super1',
'sc1'), ConsistencyLevel.ONE))
def test_super_reinsert(self):
+ _empty_login('Keyspace1')
for x in xrange(3):
client.insert('key1', ColumnParent('Super1', 'sc2'),
Column(_i64(x), 'value', 1), ConsistencyLevel.ONE)
@@ -1081,6 +1120,7 @@ class TestMutations(ThriftTester):
def test_simple_expiration(self):
""" Test that column ttled do expires """
+ _empty_login('Keyspace1')
column = Column('cttl3', 'value1', 0, 2)
client.insert('key1', ColumnParent('Standard1'), column,
ConsistencyLevel.ONE)
time.sleep(1)
@@ -1092,6 +1132,7 @@ class TestMutations(ThriftTester):
def test_update_expiring(self):
""" Test that updating a column with ttl override the ttl """
+ _empty_login('Keyspace1')
column1 = Column('cttl4', 'value1', 0, 1)
client.insert('key1', ColumnParent('Standard1'), column1,
ConsistencyLevel.ONE)
column2 = Column('cttl4', 'value1', 1)
@@ -1101,6 +1142,7 @@ class TestMutations(ThriftTester):
def test_remove_expiring(self):
""" Test removing a column with ttl """
+ _empty_login('Keyspace1')
column = Column('cttl5', 'value1', 0, 10)
client.insert('key1', ColumnParent('Standard1'), column,
ConsistencyLevel.ONE)
client.remove('key1', ColumnPath('Standard1', column='cttl5'), 1,
ConsistencyLevel.ONE)