diff --git a/engine/verifier/src/orm/add_remove_triples.rs b/engine/verifier/src/orm/add_remove_triples.rs index a30c8b1..7adc46b 100644 --- a/engine/verifier/src/orm/add_remove_triples.rs +++ b/engine/verifier/src/orm/add_remove_triples.rs @@ -44,6 +44,7 @@ pub fn add_remove_triples( tracked_predicates: HashMap::new(), parents: HashMap::new(), valid: OrmTrackedSubjectValidity::Pending, + prev_valid: OrmTrackedSubjectValidity::Pending, subject_iri: subject_iri.to_string(), shape: shape.clone(), })) diff --git a/engine/verifier/src/orm/mod.rs b/engine/verifier/src/orm/mod.rs index 4ca3e27..0942532 100644 --- a/engine/verifier/src/orm/mod.rs +++ b/engine/verifier/src/orm/mod.rs @@ -257,24 +257,9 @@ impl Verifier { log_debug!("not applying triples again for subject {subject_iri}"); } - let validity = { - let tracked_subject_opt = orm_subscription - .tracked_subjects - .get(*subject_iri) - .and_then(|m| m.get(&shape.iri)); - let Some(tracked_subject) = tracked_subject_opt else { - continue; - }; // skip if missing - tracked_subject.read().unwrap().valid.clone() - }; - // Validate the subject. - let need_eval = Self::update_subject_validity( - change, - &shape, - &mut orm_subscription, - validity, - ); + let need_eval = + Self::update_subject_validity(change, &shape, &mut orm_subscription); // We add the need_eval to be processed next after loop. // Filter out subjects already in the validation stack to prevent double evaluation. diff --git a/engine/verifier/src/orm/types.rs b/engine/verifier/src/orm/types.rs index ac8721d..8d156c7 100644 --- a/engine/verifier/src/orm/types.rs +++ b/engine/verifier/src/orm/types.rs @@ -23,8 +23,11 @@ pub struct OrmTrackedSubject { /// If this is a nested subject, this records the parents /// and if they are currently tracking this subject. pub parents: HashMap>>, - /// Validity. When untracked, triple updates are not processed here. + /// Validity. When untracked, triple updates are not processed for this tracked subject. pub valid: OrmTrackedSubjectValidity, + /// Previous validity. Used for validation and creating JSON Patch diffs from changes. + pub prev_valid: OrmTrackedSubjectValidity, + /// Subject IRI pub subject_iri: String, /// The shape for which the predicates are tracked. pub shape: Arc, diff --git a/engine/verifier/src/orm/validation.rs b/engine/verifier/src/orm/validation.rs index 94754fd..fc41cc2 100644 --- a/engine/verifier/src/orm/validation.rs +++ b/engine/verifier/src/orm/validation.rs @@ -22,7 +22,6 @@ impl Verifier { s_change: &OrmTrackedSubjectChange, shape: &OrmSchemaShape, orm_subscription: &mut OrmSubscription, - previous_validity: OrmTrackedSubjectValidity, ) -> Vec<(SubjectIri, ShapeIri, NeedsFetchBool)> { let tracked_subjects = &mut orm_subscription.tracked_subjects; @@ -33,6 +32,9 @@ impl Verifier { return vec![]; }; let mut tracked_subject = tracked_subject.write().unwrap(); + let previous_validity = tracked_subject.prev_valid.clone(); + tracked_subject.prev_valid = tracked_subject.valid.clone(); + // Keep track of objects that need to be validated against a shape to fetch and validate. let mut need_evaluation: Vec<(String, String, bool)> = vec![];