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.
let root_shapes_and_tracked_subjects = subs
let root_shapes_and_tracked_shapes = subs
.iter()
.map(|sub| {
(
@ -128,7 +128,7 @@ impl Verifier {
})
.collect::<Vec<_>>();
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,

@ -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),
);
}

@ -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);

@ -128,6 +128,7 @@ export class OrmConnection<T extends BaseType> {
private onSignalObjectUpdate = ({ patches }: WatchPatchEvent<Set<T>>) => {
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<T extends BaseType> {
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. */

Loading…
Cancel
Save