working basic test object

feat/orm-diffs
Laurin Weger 1 day ago
parent 866d20b808
commit c037ea0207
No known key found for this signature in database
GPG Key ID: 9B372BB0B792770F
  1. 13
      engine/verifier/src/orm/handle_backend_update.rs
  2. 19
      engine/verifier/src/orm/handle_frontend_update.rs
  3. 6
      sdk/js/alien-deepsignals/src/deepSignal.ts
  4. 6
      sdk/js/signals/src/connector/ormConnectionHandler.ts

@ -114,7 +114,7 @@ impl Verifier {
); );
// prepare to apply updates to tracked subjects and record the changes. // 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() .iter()
.map(|sub| { .map(|sub| {
( (
@ -128,7 +128,7 @@ impl Verifier {
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
scopes.push((scope.clone(), root_shapes_and_tracked_subjects)); scopes.push((scope.clone(), root_shapes_and_tracked_shapes));
} }
log_debug!( log_debug!(
@ -151,7 +151,7 @@ impl Verifier {
); );
// Apply the changes to tracked subjects. // 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(); let shape_iri = root_shape_arc.iri.clone();
log_info!( log_info!(
"[orm_backend_update] Calling process_changes_for_shape_and_session for shape={}, session={}", "[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( let _ = self.process_changes_for_shape_and_session(
&scope, &scope,
&shape_iri, &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, session_id,
&triple_inserts, &triple_inserts,
&triple_removes, &triple_removes,

@ -203,10 +203,7 @@ fn create_sparql_update_query_for_diff(
let delete_statement; let delete_statement;
if let Some(target_object) = target_object { if let Some(target_object) = target_object {
// Delete the link to exactly one object (IRI referenced in path, i.e. target_object) // Delete the link to exactly one object (IRI referenced in path, i.e. target_object)
delete_statement = format!( delete_statement = format!(" {} {} {} .", subject_var, target_predicate, target_object)
" {} <{}> <{}> .",
subject_var, target_predicate, target_object
)
} else { } else {
// Delete object or literal referenced by property name. // Delete object or literal referenced by property name.
let delete_val = match &del_patch.value { let delete_val = match &del_patch.value {
@ -218,7 +215,7 @@ fn create_sparql_update_query_for_diff(
// Delete the specific values only. // Delete the specific values only.
Some(val) => json_to_sparql_val(&val), // Can be one or more (joined with ", "). 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!( sparql_sub_queries.push(format!(
@ -277,7 +274,7 @@ fn create_sparql_update_query_for_diff(
if !pred_schema.unwrap().is_multi() { if !pred_schema.unwrap().is_multi() {
log_info!("[create_sparql_update_query_for_diff] Single-value predicate, adding DELETE before INSERT"); log_info!("[create_sparql_update_query_for_diff] Single-value predicate, adding DELETE before INSERT");
let remove_statement = 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(); let mut wheres = where_statements.clone();
wheres.push(remove_statement.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. // var_counter += 1; // Not necessary because not used afterwards.
} }
// The actual INSERT. // 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!( sparql_sub_queries.push(format!(
"INSERT {{\n{}\n}} WHERE {{\n {}\n}}", "INSERT {{\n{}\n}} WHERE {{\n {}\n}}",
add_statement, add_statement,
@ -440,7 +437,7 @@ fn create_where_statements_for_patch(
); );
return ( return (
where_statements, where_statements,
(subject_ref, pred_schema.iri.clone(), None), (subject_ref, format!("<{}>", pred_schema.iri.clone()), None),
Some(pred_schema), Some(pred_schema),
); );
} }
@ -484,7 +481,11 @@ fn create_where_statements_for_patch(
); );
return ( return (
where_statements, 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), Some(pred_schema),
); );
} }

@ -877,9 +877,9 @@ const objectHandlers = {
get: get(false), get: get(false),
set(target: object, fullKey: string, val: any, receiver: object): boolean { set(target: object, fullKey: string, val: any, receiver: object): boolean {
// Prevent modification of @id property // Prevent modification of @id property
if (fullKey === "@id") { // if (fullKey === "@id") {
throw new Error("Cannot modify readonly property '@id'"); // throw new Error("Cannot modify readonly property '@id'");
} // }
// Respect original getter/setter semantics // Respect original getter/setter semantics
if (typeof descriptor(target, fullKey)?.set === "function") if (typeof descriptor(target, fullKey)?.set === "function")
return Reflect.set(target, fullKey, val, receiver); return Reflect.set(target, fullKey, val, receiver);

@ -128,6 +128,7 @@ export class OrmConnection<T extends BaseType> {
private onSignalObjectUpdate = ({ patches }: WatchPatchEvent<Set<T>>) => { private onSignalObjectUpdate = ({ patches }: WatchPatchEvent<Set<T>>) => {
if (this.suspendDeepWatcher || !this.ready || !patches.length) return; if (this.suspendDeepWatcher || !this.ready || !patches.length) return;
console.debug("[onSignalObjectUpdate] got changes:", patches);
const ormPatches = deepPatchesToDiff(patches); const ormPatches = deepPatchesToDiff(patches);
@ -188,7 +189,12 @@ export class OrmConnection<T extends BaseType> {
patches patches
); );
this.suspendDeepWatcher = true;
applyDiffToDeepSignal(this.signalObject, patches); 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. */ /** Function to create random subject IRIs for newly created nested objects. */

Loading…
Cancel
Save