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:
@@ -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
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user