op rederive for views

main
Ziyang Hu 2 years ago
parent 007b9b8a16
commit 13c568dbfd

@ -1,10 +1,5 @@
## TODO ## TODO
* [ ] stored relations
* [ ] `store-put` and `store-retract`
* [ ] more complete functions and aggregations * [ ] more complete functions and aggregations
* [ ] auto-updating relations?
* [ ] counting-based `auto-view`
* [ ] manual or time-based `materialized-view`
* [ ] more complete tx tests * [ ] more complete tx tests
* [ ] graph algorithms * [ ] graph algorithms

@ -54,6 +54,7 @@ impl TryFrom<&'_ JsonValue> for SortDir {
#[derive(Debug, Copy, Clone, Eq, PartialEq)] #[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub(crate) enum ViewOp { pub(crate) enum ViewOp {
Create, Create,
Rederive,
Put, Put,
Retract, Retract,
} }
@ -225,6 +226,8 @@ impl SessionTx {
.ok_or_else(|| anyhow!("view options must be an object"))?; .ok_or_else(|| anyhow!("view options must be an object"))?;
let (op, name) = if let Some(name) = opts.get("create") { let (op, name) = if let Some(name) = opts.get("create") {
(ViewOp::Create, name) (ViewOp::Create, name)
} else if let Some(name) = opts.get("rederive") {
(ViewOp::Rederive, name)
} else if let Some(name) = opts.get("put") { } else if let Some(name) = opts.get("put") {
(ViewOp::Put, name) (ViewOp::Put, name)
} else if let Some(name) = opts.get("retract") { } else if let Some(name) = opts.get("retract") {

@ -91,12 +91,23 @@ impl SessionTx {
op: ViewOp, op: ViewOp,
meta: &ViewRelMetadata, meta: &ViewRelMetadata,
) -> Result<()> { ) -> Result<()> {
let view_store = if op == ViewOp::Create { if op == ViewOp::Rederive {
let _ = self.destroy_view_rel(&meta.name);
}
let view_store = if op == ViewOp::Rederive || op == ViewOp::Create {
self.create_view_rel(meta.clone())? self.create_view_rel(meta.clone())?
} else { } else {
let found = self.get_view_rel(&meta.name)?; let found = self.get_view_rel(&meta.name)?;
ensure!(found.metadata.arity == meta.arity, "arity mismatch for view {}", meta.name); ensure!(
ensure!(found.metadata.kind == meta.kind, "kind mismatch for view {:?}", meta.kind); found.metadata.arity == meta.arity,
"arity mismatch for view {}",
meta.name
);
ensure!(
found.metadata.kind == meta.kind,
"kind mismatch for view {:?}",
meta.kind
);
found found
}; };
let mut vtx = self.view_db.transact().start(); let mut vtx = self.view_db.transact().start();

@ -313,7 +313,7 @@ impl Db {
"view '{}' exists but is required not to be", "view '{}' exists but is required not to be",
meta.name meta.name
) )
} else { } else if *op != ViewOp::Rederive {
ensure!( ensure!(
tx.view_exists(&meta.name)?, tx.view_exists(&meta.name)?,
"view '{}' does not exist but is required to be", "view '{}' does not exist but is required to be",

@ -69,7 +69,7 @@ fn air_routes() -> Result<()> {
let view_time = Instant::now(); let view_time = Instant::now();
match db.run_script(r#" match db.run_script(r#"
?[?src, ?dst, ?distance] := [?r route.src ?src], [?r route.dst ?dst], [?r route.distance ?distance]; ?[?src, ?dst, ?distance] := [?r route.src ?src], [?r route.dst ?dst], [?r route.distance ?distance];
:view create flies_to; :view rederive flies_to;
"#) { "#) {
Ok(_) => {dbg!(view_time.elapsed());} Ok(_) => {dbg!(view_time.elapsed());}
Err(_) => { Err(_) => {
@ -1237,7 +1237,7 @@ fn air_routes() -> Result<()> {
[11758,["LHR","NRT","AKL","BHE"]],[11751,["LHR","NRT","AKL","NSN"]]] [11758,["LHR","NRT","AKL","BHE"]],[11751,["LHR","NRT","AKL","NSN"]]]
"# "#
) )
.unwrap() .unwrap()
); );
Ok(()) Ok(())

Loading…
Cancel
Save