op rederive for views

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

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

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

@ -91,12 +91,23 @@ impl SessionTx {
op: ViewOp,
meta: &ViewRelMetadata,
) -> 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())?
} else {
let found = self.get_view_rel(&meta.name)?;
ensure!(found.metadata.arity == meta.arity, "arity mismatch for view {}", meta.name);
ensure!(found.metadata.kind == meta.kind, "kind mismatch for view {:?}", meta.kind);
ensure!(
found.metadata.arity == meta.arity,
"arity mismatch for view {}",
meta.name
);
ensure!(
found.metadata.kind == meta.kind,
"kind mismatch for view {:?}",
meta.kind
);
found
};
let mut vtx = self.view_db.transact().start();

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

@ -69,7 +69,7 @@ fn air_routes() -> Result<()> {
let view_time = Instant::now();
match db.run_script(r#"
?[?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());}
Err(_) => {
@ -1237,7 +1237,7 @@ fn air_routes() -> Result<()> {
[11758,["LHR","NRT","AKL","BHE"]],[11751,["LHR","NRT","AKL","NSN"]]]
"#
)
.unwrap()
.unwrap()
);
Ok(())

Loading…
Cancel
Save