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)