67
69
test_data_dynamic_fields = [
68
('fnum', 'decimal', '1', 1),
69
('fstr', 'text', '"fstr"', 'fstr'),
70
('fblb', 'blob', '"fblob"', 'fblob'),
71
('fsnum', 'set<decimal>', '[1,2,3]', {1, 2, 3}),
72
('fsstr', 'set<text>', '["fa","fb","fc"]', {'fa', 'fb', 'fc'}),
73
('fsblob', 'set<blob>', '["fblob1", "fblob2"]', {'fblob1', 'fblob2'})
70
('fnum', 'decimal', binascii.hexlify(json.dumps('1')), 1),
71
('fstr', 'text', binascii.hexlify(json.dumps('fstr')), 'fstr'),
72
('fblb', 'blob', binascii.hexlify(json.dumps('fblob')), 'fblob'),
73
('fsnum', 'set<decimal>',
74
binascii.hexlify(json.dumps(['1', '2', '3'])), {1, 2, 3}),
75
('fsstr', 'set<text>',
76
binascii.hexlify(json.dumps(['fa', 'fb', 'fc'])), {'fa', 'fb', 'fc'}),
77
('fsblob', 'set<blob>',
78
binascii.hexlify(json.dumps(['fblob1', 'fblob2'])),
76
82
C2S_TYPES = impl.CassandraStorageImpl.CASSANDRA_TO_STORAGE_TYPES
187
193
query = "SELECT * FROM {}.user_{}".format(keyspace, table_name)
188
194
return self.SESSION.execute(query)
190
def _insert_data(self, range_value=1, id_value=1):
196
def _insert_data(self, id_value=1, range_value='1',
197
predefined_fields=None, dynamic_fields=None):
191
198
query = "UPDATE {}.user_{} SET ".format(self.keyspace, self.table_name)
193
for field in self.test_data_predefined_fields:
194
name, typ, sval, _ = field
200
predefined_fields = (
201
predefined_fields or self.test_data_predefined_fields
204
dynamic_fields = dynamic_fields or self.test_data_dynamic_fields
205
for field in predefined_fields:
206
name, _, sval, _ = field
195
207
query += 'user_{}={},'.format(name, sval)
197
for field in self.test_data_dynamic_fields:
209
for field in dynamic_fields:
198
210
name, typ, sval, _ = field
199
211
query += "system_attrs['{}'] = 0x{},".format(
200
name, str(sval).encode('hex'))
202
214
for field in (self.test_data_keys +
203
self.test_data_dynamic_fields +
204
self.test_data_predefined_fields):
205
217
name, typ, _, _ = field
206
218
query += "system_attr_types['{}'] ='{}',".format(name, typ)
207
219
query += ("system_attr_exist = system_attr_exist + {{'{}'}},"
224
236
def test_create_table(self):
225
237
self.assertEqual([], self._get_table_names())
227
attrs = {models.AttributeDefinition(name, self.C2S_TYPES[typ])
229
in (self.test_data_keys +
230
self.test_data_predefined_fields)}
240
name: self.C2S_TYPES[typ] for name, typ, _, _ in (
241
self.test_data_keys + self.test_data_predefined_fields)
233
models.IndexDefinition('index_name', 'indexed')
245
'index_name': models.IndexDefinition('indexed')
236
248
schema = models.TableSchema(self.table_name, attrs, ['id', 'range'],
239
251
self.CASANDRA_STORAGE_IMPL.create_table(self.context, schema)
254
266
self._create_table()
255
267
self._create_index(index_name="index_name")
257
attrs = {models.AttributeDefinition(name, self.C2S_TYPES[typ])
259
in (self.test_data_keys +
260
self.test_data_predefined_fields)}
270
name: self.C2S_TYPES[typ] for name, typ, _, _ in (
271
self.test_data_keys + self.test_data_predefined_fields)
263
models.IndexDefinition('index_name', 'indexed')
275
'index_name': models.IndexDefinition('indexed')
266
278
schema = models.TableSchema(self.table_name, attrs, ['id', 'range'],
269
281
desc = self.CASANDRA_STORAGE_IMPL.describe_table(
270
282
self.context, self.table_name)
323
335
self.assertEqual(1, len(all))
324
336
self.assertEqual(1, all[0]['user_id'])
326
@unittest.skip("conditional updates not yet implemented")
327
338
def test_delete_item_if_exists(self):
328
339
self._create_table()
329
340
self._create_index()
331
query = ("INSERT INTO {}.{} (user_id, user_range,"
332
" user_str, user_indexed)"
333
" VALUES (1, '1', '1', '1')").format(self.keyspace,
336
self.SESSION.execute(query)
338
343
all = self._select_all()
340
345
self.assertEqual(1, len(all))
341
self.assertEqual(1, all[0].user_id)
346
self.assertEqual(1, all[0]["user_id"])
343
expected = {'str': models.ExpectedCondition.exists()}
348
expected = {'str': [models.ExpectedCondition.exists()]}
345
350
del_req = models.DeleteItemRequest(
355
360
self.assertEqual(0, len(all))
357
@unittest.skip("conditional updates noy yet implemented")
358
362
def test_delete_item_if_exists_negative(self):
359
363
self._create_table()
360
364
self._create_index()
362
query = ("INSERT INTO {}.{} (user_id, user_range,"
363
" user_str, user_indexed)"
364
" VALUES (1, '1', null, '1')").format(self.keyspace,
367
self.SESSION.execute(query)
369
368
all = self._select_all()
371
370
self.assertEqual(1, len(all))
372
self.assertEqual(1, all[0].user_id)
371
self.assertEqual(1, all[0]["user_id"])
374
expected = {'str': models.ExpectedCondition.exists()}
374
'not_existed_attr_name': [models.ExpectedCondition.exists()]
376
377
del_req = models.DeleteItemRequest(
378
379
{'id': models.AttributeValue.number(1),
379
380
'range': models.AttributeValue.str('1')})
381
self.CASANDRA_STORAGE_IMPL.delete_item(
382
result = self.CASANDRA_STORAGE_IMPL.delete_item(
382
383
self.context, del_req, expected)
385
self.assertFalse(result)
384
387
all = self._select_all()
386
389
self.assertEqual(1, len(all))
387
self.assertEqual(1, all[0].user_id)
390
self.assertEqual(1, all[0]["user_id"])
389
@unittest.skip("conditional updates noy yet implemented")
390
392
def test_delete_item_if_not_exists(self):
391
393
self._create_table()
392
394
self._create_index()
394
query = ("INSERT INTO {}.{} (user_id, user_range,"
395
" user_str, user_indexed)"
396
" VALUES (1, '1', null, '1')").format(self.keyspace,
399
self.SESSION.execute(query)
401
398
all = self._select_all()
403
400
self.assertEqual(1, len(all))
404
self.assertEqual(1, all[0].user_id)
401
self.assertEqual(1, all[0]["user_id"])
406
expected = {'str': models.ExpectedCondition.not_exists()}
404
'not_existed_attr_name': [models.ExpectedCondition.not_exists()]
408
407
del_req = models.DeleteItemRequest(
410
409
{'id': models.AttributeValue.number(1),
411
410
'range': models.AttributeValue.str('1')})
413
self.CASANDRA_STORAGE_IMPL.delete_item(
412
result = self.CASANDRA_STORAGE_IMPL.delete_item(
414
413
self.context, del_req, expected)
415
self.assertTrue(result)
416
417
all = self._select_all()
418
419
self.assertEqual(0, len(all))
420
@unittest.skip("conditional updates noy yet implemented")
421
421
def test_delete_item_if_not_exists_negative(self):
422
422
self._create_table()
423
423
self._create_index()
425
query = ("INSERT INTO {}.{} (user_id, user_range,"
426
" user_str, user_indexed)"
427
" VALUES (1, '1', '1', '1')").format(self.keyspace,
430
self.SESSION.execute(query)
432
426
all = self._select_all()
434
428
self.assertEqual(1, len(all))
435
self.assertEqual(1, all[0].user_id)
429
self.assertEqual(1, all[0]["user_id"])
437
expected = {'str': models.ExpectedCondition.not_exists()}
431
expected = {'str': [models.ExpectedCondition.not_exists()]}
439
433
del_req = models.DeleteItemRequest(
441
435
{'id': models.AttributeValue.number(1),
442
436
'range': models.AttributeValue.str('1')})
444
self.CASANDRA_STORAGE_IMPL.delete_item(
438
result = self.CASANDRA_STORAGE_IMPL.delete_item(
445
439
self.context, del_req, expected)
441
self.assertFalse(result)
447
443
all = self._select_all()
449
445
self.assertEqual(1, len(all))
450
self.assertEqual(1, all[0].user_id)
446
self.assertEqual(1, all[0]["user_id"])
453
449
class TestCassandraSelectItem(TestCassandraBase):
694
706
self._create_table()
695
707
self._create_index()
709
self._insert_data(range_value='0')
710
self._insert_data(range_value='1')
711
self._insert_data(range_value='3')
702
'id': models.Condition.eq(models.AttributeValue.number(1)),
703
'range': models.IndexedCondition.btw(
704
models.AttributeValue.str('1'),
705
models.AttributeValue.str('2'))
714
'id': [models.Condition.eq(models.AttributeValue.number(1))],
716
models.IndexedCondition.ge(models.AttributeValue.str('1')),
717
models.IndexedCondition.le(models.AttributeValue.str('2'))
708
721
result = self.CASANDRA_STORAGE_IMPL.select_item(
715
728
self._create_table()
716
729
self._create_index()
718
self._insert_data(-1)
731
self._insert_data(range_value='-1')
732
self._insert_data(range_value='1')
733
self._insert_data(range_value='2')
723
'id': models.Condition.eq(models.AttributeValue.number(1)),
724
'range': models.IndexedCondition.btw(
725
models.AttributeValue.str('0'),
726
models.AttributeValue.str('1'))
736
'id': [models.Condition.eq(models.AttributeValue.number(1))],
738
models.IndexedCondition.ge(models.AttributeValue.str('0')),
739
models.IndexedCondition.le(models.AttributeValue.str('1'))
729
743
result = self.CASANDRA_STORAGE_IMPL.select_item(
1758
1789
put_request = models.PutItemRequest(self.table_name, put)
1760
self.CASANDRA_STORAGE_IMPL.put_item(self.context, put_request,
1761
expected_condition_map={1: 1})
1793
models.ExpectedCondition.eq(models.AttributeValue.str('str'))
1797
result = self.CASANDRA_STORAGE_IMPL.put_item(
1798
self.context, put_request, expected_condition_map=expected
1800
self.assertTrue(result)
1763
1802
key_condition = {
1764
'id': models.Condition.eq(models.AttributeValue.number(1)),
1765
'range': models.Condition.eq(models.AttributeValue.str('1'))
1803
'id': [models.Condition.eq(models.AttributeValue.number(1))],
1804
'range': [models.Condition.eq(models.AttributeValue.str('1'))]
1768
1807
result = self.CASANDRA_STORAGE_IMPL.select_item(
1784
1823
put_request = models.PutItemRequest(self.table_name, put)
1786
self.CASANDRA_STORAGE_IMPL.put_item(self.context, put_request,
1787
expected_condition_map={1: 1})
1827
models.ExpectedCondition.eq(models.AttributeValue.number(1))
1831
result = self.CASANDRA_STORAGE_IMPL.put_item(
1832
self.context, put_request, expected_condition_map=expected
1834
self.assertTrue(result)
1789
1836
key_condition = {
1790
'id': models.Condition.eq(models.AttributeValue.number(1)),
1791
'range': models.Condition.eq(models.AttributeValue.str('1'))
1837
'id': [models.Condition.eq(models.AttributeValue.number(1))],
1838
'range': [models.Condition.eq(models.AttributeValue.str('1'))]
1794
1841
result = self.CASANDRA_STORAGE_IMPL.select_item(
1810
1857
put_request = models.PutItemRequest(self.table_name, put)
1812
self.CASANDRA_STORAGE_IMPL.put_item(self.context, put_request,
1813
expected_condition_map={1: 1})
1861
models.ExpectedCondition.eq(models.AttributeValue.blob('blob'))
1865
result = self.CASANDRA_STORAGE_IMPL.put_item(
1866
self.context, put_request, expected_condition_map=expected
1868
self.assertTrue(result)
1815
1870
key_condition = {
1816
'id': models.Condition.eq(models.AttributeValue.number(1)),
1817
'range': models.Condition.eq(models.AttributeValue.str('1'))
1872
models.Condition.eq(models.AttributeValue.number(1))
1875
models.Condition.eq(models.AttributeValue.str('1'))
1820
1879
result = self.CASANDRA_STORAGE_IMPL.select_item(
1837
1896
put_request = models.PutItemRequest(self.table_name, put)
1839
self.CASANDRA_STORAGE_IMPL.put_item(self.context, put_request,
1840
expected_condition_map={1: 1})
1900
models.ExpectedCondition.eq(models.AttributeValue.str_set(
1905
result = self.CASANDRA_STORAGE_IMPL.put_item(
1906
self.context, put_request, expected_condition_map=expected
1908
self.assertTrue(result)
1842
1910
key_condition = {
1843
'id': models.Condition.eq(models.AttributeValue.number(1)),
1844
'range': models.Condition.eq(models.AttributeValue.str('1'))
1911
'id': [models.Condition.eq(models.AttributeValue.number(1))],
1912
'range': [models.Condition.eq(models.AttributeValue.str('1'))]
1847
1915
result = self.CASANDRA_STORAGE_IMPL.select_item(
1864
1932
put_request = models.PutItemRequest(self.table_name, put)
1866
self.CASANDRA_STORAGE_IMPL.put_item(self.context, put_request,
1867
expected_condition_map={1: 1})
1936
models.ExpectedCondition.eq(models.AttributeValue.number_set(
1941
result = self.CASANDRA_STORAGE_IMPL.put_item(
1942
self.context, put_request, expected_condition_map=expected
1944
self.assertTrue(result)
1869
1946
key_condition = {
1870
'id': models.Condition.eq(models.AttributeValue.number(1)),
1871
'range': models.Condition.eq(models.AttributeValue.str('1'))
1947
'id': [models.Condition.eq(models.AttributeValue.number(1))],
1948
'range': [models.Condition.eq(models.AttributeValue.str('1'))]
1874
1951
result = self.CASANDRA_STORAGE_IMPL.select_item(
1891
1968
put_request = models.PutItemRequest(self.table_name, put)
1893
self.CASANDRA_STORAGE_IMPL.put_item(self.context, put_request,
1894
expected_condition_map={1: 1})
1972
models.ExpectedCondition.eq(models.AttributeValue.blob_set(
1973
{'blob1', 'blob2'}))
1977
result = self.CASANDRA_STORAGE_IMPL.put_item(
1978
self.context, put_request, expected_condition_map=expected
1980
self.assertTrue(result)
1896
1982
key_condition = {
1897
'id': models.Condition.eq(models.AttributeValue.number(1)),
1898
'range': models.Condition.eq(models.AttributeValue.str('1'))
1984
models.Condition.eq(models.AttributeValue.number(1))
1987
models.Condition.eq(models.AttributeValue.str('1'))
1901
1991
result = self.CASANDRA_STORAGE_IMPL.select_item(
1917
2007
put_request = models.PutItemRequest(self.table_name, put)
1919
self.CASANDRA_STORAGE_IMPL.put_item(self.context, put_request,
1920
expected_condition_map={1: 1})
2011
models.ExpectedCondition.eq(models.AttributeValue.str('fstr'))
2015
result = self.CASANDRA_STORAGE_IMPL.put_item(
2016
self.context, put_request, expected_condition_map=expected
2018
self.assertTrue(result)
1922
2020
key_condition = {
1923
'id': models.Condition.eq(models.AttributeValue.number(1)),
1924
'range': models.Condition.eq(models.AttributeValue.str('1'))
2021
'id': [models.Condition.eq(models.AttributeValue.number(1))],
2022
'range': [models.Condition.eq(models.AttributeValue.str('1'))]
1927
2025
result = self.CASANDRA_STORAGE_IMPL.select_item(
1943
2041
put_request = models.PutItemRequest(self.table_name, put)
1945
self.CASANDRA_STORAGE_IMPL.put_item(self.context, put_request,
1946
expected_condition_map={1: 1})
2045
models.ExpectedCondition.eq(models.AttributeValue.number(1))
2049
result = self.CASANDRA_STORAGE_IMPL.put_item(
2050
self.context, put_request, expected_condition_map=expected
2052
self.assertTrue(result)
1948
2054
key_condition = {
1949
'id': models.Condition.eq(models.AttributeValue.number(1)),
1950
'range': models.Condition.eq(models.AttributeValue.str('1'))
2056
models.Condition.eq(models.AttributeValue.number(1))
2059
models.Condition.eq(models.AttributeValue.str('1'))
1953
2063
result = self.CASANDRA_STORAGE_IMPL.select_item(
1969
2079
put_request = models.PutItemRequest(self.table_name, put)
1971
self.CASANDRA_STORAGE_IMPL.put_item(self.context, put_request,
1972
expected_condition_map={1: 1})
2083
models.ExpectedCondition.eq(
2084
models.AttributeValue.blob('fblob'))
2088
result = self.CASANDRA_STORAGE_IMPL.put_item(
2089
self.context, put_request, expected_condition_map=expected
2091
self.assertTrue(result)
1974
2093
key_condition = {
1975
'id': models.Condition.eq(models.AttributeValue.number(1)),
1976
'range': models.Condition.eq(models.AttributeValue.str('1'))
2094
'id': [models.Condition.eq(models.AttributeValue.number(1))],
2095
'range': [models.Condition.eq(models.AttributeValue.str('1'))]
1979
2098
result = self.CASANDRA_STORAGE_IMPL.select_item(
1996
2115
put_request = models.PutItemRequest(self.table_name, put)
1998
self.CASANDRA_STORAGE_IMPL.put_item(self.context, put_request,
1999
expected_condition_map={1: 1})
2119
models.ExpectedCondition.eq(
2120
models.AttributeValue.str_set({'fa', 'fb', 'fc'}))
2124
result = self.CASANDRA_STORAGE_IMPL.put_item(
2125
self.context, put_request, expected_condition_map=expected
2127
self.assertTrue(result)
2001
2129
key_condition = {
2002
'id': models.Condition.eq(models.AttributeValue.number(1)),
2003
'range': models.Condition.eq(models.AttributeValue.str('1'))
2130
'id': [models.Condition.eq(models.AttributeValue.number(1))],
2131
'range': [models.Condition.eq(models.AttributeValue.str('1'))]
2006
2134
result = self.CASANDRA_STORAGE_IMPL.select_item(
2023
2151
put_request = models.PutItemRequest(self.table_name, put)
2025
self.CASANDRA_STORAGE_IMPL.put_item(self.context, put_request,
2026
expected_condition_map={1: 1})
2155
models.ExpectedCondition.eq(
2156
models.AttributeValue.number_set({1, 2, 3}))
2160
result = self.CASANDRA_STORAGE_IMPL.put_item(
2161
self.context, put_request, expected_condition_map=expected
2163
self.assertTrue(result)
2028
2165
key_condition = {
2029
'id': models.Condition.eq(models.AttributeValue.number(1)),
2030
'range': models.Condition.eq(models.AttributeValue.str('1'))
2166
'id': [models.Condition.eq(models.AttributeValue.number(1))],
2167
'range': [models.Condition.eq(models.AttributeValue.str('1'))]
2033
2170
result = self.CASANDRA_STORAGE_IMPL.select_item(
2050
2187
put_request = models.PutItemRequest(self.table_name, put)
2052
self.CASANDRA_STORAGE_IMPL.put_item(self.context, put_request,
2053
expected_condition_map={1: 1})
2191
models.ExpectedCondition.eq(
2192
models.AttributeValue.blob_set({'fblob1', 'fblob2'}))
2196
result = self.CASANDRA_STORAGE_IMPL.put_item(
2197
self.context, put_request, expected_condition_map=expected
2199
self.assertTrue(result)
2055
2201
key_condition = {
2056
'id': models.Condition.eq(models.AttributeValue.number(1)),
2057
'range': models.Condition.eq(models.AttributeValue.str('1'))
2202
'id': [models.Condition.eq(models.AttributeValue.number(1))],
2203
'range': [models.Condition.eq(models.AttributeValue.str('1'))]
2060
2206
result = self.CASANDRA_STORAGE_IMPL.select_item(