adding support for using set statements for counter columns if there is no previous value, reformatting
This commit is contained in:
@@ -192,6 +192,7 @@ class Column(object):
|
||||
def get_cql(self):
|
||||
return '"{}"'.format(self.db_field_name)
|
||||
|
||||
|
||||
class Bytes(Column):
|
||||
db_type = 'blob'
|
||||
|
||||
@@ -200,9 +201,11 @@ class Bytes(Column):
|
||||
if val is None: return
|
||||
return val.encode('hex')
|
||||
|
||||
|
||||
class Ascii(Column):
|
||||
db_type = 'ascii'
|
||||
|
||||
|
||||
class Text(Column):
|
||||
db_type = 'text'
|
||||
|
||||
@@ -248,13 +251,19 @@ class Counter(Integer):
|
||||
|
||||
def get_update_statement(self, val, prev, ctx):
|
||||
val = self.to_database(val)
|
||||
prev = self.to_database(prev or 0)
|
||||
prev = self.to_database(prev)
|
||||
field_id = uuid4().hex
|
||||
|
||||
# use a set statement if there is no
|
||||
# previous value to compute a delta from
|
||||
if prev is None:
|
||||
ctx[field_id] = val
|
||||
return ['"{}" = :{}'.format(self.db_field_name, field_id)]
|
||||
|
||||
delta = val - prev
|
||||
if delta == 0:
|
||||
return []
|
||||
|
||||
field_id = uuid4().hex
|
||||
sign = '+' if delta > 0 else '-'
|
||||
delta = abs(delta)
|
||||
ctx[field_id] = delta
|
||||
@@ -334,6 +343,7 @@ class UUID(Column):
|
||||
|
||||
from uuid import UUID as pyUUID, getnode
|
||||
|
||||
|
||||
class TimeUUID(UUID):
|
||||
"""
|
||||
UUID containing timestamp
|
||||
@@ -417,6 +427,7 @@ class Float(Column):
|
||||
def to_database(self, value):
|
||||
return self.validate(value)
|
||||
|
||||
|
||||
class Decimal(Column):
|
||||
db_type = 'decimal'
|
||||
|
||||
@@ -476,6 +487,7 @@ class BaseContainerColumn(Column):
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
class Set(BaseContainerColumn):
|
||||
"""
|
||||
Stores a set of unordered, unique values
|
||||
@@ -565,6 +577,7 @@ class Set(BaseContainerColumn):
|
||||
|
||||
return statements
|
||||
|
||||
|
||||
class List(BaseContainerColumn):
|
||||
"""
|
||||
Stores a list of ordered values
|
||||
@@ -789,6 +802,7 @@ class Map(BaseContainerColumn):
|
||||
|
||||
return del_statements
|
||||
|
||||
|
||||
class _PartitionKeysToken(Column):
|
||||
"""
|
||||
virtual column representing token of partition columns.
|
||||
|
||||
@@ -28,7 +28,9 @@ class JsonTestColumn(columns.Column):
|
||||
if value is None: return
|
||||
return json.dumps(value)
|
||||
|
||||
|
||||
class TestSetColumn(BaseCassEngTestCase):
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super(TestSetColumn, cls).setUpClass()
|
||||
@@ -40,7 +42,6 @@ class TestSetColumn(BaseCassEngTestCase):
|
||||
super(TestSetColumn, cls).tearDownClass()
|
||||
delete_table(TestSetModel)
|
||||
|
||||
|
||||
def test_empty_set_initial(self):
|
||||
"""
|
||||
tests that sets are set() by default, should never be none
|
||||
|
||||
Reference in New Issue
Block a user