From 17b77ea9e4b03a6caa4611db3966610dfc491a42 Mon Sep 17 00:00:00 2001 From: Blake Eggleston Date: Tue, 23 Jul 2013 12:53:00 -0700 Subject: [PATCH] adding support for using set statements for counter columns if there is no previous value, reformatting --- cqlengine/columns.py | 18 ++++++++++++++++-- .../tests/columns/test_container_columns.py | 3 ++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/cqlengine/columns.py b/cqlengine/columns.py index cd01cf40..0f505ccc 100644 --- a/cqlengine/columns.py +++ b/cqlengine/columns.py @@ -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. diff --git a/cqlengine/tests/columns/test_container_columns.py b/cqlengine/tests/columns/test_container_columns.py index 6cf21829..cd11fb5a 100644 --- a/cqlengine/tests/columns/test_container_columns.py +++ b/cqlengine/tests/columns/test_container_columns.py @@ -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