def updates(self, **kwargs):
"""returns iterator for tuples of: node/edge before modification, node/edge after modification, the set of key names that changed, first and last txn ID to contribute to the delta, and the last logID processed"""
changed = {}
batch=kwargs.pop('batch', 500)
for target in self.scan(**kwargs):
ID = target.ID
updated = []
if isinstance(target, Property):
# it is a property
updated.append((target.parent, set([target.key])))
else:
updated.append((target, set(target)))
# new edges cause changes in referenced nodes' properties
if isinstance(target,Edge):
updated.append((target.src, Node.reserved_src_updates))
updated.append((target.tgt, Node.reserved_tgt_updates))
for (obj, keys) in updated:
if obj.ID in changed:
# updated record w/ latest revision of node/edge, and merge in affected key names
changed[obj.ID][1] = obj
changed[obj.ID][2].update(keys)
changed[obj.ID][4] = ID
else:
# collect changes for up to $batch node/edges before yielding change sets
if len(changed) == batch:
for before_after_keys in changed.itervalues():
before_after_keys.append(ID)
yield tuple(before_after_keys)
changed.clear()
# snag copy of the object just before this update (might not exist yet), this object, and affected keys
changed[obj.ID] = [obj.clone(beforeID=ID), obj, set(keys), ID, ID]
for before_after_keys in changed.itervalues():
before_after_keys.append(ID)
yield tuple(before_after_keys)
评论列表
文章目录