From c037ea020735777e88ea8f0bd16c390289c7c6aa Mon Sep 17 00:00:00 2001 From: Laurin Weger Date: Fri, 24 Oct 2025 18:47:27 +0200 Subject: [PATCH] working basic test object --- .../verifier/src/orm/handle_backend_update.rs | 13 +++++++++---- .../src/orm/handle_frontend_update.rs | 19 ++++++++++--------- sdk/js/alien-deepsignals/src/deepSignal.ts | 6 +++--- .../src/connector/ormConnectionHandler.ts | 6 ++++++ 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/engine/verifier/src/orm/handle_backend_update.rs b/engine/verifier/src/orm/handle_backend_update.rs index c41f0e9a..89a28adf 100644 --- a/engine/verifier/src/orm/handle_backend_update.rs +++ b/engine/verifier/src/orm/handle_backend_update.rs @@ -114,7 +114,7 @@ impl Verifier { ); // prepare to apply updates to tracked subjects and record the changes. - let root_shapes_and_tracked_subjects = subs + let root_shapes_and_tracked_shapes = subs .iter() .map(|sub| { ( @@ -128,7 +128,7 @@ impl Verifier { }) .collect::>(); - scopes.push((scope.clone(), root_shapes_and_tracked_subjects)); + scopes.push((scope.clone(), root_shapes_and_tracked_shapes)); } log_debug!( @@ -151,7 +151,7 @@ impl Verifier { ); // Apply the changes to tracked subjects. - for (root_shape_arc, all_shapes) in shapes_zip { + for (root_shape_arc, all_tracked_shapes) in shapes_zip { let shape_iri = root_shape_arc.iri.clone(); log_info!( "[orm_backend_update] Calling process_changes_for_shape_and_session for shape={}, session={}", @@ -161,7 +161,12 @@ impl Verifier { let _ = self.process_changes_for_shape_and_session( &scope, &shape_iri, - all_shapes, + if all_tracked_shapes.len() > 0 { + all_tracked_shapes + } else { + // If all tracked subjects are empty, wee need to add the root shape manually. + vec![root_shape_arc] + }, session_id, &triple_inserts, &triple_removes, diff --git a/engine/verifier/src/orm/handle_frontend_update.rs b/engine/verifier/src/orm/handle_frontend_update.rs index aba4516b..a85c472f 100644 --- a/engine/verifier/src/orm/handle_frontend_update.rs +++ b/engine/verifier/src/orm/handle_frontend_update.rs @@ -203,10 +203,7 @@ fn create_sparql_update_query_for_diff( let delete_statement; if let Some(target_object) = target_object { // Delete the link to exactly one object (IRI referenced in path, i.e. target_object) - delete_statement = format!( - " {} <{}> <{}> .", - subject_var, target_predicate, target_object - ) + delete_statement = format!(" {} {} {} .", subject_var, target_predicate, target_object) } else { // Delete object or literal referenced by property name. let delete_val = match &del_patch.value { @@ -218,7 +215,7 @@ fn create_sparql_update_query_for_diff( // Delete the specific values only. Some(val) => json_to_sparql_val(&val), // Can be one or more (joined with ", "). }; - delete_statement = format!(" {} <{}> {} .", subject_var, target_predicate, delete_val); + delete_statement = format!(" {} {} {} .", subject_var, target_predicate, delete_val); } sparql_sub_queries.push(format!( @@ -277,7 +274,7 @@ fn create_sparql_update_query_for_diff( if !pred_schema.unwrap().is_multi() { log_info!("[create_sparql_update_query_for_diff] Single-value predicate, adding DELETE before INSERT"); let remove_statement = - format!(" {} <{}> ?o{}", subject_var, target_predicate, var_counter); + format!(" {} {} ?o{}", subject_var, target_predicate, var_counter); let mut wheres = where_statements.clone(); wheres.push(remove_statement.clone()); @@ -291,7 +288,7 @@ fn create_sparql_update_query_for_diff( // var_counter += 1; // Not necessary because not used afterwards. } // The actual INSERT. - let add_statement = format!(" {} <{}> {} .", subject_var, target_predicate, add_val); + let add_statement = format!(" {} {} {} .", subject_var, target_predicate, add_val); sparql_sub_queries.push(format!( "INSERT {{\n{}\n}} WHERE {{\n {}\n}}", add_statement, @@ -440,7 +437,7 @@ fn create_where_statements_for_patch( ); return ( where_statements, - (subject_ref, pred_schema.iri.clone(), None), + (subject_ref, format!("<{}>", pred_schema.iri.clone()), None), Some(pred_schema), ); } @@ -484,7 +481,11 @@ fn create_where_statements_for_patch( ); return ( where_statements, - (subject_ref, pred_schema.iri.clone(), Some(object_iri)), + ( + subject_ref, + format!("<{}>", pred_schema.iri.clone()), + Some(format!("<{}>", object_iri)), + ), Some(pred_schema), ); } diff --git a/sdk/js/alien-deepsignals/src/deepSignal.ts b/sdk/js/alien-deepsignals/src/deepSignal.ts index 991f4dad..eb7c0dbb 100644 --- a/sdk/js/alien-deepsignals/src/deepSignal.ts +++ b/sdk/js/alien-deepsignals/src/deepSignal.ts @@ -877,9 +877,9 @@ const objectHandlers = { get: get(false), set(target: object, fullKey: string, val: any, receiver: object): boolean { // Prevent modification of @id property - if (fullKey === "@id") { - throw new Error("Cannot modify readonly property '@id'"); - } + // if (fullKey === "@id") { + // throw new Error("Cannot modify readonly property '@id'"); + // } // Respect original getter/setter semantics if (typeof descriptor(target, fullKey)?.set === "function") return Reflect.set(target, fullKey, val, receiver); diff --git a/sdk/js/signals/src/connector/ormConnectionHandler.ts b/sdk/js/signals/src/connector/ormConnectionHandler.ts index 2848d03c..faab6352 100644 --- a/sdk/js/signals/src/connector/ormConnectionHandler.ts +++ b/sdk/js/signals/src/connector/ormConnectionHandler.ts @@ -128,6 +128,7 @@ export class OrmConnection { private onSignalObjectUpdate = ({ patches }: WatchPatchEvent>) => { if (this.suspendDeepWatcher || !this.ready || !patches.length) return; + console.debug("[onSignalObjectUpdate] got changes:", patches); const ormPatches = deepPatchesToDiff(patches); @@ -188,7 +189,12 @@ export class OrmConnection { patches ); + this.suspendDeepWatcher = true; applyDiffToDeepSignal(this.signalObject, patches); + // Use queueMicrotask to ensure watcher is re-enabled _after_ batch completes + queueMicrotask(() => { + this.suspendDeepWatcher = false; + }); }; /** Function to create random subject IRIs for newly created nested objects. */