From a054e931ceb9a4dffd9106874592582c52fcd877 Mon Sep 17 00:00:00 2001 From: Nicolas Luck Date: Tue, 25 Mar 2025 22:45:19 +0100 Subject: [PATCH] Make link removals Prolog updates O(1) with retract --- .../src/perspectives/perspective_instance.rs | 6 ++++-- rust-executor/src/perspectives/sdna.rs | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/rust-executor/src/perspectives/perspective_instance.rs b/rust-executor/src/perspectives/perspective_instance.rs index 7579798f0..0596fdbd2 100644 --- a/rust-executor/src/perspectives/perspective_instance.rs +++ b/rust-executor/src/perspectives/perspective_instance.rs @@ -1184,14 +1184,16 @@ impl PerspectiveInstance { log::error!("Error spawning Prolog engine: {:?}", e) }; - let fact_rebuild_needed = !diff.removals.is_empty() - || diff.additions.iter().any(|link| is_sdna_link(&link.data)); + let fact_rebuild_needed = diff.additions.iter().any(|link| is_sdna_link(&link.data)); let did_update = if !fact_rebuild_needed { let mut assertions: Vec = Vec::new(); for addition in &diff.additions { assertions.push(generic_link_fact("assert_link_and_triple", addition)); } + for removal in &diff.removals { + assertions.push(generic_link_fact("retract_link_and_triple", removal)); + } let query = format!("{}.", assertions.join(",")); match self_clone.prolog_query(query).await { diff --git a/rust-executor/src/perspectives/sdna.rs b/rust-executor/src/perspectives/sdna.rs index 82ac58cd2..7a9addb3e 100644 --- a/rust-executor/src/perspectives/sdna.rs +++ b/rust-executor/src/perspectives/sdna.rs @@ -494,6 +494,18 @@ url_decode_char(Char) --> [Char], { \+ member(Char, "%") }. assert_link_and_triple(Source, Predicate, Target, Timestamp, Author) :- (assert_link(Source, Predicate, Target, Timestamp, Author) ; true), (assert_triple(Source, Predicate, Target) ; true). + + retract_link(Source, Predicate, Target, Timestamp, Author) :- + link(Source, Predicate, Target, Timestamp, Author), + retract(link(Source, Predicate, Target, Timestamp, Author)). + + retract_triple(Source, Predicate, Target) :- + triple(Source, Predicate, Target), + retract(triple(Source, Predicate, Target)). + + retract_link_and_triple(Source, Predicate, Target, Timestamp, Author) :- + (retract_link(Source, Predicate, Target, Timestamp, Author) ; true), + (retract_triple(Source, Predicate, Target) ; true). "#; lines.extend(assert_link.split('\n').map(|s| s.to_string()));