use crate::internal::EmbeddedDescription;
use crate::{
filter_builder::{FilterBuilder, Reader},
projection::Projection,
queries::ProjectionResult,
queries::{EmbeddedQuery, Query},
snapshot::Snapshot,
transaction::OwnedSytx,
Fetch, Persistent, Ref, Structsy, StructsyIter,
};
pub struct Filter<T> {
filter_builder: FilterBuilder<T>,
}
impl<T> Filter<T> {
pub fn new() -> Self {
Filter {
filter_builder: FilterBuilder::new(),
}
}
pub(crate) fn extract_filter(self) -> FilterBuilder<T> {
self.filter_builder
}
}
impl<T: Persistent> Filter<T> {
pub fn projection<P: Projection<T>>(self) -> ProjectionResult<P, T> {
ProjectionResult::new(self.filter_builder)
}
}
impl<T> Default for Filter<T> {
fn default() -> Self {
Self::new()
}
}
impl<T: Persistent + 'static> Fetch<(Ref<T>, T)> for Filter<T> {
fn into(self, structsy: &Structsy) -> StructsyIter<(Ref<T>, T)> {
self.fetch(structsy)
}
fn into_tx(self, tx: &mut OwnedSytx) -> StructsyIter<(Ref<T>, T)> {
self.fetch_tx(tx)
}
fn fetch(self, structsy: &Structsy) -> StructsyIter<(Ref<T>, T)> {
let data = self.extract_filter().finish(Reader::Structsy(structsy.clone()));
StructsyIter::new(data)
}
fn fetch_tx(self, tx: &mut OwnedSytx) -> StructsyIter<(Ref<T>, T)> {
let data = self.extract_filter().finish(Reader::Tx(tx.reference()));
StructsyIter::new(data)
}
fn fetch_snapshot(self, snapshot: &Snapshot) -> StructsyIter<(Ref<T>, T)> {
let data = self.extract_filter().finish(Reader::Snapshot(snapshot.clone()));
StructsyIter::new(data)
}
}
impl<T: EmbeddedDescription + 'static> EmbeddedQuery<T> for Filter<T> {
fn filter_builder(&mut self) -> &mut FilterBuilder<T> {
&mut self.filter_builder
}
fn add_group(&mut self, filter: Filter<T>) {
let base = self.filter_builder();
base.and(filter.extract_filter());
}
}
impl<T: Persistent + 'static> Query<T> for Filter<T> {
fn filter_builder(&mut self) -> &mut FilterBuilder<T> {
&mut self.filter_builder
}
fn add_group(&mut self, filter: Filter<T>) {
let base = self.filter_builder();
base.and_filter(filter.extract_filter());
}
}