use super::group_by_clause::ValidGroupByClause;
use super::{BoxedSelectStatement, FromClause, NoFromClause, Query, QueryId, SelectStatement};
use crate::backend::Backend;
use crate::expression::ValidGrouping;
use crate::query_dsl::methods::SelectDsl;
use crate::{AppearsOnTable, QuerySource, SelectableHelper};
pub use diesel_derives::HasQuery;
pub trait HasQuery<DB: Backend>:
SelectableHelper<
DB,
SelectExpression: QueryId
+ AppearsOnTable<<Self::BaseQuery as AcceptedQueries>::From>
+ ValidGrouping<<Self::BaseQuery as AcceptedQueries>::GroupBy>,
>
{
type BaseQuery: AcceptedQueries + SelectDsl<crate::dsl::AsSelect<Self, DB>, Output: Query>;
#[doc(hidden)] fn base_query() -> Self::BaseQuery;
fn query() -> crate::dsl::Select<Self::BaseQuery, crate::dsl::AsSelect<Self, DB>> {
Self::base_query().select(Self::as_select())
}
}
use self::private::AcceptedQueries;
mod private {
use super::*;
pub trait AcceptedQueries {
type From;
type GroupBy;
}
impl<S, D, W, O, LOf, GB, H, L> AcceptedQueries
for SelectStatement<NoFromClause, S, D, W, O, LOf, GB, H, L>
where
GB: ValidGroupByClause,
{
type From = NoFromClause;
type GroupBy = GB::Expressions;
}
impl<F, S, D, W, O, LOf, GB, H, L> AcceptedQueries
for SelectStatement<FromClause<F>, S, D, W, O, LOf, GB, H, L>
where
F: QuerySource,
GB: ValidGroupByClause,
{
type From = F;
type GroupBy = GB::Expressions;
}
impl<'a, ST, DB, GB> AcceptedQueries for BoxedSelectStatement<'a, ST, NoFromClause, DB, GB>
where
GB: ValidGroupByClause,
{
type From = NoFromClause;
type GroupBy = GB::Expressions;
}
impl<'a, ST, F, DB, GB> AcceptedQueries for BoxedSelectStatement<'a, ST, FromClause<F>, DB, GB>
where
F: QuerySource,
GB: ValidGroupByClause,
{
type From = F;
type GroupBy = GB::Expressions;
}
}