adding support for using set statements for counter columns if there is no previous value, reformatting

This commit is contained in:
Blake Eggleston
2013-07-23 12:53:00 -07:00
parent ceb487af88
commit 17b77ea9e4
2 changed files with 18 additions and 3 deletions

View File

@@ -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.

View File

@@ -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