rename and remove relation directives take multiple arguments

main
Ziyang Hu 2 years ago
parent 1bfa3bd5f2
commit b994c78147

@ -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]

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

@ -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 ~ "\"" }

@ -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<Symbol>),
RenameRelation(Vec<(Symbol, Symbol)>),
}
#[derive(Debug, Diagnostic, Error)]
@ -59,8 +60,11 @@ pub(crate) fn parse_sys(mut src: Pairs<'_>) -> Result<SysOp> {
}
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> {
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!(),
})

@ -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(())
}

Loading…
Cancel
Save