From b994c78147dd44d2aab1d3a810fbf87e0cc56458 Mon Sep 17 00:00:00 2001 From: Ziyang Hu Date: Sun, 25 Sep 2022 16:17:56 +0800 Subject: [PATCH] rename and remove relation directives take multiple arguments --- Cargo.toml | 1 + src/algo/mod.rs | 3 +++ src/cozoscript.pest | 11 ++++------- src/parse/sys.rs | 30 ++++++++++++++++++++---------- src/runtime/db.rs | 18 +++++++++++------- 5 files changed, 39 insertions(+), 24 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 834e3630..f503a058 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,6 +42,7 @@ approx = "0.5.1" unicode-normalization = "0.1.21" thiserror = "1.0.34" uuid = { version = "1.1.2", features = ["v1", "v4", "serde"] } +sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "postgres", "mysql", "mssql", "sqlite"] } cozorocks = { path = "cozorocks" } #[target.'cfg(not(target_env = "msvc"))'.dependencies] diff --git a/src/algo/mod.rs b/src/algo/mod.rs index 5c2b563c..634cd52b 100644 --- a/src/algo/mod.rs +++ b/src/algo/mod.rs @@ -186,6 +186,9 @@ impl AlgoHandle { "RandomWalk" => Box::new(RandomWalk), "ReorderSort" => Box::new(ReorderSort), "JsonReader" => Box::new(JsonReader), + "CsvReader" => todo!(), + "RemoteCozo" => todo!(), + "SqlDb" => todo!(), name => bail!(AlgoNotFoundError(name.to_string(), self.name.span)), }) } diff --git a/src/cozoscript.pest b/src/cozoscript.pest index 33307863..0336cb73 100644 --- a/src/cozoscript.pest +++ b/src/cozoscript.pest @@ -10,9 +10,10 @@ compact_opt_relations = {"relations"} running_op = {"running"} kill_op = {"kill" ~ int} list_relations_op = {"relations"} -list_relation_op = {"relation" ~ "columns" ~ ident} -remove_relations_op = {"relation" ~ "remove" ~ ident } -rename_relations_op = {"relation" ~ "rename" ~ ident ~ ident } +list_relation_op = {"relation" ~ "columns" ~ compound_ident} +remove_relations_op = {"relation" ~ "remove" ~ (compound_ident ~ ",")* ~ compound_ident } +rename_relations_op = {"relation" ~ "rename" ~ (rename_pair ~ ",")* ~ rename_pair } +rename_pair = {compound_ident ~ "->" ~ compound_ident} from_clause = {"from" ~ expr} to_clause = {"to" ~ expr} @@ -105,10 +106,6 @@ sort_desc = {"-"} assert_none_option = {":assert" ~ "none"} assert_some_option = {":assert" ~ "some"} -out_spec = {"{" ~ (pull_field ~ ",")* ~ pull_field? ~ "}"} -pull_field = {rev_pull_marker? ~ compound_ident ~ (":" ~ out_spec)?} -rev_pull_marker = {"<"} - // literals quoted_string = ${ "\"" ~ quoted_string_inner ~ "\"" } diff --git a/src/parse/sys.rs b/src/parse/sys.rs index 8ffa26f2..345ea42d 100644 --- a/src/parse/sys.rs +++ b/src/parse/sys.rs @@ -1,5 +1,6 @@ use std::collections::BTreeSet; +use itertools::Itertools; use miette::{Diagnostic, Result}; use thiserror::Error; @@ -28,8 +29,8 @@ pub(crate) enum SysOp { ListRelations, ListRunning, KillRunning(u64), - RemoveRelation(Symbol), - RenameRelation(Symbol, Symbol), + RemoveRelation(Vec), + RenameRelation(Vec<(Symbol, Symbol)>), } #[derive(Debug, Diagnostic, Error)] @@ -59,8 +60,11 @@ pub(crate) fn parse_sys(mut src: Pairs<'_>) -> Result { } Rule::list_relations_op => SysOp::ListRelations, Rule::remove_relations_op => { - let rels_p = inner.into_inner().next().unwrap(); - let rel = Symbol::new(rels_p.as_str(), rels_p.extract_span()); + let rel = inner + .into_inner() + .map(|rels_p| Symbol::new(rels_p.as_str(), rels_p.extract_span())) + .collect_vec(); + SysOp::RemoveRelation(rel) } Rule::list_relation_op => { @@ -69,12 +73,18 @@ pub(crate) fn parse_sys(mut src: Pairs<'_>) -> Result { SysOp::ListRelation(rel) } Rule::rename_relations_op => { - let mut src = inner.into_inner(); - let rels_p = src.next().unwrap(); - let rel = Symbol::new(rels_p.as_str(), rels_p.extract_span()); - let rels_p = src.next().unwrap(); - let new_rel = Symbol::new(rels_p.as_str(), rels_p.extract_span()); - SysOp::RenameRelation(rel, new_rel) + let rename_pairs = inner + .into_inner() + .map(|pair| { + let mut src = pair.into_inner(); + let rels_p = src.next().unwrap(); + let rel = Symbol::new(rels_p.as_str(), rels_p.extract_span()); + let rels_p = src.next().unwrap(); + let new_rel = Symbol::new(rels_p.as_str(), rels_p.extract_span()); + (rel, new_rel) + }) + .collect_vec(); + SysOp::RenameRelation(rename_pairs) } _ => unreachable!(), }) diff --git a/src/runtime/db.rs b/src/runtime/db.rs index 49828bc1..6a5d3d7e 100644 --- a/src/runtime/db.rs +++ b/src/runtime/db.rs @@ -243,14 +243,20 @@ impl Db { Ok(json!({"headers": ["status"], "rows": [["OK"]]})) } SysOp::ListRelations => self.list_relations(), - SysOp::RemoveRelation(rs) => { - self.remove_relation(&rs)?; + SysOp::RemoveRelation(rel_names) => { + let mut tx = self.transact_write()?; + for rs in rel_names { + self.remove_relation(&rs, &mut tx)?; + } + tx.commit_tx()?; Ok(json!({"headers": ["status"], "rows": [["OK"]]})) } SysOp::ListRelation(rs) => self.list_relation(&rs), - SysOp::RenameRelation(old, new) => { + SysOp::RenameRelation(rename_pairs) => { let mut tx = self.transact_write()?; - tx.rename_relation(old, new)?; + for (old, new) in rename_pairs { + tx.rename_relation(old, new)?; + } tx.commit_tx()?; Ok(json!({"headers": ["status"], "rows": [["OK"]]})) } @@ -445,10 +451,8 @@ impl Db { } } } - pub(crate) fn remove_relation(&self, name: &Symbol) -> Result<()> { - let mut tx = self.transact_write()?; + pub(crate) fn remove_relation(&self, name: &Symbol, tx: &mut SessionTx) -> Result<()> { let (lower, upper) = tx.destroy_relation(name)?; - tx.commit_tx()?; self.db.range_del(&lower, &upper)?; Ok(()) }