use std::ops::Deref;
use crate::interfaces::Model;
use crate::queries::__private::{Column, HasCols, ModelTable};
use crate::queries::{IntoExpr, Predicate};
pub struct FilterBuilder<M>
where
M: Model + HasCols,
{
table: ModelTable<M>,
predicates: Vec<Predicate>,
}
impl<M> FilterBuilder<M>
where
M: Model + HasCols,
{
pub(crate) fn new(table: ModelTable<M>) -> Self {
Self {
table,
predicates: Vec::new(),
}
}
pub fn filter(mut self, predicate: Predicate) -> Self {
self.predicates.push(predicate);
self
}
pub(crate) fn into_predicates(self) -> Vec<Predicate> {
self.predicates
}
}
impl<M> Deref for FilterBuilder<M>
where
M: Model + HasCols,
{
type Target = <M as HasCols>::Columns;
fn deref(&self) -> &Self::Target {
&self.table
}
}
#[doc(hidden)]
pub fn in_values<T, I, V>(column: &Column<T>, values: I) -> Predicate
where
I: IntoIterator<Item = V>,
V: IntoExpr<T>,
{
crate::queries::__private::in_list(column, values)
}