iter projected relation

main
Ziyang Hu 2 years ago
parent 3f4c7eaa85
commit 61e46ff147

@ -1,5 +1,4 @@
use std::cmp::{min, Ordering}; use std::cmp::{min, Ordering};
use std::ops::Deref;
use anyhow::Result; use anyhow::Result;
use itertools::Itertools; use itertools::Itertools;
@ -129,7 +128,7 @@ impl<'a> EncodedTuple<'a> {
} }
} }
struct EncodedTupleIter<'a> { pub(crate) struct EncodedTupleIter<'a> {
tuple: EncodedTuple<'a>, tuple: EncodedTuple<'a>,
size: usize, size: usize,
pos: usize, pos: usize,

@ -23,7 +23,6 @@ use crate::data::tuple::{rusty_scratch_cmp, SCRATCH_DB_KEY_PREFIX_LEN};
use crate::data::value::DataValue; use crate::data::value::DataValue;
use crate::runtime::transact::SessionTx; use crate::runtime::transact::SessionTx;
use crate::transact::pull::CurrentPath; use crate::transact::pull::CurrentPath;
use crate::transact::throwaway::ThrowawayArea;
pub struct Db { pub struct Db {
db: RocksDb, db: RocksDb,

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

Loading…
Cancel
Save