use std::collections::HashMap;
use std::marker::PhantomData;
use std::sync::Arc;
use crate::entity::IEntityType;
use crate::provider::IDatabaseProvider;
use super::super::ast::{BoolExpr, CompiledFilter};
use super::super::compile::collect_bool_expr_values;
use super::super::state::QueryState;
#[derive(Clone)]
pub struct QueryBuilder<T: IEntityType> {
pub(super) state: QueryState,
pub(super) provider: Option<Arc<dyn IDatabaseProvider>>,
pub(super) filter_map: Option<Arc<HashMap<String, CompiledFilter>>>,
pub(super) lazy_loading_enabled: bool,
pub(super) _phantom: PhantomData<T>,
}
impl<T: IEntityType> QueryBuilder<T> {
pub fn new(table_name: impl Into<String>) -> Self {
Self {
state: QueryState::new(table_name),
provider: None,
filter_map: None,
lazy_loading_enabled: false,
_phantom: PhantomData,
}
}
pub fn with_provider(
table_name: impl Into<String>,
provider: Arc<dyn IDatabaseProvider>,
) -> Self {
Self {
state: QueryState::new(table_name),
provider: Some(provider),
filter_map: None,
lazy_loading_enabled: false,
_phantom: PhantomData,
}
}
pub(crate) fn with_filter_map(
mut self,
map: Option<Arc<HashMap<String, CompiledFilter>>>,
) -> Self {
self.filter_map = map;
self
}
pub(crate) fn with_lazy_loading(mut self, enabled: bool) -> Self {
self.lazy_loading_enabled = enabled;
self
}
pub fn state(&self) -> &QueryState {
&self.state
}
pub fn filter(self, f: impl FnOnce(Self) -> Self) -> Self {
f(self)
}
pub(crate) fn apply_query_filter(mut self, filter: BoolExpr) -> Self {
let values = collect_bool_expr_values(&filter);
self.state.parameters.extend(values);
self.state.append_bool_expr(filter);
self
}
}