From 919510b0f4c080210c93275a53eecdb80249fb14 Mon Sep 17 00:00:00 2001 From: Ziyang Hu Date: Wed, 14 Jun 2023 05:03:57 +0800 Subject: [PATCH] accept base64-encoded vecs --- cozo-core/src/data/functions.rs | 112 ++++++++++++--------- cozo-core/src/data/program.rs | 2 +- cozo-core/src/fixed_rule/algos/top_sort.rs | 3 +- cozo-core/src/lib.rs | 20 ++-- cozo-core/src/parse/mod.rs | 2 +- cozo-core/src/parse/query.rs | 2 +- cozo-core/src/query/stored.rs | 8 +- cozo-core/src/runtime/db.rs | 24 ++--- cozo-core/src/runtime/relation.rs | 6 +- 9 files changed, 97 insertions(+), 82 deletions(-) diff --git a/cozo-core/src/data/functions.rs b/cozo-core/src/data/functions.rs index 343bf1b2..374a9c9d 100644 --- a/cozo-core/src/data/functions.rs +++ b/cozo-core/src/data/functions.rs @@ -8,6 +8,7 @@ use std::cmp::Reverse; use std::collections::BTreeSet; +use std::mem; use std::ops::{Div, Rem}; use std::str::FromStr; use std::time::{SystemTime, UNIX_EPOCH}; @@ -740,10 +741,10 @@ pub(crate) fn op_exp(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.exp())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.exp())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.exp())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.exp())))); } _ => bail!("'exp' requires numbers"), }; @@ -756,10 +757,10 @@ pub(crate) fn op_exp2(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.exp2())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.exp2())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.exp2())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.exp2())))); } _ => bail!("'exp2' requires numbers"), }; @@ -772,10 +773,10 @@ pub(crate) fn op_ln(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.ln())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.ln())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.ln())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.ln())))); } _ => bail!("'ln' requires numbers"), }; @@ -788,10 +789,10 @@ pub(crate) fn op_log2(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.log2())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.log2())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.log2())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.log2())))); } _ => bail!("'log2' requires numbers"), }; @@ -804,10 +805,10 @@ pub(crate) fn op_log10(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.log10())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.log10())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.log10())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.log10())))); } _ => bail!("'log10' requires numbers"), }; @@ -820,10 +821,10 @@ pub(crate) fn op_sin(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.sin())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.sin())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.sin())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.sin())))); } _ => bail!("'sin' requires numbers"), }; @@ -836,10 +837,10 @@ pub(crate) fn op_cos(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.cos())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.cos())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.cos())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.cos())))); } _ => bail!("'cos' requires numbers"), }; @@ -852,10 +853,10 @@ pub(crate) fn op_tan(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.tan())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.tan())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.tan())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.tan())))); } _ => bail!("'tan' requires numbers"), }; @@ -868,10 +869,10 @@ pub(crate) fn op_asin(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.asin())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.asin())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.asin())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.asin())))); } _ => bail!("'asin' requires numbers"), }; @@ -884,10 +885,10 @@ pub(crate) fn op_acos(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.acos())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.acos())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.acos())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.acos())))); } _ => bail!("'acos' requires numbers"), }; @@ -900,10 +901,10 @@ pub(crate) fn op_atan(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.atan())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.atan())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.atan())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.atan())))); } _ => bail!("'atan' requires numbers"), }; @@ -932,10 +933,10 @@ pub(crate) fn op_sinh(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.sinh())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.sinh())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.sinh())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.sinh())))); } _ => bail!("'sinh' requires numbers"), }; @@ -948,10 +949,10 @@ pub(crate) fn op_cosh(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.cosh())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.cosh())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.cosh())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.cosh())))); } _ => bail!("'cosh' requires numbers"), }; @@ -964,10 +965,10 @@ pub(crate) fn op_tanh(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.tanh())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.tanh())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.tanh())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.tanh())))); } _ => bail!("'tanh' requires numbers"), }; @@ -980,10 +981,10 @@ pub(crate) fn op_asinh(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.asinh())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.asinh())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.asinh())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.asinh())))); } _ => bail!("'asinh' requires numbers"), }; @@ -996,10 +997,10 @@ pub(crate) fn op_acosh(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.acosh())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.acosh())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.acosh())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.acosh())))); } _ => bail!("'acosh' requires numbers"), }; @@ -1012,10 +1013,10 @@ pub(crate) fn op_atanh(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.atanh())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.atanh())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.atanh())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.atanh())))); } _ => bail!("'atanh' requires numbers"), }; @@ -1028,10 +1029,10 @@ pub(crate) fn op_sqrt(args: &[DataValue]) -> Result { DataValue::Num(Num::Int(i)) => *i as f64, DataValue::Num(Num::Float(f)) => *f, DataValue::Vec(Vector::F32(v)) => { - return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.sqrt())))) + return Ok(DataValue::Vec(Vector::F32(v.mapv(|x| x.sqrt())))); } DataValue::Vec(Vector::F64(v)) => { - return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.sqrt())))) + return Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x.sqrt())))); } _ => bail!("'sqrt' requires numbers"), }; @@ -1622,9 +1623,9 @@ pub(crate) fn op_haversine(args: &[DataValue]) -> Result { let lon2 = args[3].get_float().ok_or_else(miette)?; let ret = 2. * f64::asin(f64::sqrt( - f64::sin((lat1 - lat2) / 2.).powi(2) - + f64::cos(lat1) * f64::cos(lat2) * f64::sin((lon1 - lon2) / 2.).powi(2), - )); + f64::sin((lat1 - lat2) / 2.).powi(2) + + f64::cos(lat1) * f64::cos(lat2) * f64::sin((lon1 - lon2) / 2.).powi(2), + )); Ok(DataValue::from(ret)) } @@ -1637,9 +1638,9 @@ pub(crate) fn op_haversine_deg_input(args: &[DataValue]) -> Result { let lon2 = args[3].get_float().ok_or_else(miette)? * f64::PI() / 180.; let ret = 2. * f64::asin(f64::sqrt( - f64::sin((lat1 - lat2) / 2.).powi(2) - + f64::cos(lat1) * f64::cos(lat2) * f64::sin((lon1 - lon2) / 2.).powi(2), - )); + f64::sin((lat1 - lat2) / 2.).powi(2) + + f64::cos(lat1) * f64::cos(lat2) * f64::sin((lon1 - lon2) / 2.).powi(2), + )); Ok(DataValue::from(ret)) } @@ -1970,7 +1971,7 @@ pub(crate) fn op_to_int(args: &[DataValue]) -> Result { .map_err(|_| miette!("The string cannot be interpreted as int"))? .into() } - DataValue::Validity(vld) => DataValue::Num(Num::Int(vld.timestamp.0 .0)), + DataValue::Validity(vld) => DataValue::Num(Num::Int(vld.timestamp.0.0)), v => bail!("'to_int' does not recognize {:?}", v), }) } @@ -2084,6 +2085,21 @@ pub(crate) fn op_vec(args: &[DataValue]) -> Result { Ok(DataValue::Vec(Vector::F64(v.mapv(|x| x as f64)))) } }, + DataValue::Str(s) => { + let bytes = STANDARD.decode(s).map_err(|_| miette!("Data is not base64 encoded"))?; + match t { + VecElementType::F32 => { + let f32_count = bytes.len() / mem::size_of::(); + let arr = unsafe { ndarray::ArrayView1::from_shape_ptr(ndarray::Dim([f32_count]), bytes.as_ptr() as *const f32) }; + Ok(DataValue::Vec(Vector::F32(arr.to_owned()))) + } + VecElementType::F64 => { + let f64_count = bytes.len() / mem::size_of::(); + let arr = unsafe { ndarray::ArrayView1::from_shape_ptr(ndarray::Dim([f64_count]), bytes.as_ptr() as *const f64) }; + Ok(DataValue::Vec(Vector::F64(arr.to_owned()))) + } + } + } _ => bail!("'vec' requires a list or a vector"), } } @@ -2412,12 +2428,12 @@ pub(crate) fn op_now(_args: &[DataValue]) -> Result { pub(crate) fn current_validity() -> ValidityTs { #[cfg(not(target_arch = "wasm32"))] - let ts_micros = { + let ts_micros = { let now = SystemTime::now(); now.duration_since(UNIX_EPOCH).unwrap().as_micros() as i64 }; #[cfg(target_arch = "wasm32")] - let ts_micros = { (Date::now() * 1000.) as i64 }; + let ts_micros = { (Date::now() * 1000.) as i64 }; ValidityTs(Reverse(ts_micros)) } @@ -2432,7 +2448,7 @@ define_op!(OP_FORMAT_TIMESTAMP, 1, true); pub(crate) fn op_format_timestamp(args: &[DataValue]) -> Result { let dt = { let millis = match &args[0] { - DataValue::Validity(vld) => vld.timestamp.0 .0 / 1000, + DataValue::Validity(vld) => vld.timestamp.0.0 / 1000, v => { let f = v .get_float() @@ -2486,14 +2502,14 @@ pub(crate) fn op_rand_uuid_v1(_args: &[DataValue]) -> Result { let mut rng = rand::thread_rng(); let uuid_ctx = uuid::v1::Context::new(rng.gen()); #[cfg(target_arch = "wasm32")] - let ts = { + let ts = { let since_epoch: f64 = Date::now(); let seconds = since_epoch.floor(); let fractional = (since_epoch - seconds) * 1.0e9; Timestamp::from_unix(uuid_ctx, seconds as u64, fractional as u32) }; #[cfg(not(target_arch = "wasm32"))] - let ts = { + let ts = { let now = SystemTime::now(); let since_epoch = now.duration_since(UNIX_EPOCH).unwrap(); Timestamp::from_unix(uuid_ctx, since_epoch.as_secs(), since_epoch.subsec_nanos()) diff --git a/cozo-core/src/data/program.rs b/cozo-core/src/data/program.rs index cf902c39..c24a0276 100644 --- a/cozo-core/src/data/program.rs +++ b/cozo-core/src/data/program.rs @@ -94,7 +94,7 @@ impl Display for QueryOutOptions { )) = &self.store_relation { if *return_mutation == ReturnMutation::Returning { - write!(f, ":returning\n")?; + writeln!(f, ":returning")?; } match op { RelationOp::Create => { diff --git a/cozo-core/src/fixed_rule/algos/top_sort.rs b/cozo-core/src/fixed_rule/algos/top_sort.rs index f8d58321..d850dfef 100644 --- a/cozo-core/src/fixed_rule/algos/top_sort.rs +++ b/cozo-core/src/fixed_rule/algos/top_sort.rs @@ -71,8 +71,7 @@ pub(crate) fn kahn_g(graph: &DirectedCsrGraph, poison: Poison) -> Result Result { - return self.run_script(payload, BTreeMap::new(), ScriptMutability::Mutable); + self.run_script(payload, BTreeMap::new(), ScriptMutability::Mutable) } /// Run the CozoScript passed in. The `params` argument is a map of parameters. /// Fold any error into the return JSON itself. @@ -203,13 +203,13 @@ impl DbInstance { mutability: ScriptMutability, ) -> JsonValue { #[cfg(not(target_arch = "wasm32"))] - let start = Instant::now(); + let start = Instant::now(); match self.run_script(payload, params, mutability) { Ok(named_rows) => { let mut j_val = named_rows.into_json(); #[cfg(not(target_arch = "wasm32"))] - let took = start.elapsed().as_secs_f64(); + let took = start.elapsed().as_secs_f64(); let map = j_val.as_object_mut().unwrap(); map.insert("ok".to_string(), json!(true)); #[cfg(not(target_arch = "wasm32"))] @@ -233,7 +233,7 @@ impl DbInstance { .collect(), Err(_) => { return json!({"ok": false, "message": "params argument is not a JSON map"}) - .to_string() + .to_string(); } } }; @@ -246,13 +246,13 @@ impl DbInstance { ScriptMutability::Mutable }, ) - .to_string() + .to_string() } /// Dispatcher method. See [crate::Db::export_relations]. pub fn export_relations(&self, relations: I) -> Result> - where - T: AsRef, - I: Iterator, + where + T: AsRef, + I: Iterator, { match self { DbInstance::Mem(db) => db.export_relations(relations), @@ -451,8 +451,8 @@ impl DbInstance { } /// Dispatcher method. See [crate::Db::register_fixed_rule]. pub fn register_fixed_rule(&self, name: String, rule_impl: R) -> Result<()> - where - R: FixedRule + 'static, + where + R: FixedRule + 'static, { match self { DbInstance::Mem(db) => db.register_fixed_rule(name, rule_impl), diff --git a/cozo-core/src/parse/mod.rs b/cozo-core/src/parse/mod.rs index 4c9e2498..96f4bca7 100644 --- a/cozo-core/src/parse/mod.rs +++ b/cozo-core/src/parse/mod.rs @@ -269,7 +269,7 @@ pub(crate) fn parse_expressions( .next() .unwrap(); - Ok(build_expr(parsed.into_inner().next().unwrap(), param_pool)?) + build_expr(parsed.into_inner().next().unwrap(), param_pool) } pub(crate) fn parse_script( diff --git a/cozo-core/src/parse/query.rs b/cozo-core/src/parse/query.rs index e11917af..0cec2d13 100644 --- a/cozo-core/src/parse/query.rs +++ b/cozo-core/src/parse/query.rs @@ -235,7 +235,7 @@ pub(crate) fn parse_query( for s in datalist.next().unwrap().into_inner() { if s.as_rule() == Rule::param { head.push(Symbol::new( - s.as_str().strip_prefix("$").unwrap(), + s.as_str().strip_prefix('$').unwrap(), Default::default(), )); } diff --git a/cozo-core/src/query/stored.rs b/cozo-core/src/query/stored.rs index ce346a11..c4c74209 100644 --- a/cozo-core/src/query/stored.rs +++ b/cozo-core/src/query/stored.rs @@ -224,7 +224,7 @@ impl<'a> SessionTx<'a> { span: SourceSpan, ) -> Result<()> { let is_callback_target = callback_targets.contains(&relation_store.name) - || force_collect == &relation_store.name; + || force_collect == relation_store.name; if relation_store.access_level < AccessLevel::Protected { bail!(InsufficientAccessLevel( @@ -468,7 +468,7 @@ impl<'a> SessionTx<'a> { for (name, (_, manifest)) in relation_store.fts_indices.iter() { let tokenizer = self .tokenizers - .get(&name, &manifest.tokenizer, &manifest.filters)?; + .get(name, &manifest.tokenizer, &manifest.filters)?; let parsed = CozoScriptParser::parse(Rule::expr, &manifest.extractor) .into_diagnostic()? @@ -483,7 +483,7 @@ impl<'a> SessionTx<'a> { for (name, (_, _, manifest)) in relation_store.lsh_indices.iter() { let tokenizer = self .tokenizers - .get(&name, &manifest.tokenizer, &manifest.filters)?; + .get(name, &manifest.tokenizer, &manifest.filters)?; let parsed = CozoScriptParser::parse(Rule::expr, &manifest.extractor) .into_diagnostic()? @@ -534,7 +534,7 @@ impl<'a> SessionTx<'a> { span: SourceSpan, ) -> Result<()> { let is_callback_target = callback_targets.contains(&relation_store.name) - || force_collect == &relation_store.name; + || force_collect == relation_store.name; if relation_store.access_level < AccessLevel::Protected { bail!(InsufficientAccessLevel( diff --git a/cozo-core/src/runtime/db.rs b/cozo-core/src/runtime/db.rs index b9622c61..ea796ba5 100644 --- a/cozo-core/src/runtime/db.rs +++ b/cozo-core/src/runtime/db.rs @@ -1173,9 +1173,9 @@ impl<'s, S: Storage<'s>> Db { ) -> Result { match op { SysOp::Explain(prog) => { - let (normalized_program, _) = prog.clone().into_normalized_program(&tx)?; + let (normalized_program, _) = prog.clone().into_normalized_program(tx)?; let (stratified_program, _) = normalized_program.into_stratified_program()?; - let program = stratified_program.magic_sets_rewrite(&tx)?; + let program = stratified_program.magic_sets_rewrite(tx)?; let compiled = tx.stratified_magic_compile(program)?; self.explain_compiled(&compiled) } @@ -1213,7 +1213,7 @@ impl<'s, S: Storage<'s>> Db { let _guards = locks.iter().map(|l| l.read().unwrap()).collect_vec(); let mut bounds = vec![]; for rs in rel_names { - let bound = tx.destroy_relation(&rs)?; + let bound = tx.destroy_relation(rs)?; if !rs.is_temp_store_name() { bounds.extend(bound); } @@ -1227,7 +1227,7 @@ impl<'s, S: Storage<'s>> Db { )) } SysOp::DescribeRelation(rel_name, description) => { - tx.describe_relation(&rel_name, description)?; + tx.describe_relation(rel_name, description)?; Ok(NamedRows::new( vec![STATUS_STR.to_string()], vec![vec![DataValue::from(OK_STR)]], @@ -1238,14 +1238,14 @@ impl<'s, S: Storage<'s>> Db { bail!("Cannot create index in read-only mode"); } if skip_locking { - tx.create_index(&rel_name, &idx_name, cols)?; + tx.create_index(rel_name, idx_name, cols)?; } else { let lock = self .obtain_relation_locks(iter::once(&rel_name.name)) .pop() .unwrap(); let _guard = lock.write().unwrap(); - tx.create_index(&rel_name, &idx_name, cols)?; + tx.create_index(rel_name, idx_name, cols)?; } Ok(NamedRows::new( vec![STATUS_STR.to_string()], @@ -1315,14 +1315,14 @@ impl<'s, S: Storage<'s>> Db { bail!("Cannot remove index in read-only mode"); } let bounds = if skip_locking { - tx.remove_index(&rel_name, &idx_name)? + tx.remove_index(rel_name, idx_name)? } else { let lock = self .obtain_relation_locks(iter::once(&rel_name.name)) .pop() .unwrap(); let _guard = lock.read().unwrap(); - tx.remove_index(&rel_name, &idx_name)? + tx.remove_index(rel_name, idx_name)? }; for (lower, upper) in bounds { @@ -1333,8 +1333,8 @@ impl<'s, S: Storage<'s>> Db { vec![vec![DataValue::from(OK_STR)]], )) } - SysOp::ListColumns(rs) => self.list_columns(tx, &rs), - SysOp::ListIndices(rs) => self.list_indices(tx, &rs), + SysOp::ListColumns(rs) => self.list_columns(tx, rs), + SysOp::ListIndices(rs) => self.list_indices(tx, rs), SysOp::RenameRelation(rename_pairs) => { if read_only { bail!("Cannot rename relations in read-only mode"); @@ -1357,7 +1357,7 @@ impl<'s, S: Storage<'s>> Db { SysOp::ListRunning => self.list_running(), SysOp::KillRunning(id) => { let queries = self.running_queries.lock().unwrap(); - Ok(match queries.get(&id) { + Ok(match queries.get(id) { None => NamedRows::new( vec![STATUS_STR.to_string()], vec![vec![DataValue::from("NOT_FOUND")]], @@ -1372,7 +1372,7 @@ impl<'s, S: Storage<'s>> Db { }) } SysOp::ShowTrigger(name) => { - let rel = tx.get_relation(&name, false)?; + let rel = tx.get_relation(name, false)?; let mut rows: Vec> = vec![]; for (i, trigger) in rel.put_triggers.iter().enumerate() { rows.push(vec![json!("put"), json!(i), json!(trigger)]) diff --git a/cozo-core/src/runtime/relation.rs b/cozo-core/src/runtime/relation.rs index f40f95d3..fd0391fc 100644 --- a/cozo-core/src/runtime/relation.rs +++ b/cozo-core/src/runtime/relation.rs @@ -560,7 +560,7 @@ impl<'a> SessionTx<'a> { if name.name.starts_with('_') { bail!("Cannot set triggers for temp store") } - let mut original = self.get_relation(&name, true)?; + let mut original = self.get_relation(name, true)?; if original.access_level < AccessLevel::Protected { bail!(InsufficientAccessLevel( original.name.to_string(), @@ -723,7 +723,7 @@ impl<'a> SessionTx<'a> { Ok(to_clean) } pub(crate) fn set_access_level(&mut self, rel: &Symbol, level: AccessLevel) -> Result<()> { - let mut meta = self.get_relation(&rel, true)?; + let mut meta = self.get_relation(rel, true)?; meta.access_level = level; let name_key = vec![DataValue::Str(meta.name.clone())].encode_as_key(RelationId::SYSTEM); @@ -1422,7 +1422,7 @@ impl<'a> SessionTx<'a> { let old_key = DataValue::Str(old.name.clone()); let old_encoded = vec![old_key].encode_as_key(RelationId::SYSTEM); - let mut rel = self.get_relation(&old, true)?; + let mut rel = self.get_relation(old, true)?; if rel.access_level < AccessLevel::Normal { bail!(InsufficientAccessLevel( rel.name.to_string(),