Skip to content

symfonic.memory.backends.in_memory_procedure_delete

in_memory_procedure_delete

Conditional procedure deletion while the in-memory graph writer lock is held.

delete_procedure

delete_procedure(store, scope, node_id)

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