@@ -842,11 +842,20 @@ def setUp(self):
842842 v int )'''
843843 self .session .execute (ddl )
844844
845+ ddl = '''
846+ CREATE TABLE test3rf.lwt_clustering (
847+ k int,
848+ c int,
849+ v int,
850+ PRIMARY KEY (k, c))'''
851+ self .session .execute (ddl )
852+
845853 def tearDown (self ):
846854 """
847855 Shutdown cluster
848856 """
849857 self .session .execute ("DROP TABLE test3rf.lwt" )
858+ self .session .execute ("DROP TABLE test3rf.lwt_clustering" )
850859 self .cluster .shutdown ()
851860
852861 def test_no_connection_refused_on_timeout (self ):
@@ -892,6 +901,119 @@ def test_no_connection_refused_on_timeout(self):
892901 # Make sure test passed
893902 self .assertTrue (received_timeout )
894903
904+ def test_was_applied_batch_stmt (self ):
905+ """
906+ Test to ensure `:attr:cassandra.cluster.ResultSet.was_applied` works as expected
907+ with Batchstatements.
908+
909+ For both type of batches verify was_applied has the correct result
910+ under different scenarios:
911+ - If on LWT fails the rest of the statements fail including normal UPSERTS
912+ - If on LWT fails the rest of the statements fail
913+ - All the queries succeed
914+
915+ @since 3.14
916+ @jira_ticket PYTHON-848
917+ @expected_result `:attr:cassandra.cluster.ResultSet.was_applied` is updated as
918+ expected
919+
920+ @test_category query
921+ """
922+ for batch_type in (BatchType .UNLOGGED , BatchType .LOGGED ):
923+ batch_statement = BatchStatement (batch_type )
924+ batch_statement .add_all (["INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 0, 10);" ,
925+ "INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 1, 10);" ,
926+ "INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 2, 10);" ], [None ] * 3 )
927+ result = self .session .execute (batch_statement )
928+ #self.assertTrue(result.was_applied)
929+
930+ # Should fail since (0, 0, 10) have already been written
931+ # The non conditional insert shouldn't be written as well
932+ batch_statement = BatchStatement (batch_type )
933+ batch_statement .add_all (["INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 0, 10) IF NOT EXISTS;" ,
934+ "INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 3, 10) IF NOT EXISTS;" ,
935+ "INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 4, 10);" ,
936+ "INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 5, 10) IF NOT EXISTS;" ], [None ] * 4 )
937+ result = self .session .execute (batch_statement )
938+ self .assertFalse (result .was_applied )
939+
940+ all_rows = self .session .execute ("SELECT * from test3rf.lwt_clustering" )
941+ # Verify the non conditional insert hasn't been inserted
942+ self .assertEqual (len (all_rows .current_rows ), 3 )
943+
944+ # Should fail since (0, 0, 10) have already been written
945+ batch_statement = BatchStatement (batch_type )
946+ batch_statement .add_all (["INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 0, 10) IF NOT EXISTS;" ,
947+ "INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 3, 10) IF NOT EXISTS;" ,
948+ "INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 5, 10) IF NOT EXISTS;" ], [None ] * 3 )
949+ result = self .session .execute (batch_statement )
950+ self .assertFalse (result .was_applied )
951+
952+ # Should fail since (0, 0, 10) have already been written
953+ batch_statement .add ("INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 0, 10) IF NOT EXISTS;" )
954+ result = self .session .execute (batch_statement )
955+ self .assertFalse (result .was_applied )
956+
957+ # Should succeed
958+ batch_statement = BatchStatement (batch_type )
959+ batch_statement .add_all (["INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 3, 10) IF NOT EXISTS;" ,
960+ "INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 4, 10) IF NOT EXISTS;" ,
961+ "INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 5, 10) IF NOT EXISTS;" ], [None ] * 3 )
962+
963+ result = self .session .execute (batch_statement )
964+ self .assertTrue (result .was_applied )
965+
966+ all_rows = self .session .execute ("SELECT * from test3rf.lwt_clustering" )
967+ for i , row in enumerate (all_rows ):
968+ self .assertEqual ((0 , i , 10 ), (row [0 ], row [1 ], row [2 ]))
969+
970+ self .session .execute ("TRUNCATE TABLE test3rf.lwt_clustering" )
971+
972+ def test_empty_batch_statement (self ):
973+ """
974+ Test to ensure `:attr:cassandra.cluster.ResultSet.was_applied` works as expected
975+ with empty Batchstatements.
976+
977+ @since 3.14
978+ @jira_ticket PYTHON-848
979+ @expected_result an Exception is raised
980+ expected
981+
982+ @test_category query
983+ """
984+ batch_statement = BatchStatement ()
985+ results = self .session .execute (batch_statement )
986+ with self .assertRaises (RuntimeError ):
987+ results .was_applied
988+
989+ @unittest .skip ("Skipping until PYTHON-943 is resolved" )
990+ def test_was_applied_batch_string (self ):
991+ batch_statement = BatchStatement (BatchType .LOGGED )
992+ batch_statement .add_all (["INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 0, 10);" ,
993+ "INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 1, 10);" ,
994+ "INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 2, 10);" ], [None ] * 3 )
995+ self .session .execute (batch_statement )
996+
997+ batch_str = """
998+ BEGIN unlogged batch
999+ INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 0, 10) IF NOT EXISTS;
1000+ INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 1, 10) IF NOT EXISTS;
1001+ INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 2, 10) IF NOT EXISTS;
1002+ APPLY batch;
1003+ """
1004+ result = self .session .execute (batch_str )
1005+ self .assertFalse (result .was_applied )
1006+
1007+ batch_str = """
1008+ BEGIN unlogged batch
1009+ INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 3, 10) IF NOT EXISTS;
1010+ INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 4, 10) IF NOT EXISTS;
1011+ INSERT INTO test3rf.lwt_clustering (k, c, v) VALUES (0, 5, 10) IF NOT EXISTS;
1012+ APPLY batch;
1013+ """
1014+ result = self .session .execute (batch_str )
1015+ self .assertTrue (result .was_applied )
1016+
8951017
8961018class BatchStatementDefaultRoutingKeyTests (unittest .TestCase ):
8971019 # Test for PYTHON-126: BatchStatement.add() should set the routing key of the first added prepared statement
0 commit comments