diff --git a/src/data/tuple.rs b/src/data/tuple.rs index 2a4a530a..f2002e6f 100644 --- a/src/data/tuple.rs +++ b/src/data/tuple.rs @@ -1,5 +1,4 @@ use std::cmp::{min, Ordering}; -use std::ops::Deref; use anyhow::Result; use itertools::Itertools; @@ -129,7 +128,7 @@ impl<'a> EncodedTuple<'a> { } } -struct EncodedTupleIter<'a> { +pub(crate) struct EncodedTupleIter<'a> { tuple: EncodedTuple<'a>, size: usize, pos: usize, diff --git a/src/runtime/db.rs b/src/runtime/db.rs index 1ad11806..74e4e356 100644 --- a/src/runtime/db.rs +++ b/src/runtime/db.rs @@ -23,7 +23,6 @@ use crate::data::tuple::{rusty_scratch_cmp, SCRATCH_DB_KEY_PREFIX_LEN}; use crate::data::value::DataValue; use crate::runtime::transact::SessionTx; use crate::transact::pull::CurrentPath; -use crate::transact::throwaway::ThrowawayArea; pub struct Db { db: RocksDb, diff --git a/src/transact/query.rs b/src/transact/query.rs index 352d794f..5d8d7585 100644 --- a/src/transact/query.rs +++ b/src/transact/query.rs @@ -1,4 +1,4 @@ -use std::collections::BTreeMap; +use std::collections::{BTreeMap, BTreeSet}; use anyhow::Result; use itertools::Itertools; @@ -9,6 +9,7 @@ use crate::data::tuple::{Tuple, TupleIter}; use crate::data::value::DataValue; use crate::runtime::transact::SessionTx; use crate::transact::pull::PullSpec; +use crate::transact::throwaway::ThrowawayArea; use crate::Validity; pub(crate) struct QuerySpec { @@ -310,7 +311,40 @@ impl TripleRelation { pub(crate) struct ProjectedRelation { relation: Relation, - eliminate: Vec, + eliminate: BTreeSet, +} + +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::>(); + 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 { @@ -322,9 +356,15 @@ pub(crate) enum Relation { } pub(crate) struct StoredDerivedRelation { - name: Keyword, arity: usize, bindings: Vec, + storage: ThrowawayArea, +} + +impl StoredDerivedRelation { + fn iter(&self) -> TupleIter { + Box::new(self.storage.scan_all().map_ok(|(t, _)| t)) + } } pub(crate) struct Joiner { @@ -424,15 +464,11 @@ impl InnerJoin { .join_indices(self.left.bindings(), self.right.bindings()); r.join(left_iter, join_indices, tx) } - Relation::Derived(_) => { - todo!() - } + Relation::Derived(r) => r.iter(), Relation::Join(_) => { todo!() } - Relation::Project(_) => { - todo!() - } + Relation::Project(r) => r.iter(tx), } } }