From b28b92605cac51caa2d8aefde9f897f97175100b Mon Sep 17 00:00:00 2001 From: Ziyang Hu Date: Sat, 3 Dec 2022 00:17:28 +0800 Subject: [PATCH] fix trigger --- cozo-core/src/query/stored.rs | 4 ++- cozo-core/src/runtime/relation.rs | 42 +++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/cozo-core/src/query/stored.rs b/cozo-core/src/query/stored.rs index a46adec7..55047368 100644 --- a/cozo-core/src/query/stored.rs +++ b/cozo-core/src/query/stored.rs @@ -447,7 +447,9 @@ fn make_const_rule( rule_symbol.clone(), InputInlineRulesOrAlgo::Algo { algo: AlgoApply { - algo: AlgoHandle { name: rule_symbol }, + algo: AlgoHandle { + name: Symbol::new("Constant", Default::default()), + }, rule_args: vec![], options, head: bindings, diff --git a/cozo-core/src/runtime/relation.rs b/cozo-core/src/runtime/relation.rs index c1580511..445e30e4 100644 --- a/cozo-core/src/runtime/relation.rs +++ b/cozo-core/src/runtime/relation.rs @@ -430,3 +430,45 @@ pub(crate) struct InsufficientAccessLevel( pub(crate) String, pub(crate) AccessLevel, ); + +#[cfg(test)] +mod tests { + use serde_json::json; + use crate::new_cozo_mem; + + #[test] + fn test_trigger() { + let db = new_cozo_mem().unwrap(); + db.run_script(":create friends {fr: Int, to: Int}", Default::default()) + .unwrap(); + db.run_script(":create friends.rev {to: Int, fr: Int}", Default::default()) + .unwrap(); + db.run_script(r#" + ::set_triggers friends + + on put { + ?[fr, to] := _new[fr, to] + + :put friends.rev{ to, fr } + } + on rm { + ?[fr, to] := _old[fr, to] + + :rm friends.rev{ to, fr } + } + "#, Default::default()).unwrap(); + db.run_script( + r"?[fr, to] <- [[1,2]] :put friends {fr, to}", + Default::default(), + ) + .unwrap(); + let ret = db + .export_relations(["friends", "friends.rev"].into_iter()) + .unwrap(); + let frs = ret.get("friends").unwrap(); + assert_eq!(vec![json!(1), json!(2)], frs.rows[0]); + + let frs_rev = ret.get("friends.rev").unwrap(); + assert_eq!(vec![json!(2), json!(1)], frs_rev.rows[0]); + } +}