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]
|
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):
|
class UserDefinedType(Column):
|
||||||
"""
|
"""
|
||||||
User Defined Type column
|
User Defined Type column
|
||||||
@@ -870,6 +880,8 @@ class UserDefinedType(Column):
|
|||||||
Please see :ref:`user_types` for examples and discussion.
|
Please see :ref:`user_types` for examples and discussion.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
value_manager = UDTValueManager
|
||||||
|
|
||||||
def __init__(self, user_type, **kwargs):
|
def __init__(self, user_type, **kwargs):
|
||||||
"""
|
"""
|
||||||
:param type user_type: specifies the :class:`~.UserType` model of the column
|
:param type user_type: specifies the :class:`~.UserType` model of the column
|
||||||
|
|||||||
@@ -59,6 +59,13 @@ class BaseUserType(object):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "{{{}}}".format(', '.join("'{}': {}".format(k, getattr(self, k)) for k, v in six.iteritems(self._values)))
|
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
|
@classmethod
|
||||||
def register_for_keyspace(cls, keyspace):
|
def register_for_keyspace(cls, keyspace):
|
||||||
connection.register_udt(keyspace, cls.type_name(), cls)
|
connection.register_udt(keyspace, cls.type_name(), cls)
|
||||||
|
|||||||
Reference in New Issue
Block a user