From e374f5afe1c5d6fda3f1025e0e8f03fd333f485b Mon Sep 17 00:00:00 2001 From: Ziyang Hu Date: Fri, 13 Jan 2023 17:02:48 +0800 Subject: [PATCH] fixed rules can now be unregistered at will --- cozo-core/src/lib.rs | 14 ++++++++++++++ cozo-core/src/runtime/db.rs | 13 ++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/cozo-core/src/lib.rs b/cozo-core/src/lib.rs index 1d9104ea..e160a21a 100644 --- a/cozo-core/src/lib.rs +++ b/cozo-core/src/lib.rs @@ -427,6 +427,20 @@ impl DbInstance { DbInstance::TiKv(db) => db.register_fixed_rule(name, rule_impl), } } + /// Dispatcher method. See [crate::Db::unregister_fixed_rule] + pub fn unregister_fixed_rule(&self, name: &str) -> Result { + match self { + DbInstance::Mem(db) => db.unregister_fixed_rule(name), + #[cfg(feature = "storage-sqlite")] + DbInstance::Sqlite(db) => db.unregister_fixed_rule(name), + #[cfg(feature = "storage-rocksdb")] + DbInstance::RocksDb(db) => db.unregister_fixed_rule(name), + #[cfg(feature = "storage-sled")] + DbInstance::Sled(db) => db.unregister_fixed_rule(name), + #[cfg(feature = "storage-tikv")] + DbInstance::TiKv(db) => db.unregister_fixed_rule(name), + } + } } /// Convert error raised by the database into friendly JSON format diff --git a/cozo-core/src/runtime/db.rs b/cozo-core/src/runtime/db.rs index cbe51f86..cc08f51f 100644 --- a/cozo-core/src/runtime/db.rs +++ b/cozo-core/src/runtime/db.rs @@ -563,6 +563,14 @@ impl<'s, S: Storage<'s>> Db { } } + /// Unregister a custom fixed rule implementation. + pub fn unregister_fixed_rule(&self, name: &str) -> Result { + if "Constant" == name { + bail!("Cannot unregister builtin fixed rule {}", name); + } + Ok(self.fixed_rules.write().unwrap().remove(name).is_some()) + } + /// Register callbacks to run when changes to the requested relation are successfully committed. /// The returned ID can be used to unregister the callbacks. /// @@ -981,7 +989,10 @@ impl<'s, S: Storage<'s>> Db { let rules = self.fixed_rules.read().unwrap(); Ok(NamedRows::new( vec!["rule".to_string()], - rules.keys().map(|k| vec![DataValue::from(k as &str)]).collect_vec(), + rules + .keys() + .map(|k| vec![DataValue::from(k as &str)]) + .collect_vec(), )) } SysOp::RemoveRelation(rel_names) => {