cqle: add UDTValueManager to detect sub-field updatees

UDTs are still updated en masse when changed. This aligns
with concept of 'frozen' types.
This commit is contained in:
Adam Holmberg
2015-03-20 09:30:02 -05:00
parent 4cd60dcadb
commit dafddfb4cc
2 changed files with 19 additions and 0 deletions

View File

@@ -859,6 +859,16 @@ class Map(BaseContainerColumn):
return [self.key_col, self.value_col]
class UDTValueManager(BaseValueManager):
@property
def changed(self):
return self.value != self.previous_value or self.value.has_changed_fields()
def reset_previous_value(self):
self.value.reset_changed_fields()
self.previous_value = copy(self.value)
class UserDefinedType(Column):
"""
User Defined Type column
@@ -870,6 +880,8 @@ class UserDefinedType(Column):
Please see :ref:`user_types` for examples and discussion.
"""
value_manager = UDTValueManager
def __init__(self, user_type, **kwargs):
"""
:param type user_type: specifies the :class:`~.UserType` model of the column

View File

@@ -59,6 +59,13 @@ class BaseUserType(object):
def __str__(self):
return "{{{}}}".format(', '.join("'{}': {}".format(k, getattr(self, k)) for k, v in six.iteritems(self._values)))
def has_changed_fields(self):
return any(v.changed for v in self._values.values())
def reset_changed_fields(self):
for v in self._values.values():
v.reset_previous_value()
@classmethod
def register_for_keyspace(cls, keyspace):
connection.register_udt(keyspace, cls.type_name(), cls)