|
|
@ -1,4 +1,4 @@
|
|
|
|
use std::collections::BTreeMap;
|
|
|
|
use std::collections::{BTreeMap, BTreeSet};
|
|
|
|
|
|
|
|
|
|
|
|
use anyhow::Result;
|
|
|
|
use anyhow::Result;
|
|
|
|
use itertools::Itertools;
|
|
|
|
use itertools::Itertools;
|
|
|
@ -9,6 +9,7 @@ use crate::data::tuple::{Tuple, TupleIter};
|
|
|
|
use crate::data::value::DataValue;
|
|
|
|
use crate::data::value::DataValue;
|
|
|
|
use crate::runtime::transact::SessionTx;
|
|
|
|
use crate::runtime::transact::SessionTx;
|
|
|
|
use crate::transact::pull::PullSpec;
|
|
|
|
use crate::transact::pull::PullSpec;
|
|
|
|
|
|
|
|
use crate::transact::throwaway::ThrowawayArea;
|
|
|
|
use crate::Validity;
|
|
|
|
use crate::Validity;
|
|
|
|
|
|
|
|
|
|
|
|
pub(crate) struct QuerySpec {
|
|
|
|
pub(crate) struct QuerySpec {
|
|
|
@ -310,7 +311,40 @@ impl TripleRelation {
|
|
|
|
|
|
|
|
|
|
|
|
pub(crate) struct ProjectedRelation {
|
|
|
|
pub(crate) struct ProjectedRelation {
|
|
|
|
relation: Relation,
|
|
|
|
relation: Relation,
|
|
|
|
eliminate: Vec<Keyword>,
|
|
|
|
eliminate: BTreeSet<Keyword>,
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl ProjectedRelation {
|
|
|
|
|
|
|
|
fn iter<'a>(&'a self, tx: &'a SessionTx) -> TupleIter<'a> {
|
|
|
|
|
|
|
|
let bindings = self.relation.bindings();
|
|
|
|
|
|
|
|
let eliminate_indices = bindings
|
|
|
|
|
|
|
|
.iter()
|
|
|
|
|
|
|
|
.enumerate()
|
|
|
|
|
|
|
|
.filter_map(|(idx, kw)| {
|
|
|
|
|
|
|
|
if self.eliminate.contains(kw) {
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
Some(idx)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
.collect::<BTreeSet<_>>();
|
|
|
|
|
|
|
|
Box::new(self.relation.iter(tx).map_ok(move |tuple| {
|
|
|
|
|
|
|
|
Tuple(
|
|
|
|
|
|
|
|
tuple
|
|
|
|
|
|
|
|
.0
|
|
|
|
|
|
|
|
.into_iter()
|
|
|
|
|
|
|
|
.enumerate()
|
|
|
|
|
|
|
|
.filter_map(|(idx, val)| {
|
|
|
|
|
|
|
|
if eliminate_indices.contains(&idx) {
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
Some(val)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
.collect_vec(),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
}))
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub(crate) enum Relation {
|
|
|
|
pub(crate) enum Relation {
|
|
|
@ -322,9 +356,15 @@ pub(crate) enum Relation {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub(crate) struct StoredDerivedRelation {
|
|
|
|
pub(crate) struct StoredDerivedRelation {
|
|
|
|
name: Keyword,
|
|
|
|
|
|
|
|
arity: usize,
|
|
|
|
arity: usize,
|
|
|
|
bindings: Vec<Keyword>,
|
|
|
|
bindings: Vec<Keyword>,
|
|
|
|
|
|
|
|
storage: ThrowawayArea,
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl StoredDerivedRelation {
|
|
|
|
|
|
|
|
fn iter(&self) -> TupleIter {
|
|
|
|
|
|
|
|
Box::new(self.storage.scan_all().map_ok(|(t, _)| t))
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub(crate) struct Joiner {
|
|
|
|
pub(crate) struct Joiner {
|
|
|
@ -424,15 +464,11 @@ impl InnerJoin {
|
|
|
|
.join_indices(self.left.bindings(), self.right.bindings());
|
|
|
|
.join_indices(self.left.bindings(), self.right.bindings());
|
|
|
|
r.join(left_iter, join_indices, tx)
|
|
|
|
r.join(left_iter, join_indices, tx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Relation::Derived(_) => {
|
|
|
|
Relation::Derived(r) => r.iter(),
|
|
|
|
todo!()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Relation::Join(_) => {
|
|
|
|
Relation::Join(_) => {
|
|
|
|
todo!()
|
|
|
|
todo!()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Relation::Project(_) => {
|
|
|
|
Relation::Project(r) => r.iter(tx),
|
|
|
|
todo!()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|