Delete only an exact-owner, live procedural row; never inspect by a prior read.
Source code in src/symfonic/memory/backends/in_memory_procedure_delete.py
| def delete_procedure(store, scope, node_id):
"""Delete only an exact-owner, live procedural row; never inspect by a prior read."""
nodes = store._nodes.get(scope.tenant_id, {})
node = nodes.get(str(node_id))
if node is None or node.layer is not MemoryLayer.PROCEDURAL:
return False
if is_retracted(node.properties):
return False
owner = stored_scope_path(node.properties, node.tenant_id, scope=scope)
if owner != materialise_scope_path(scope):
return False
store._erase_epochs[scope.tenant_id] += 1
del nodes[str(node_id)]
if _is_native_scope(scope):
cascade_incident_edges(store, scope, node)
else:
# A child-owned v0 edge may point to this ancestor node. Remove all
# incident v0 edges before this ID can be reused; leave v1 owners alone.
edges = store._edges.get(scope.tenant_id, {})
for edge_id, edge in tuple(edges.items()):
if (str(node_id) in (str(edge.source), str(edge.target))
and not native_owner(getattr(edge, "_scope_path", None))):
del edges[edge_id]
return True
|