diesel/query_dsl/
distinct_dsl.rs1use crate::dsl;
2#[cfg(feature = "postgres_backend")]
3use crate::expression::SelectableExpression;
4use crate::expression::TypedExpressionType;
5use crate::expression::ValidGrouping;
6use crate::query_builder::FromClause;
7use crate::query_builder::{AsQuery, SelectStatement};
8use crate::query_source::Table;
9use crate::Expression;
10
11pub trait DistinctDsl {
19 type Output;
21
22 fn distinct(self) -> dsl::Distinct<Self>;
24}
25
26impl<T> DistinctDsl for T
27where
28 T: Table + AsQuery<Query = SelectStatement<FromClause<T>>>,
29 T::DefaultSelection: Expression<SqlType = T::SqlType> + ValidGrouping<()>,
30 T::SqlType: TypedExpressionType,
31{
32 type Output = dsl::Distinct<SelectStatement<FromClause<T>>>;
33
34 fn distinct(self) -> dsl::Distinct<SelectStatement<FromClause<T>>> {
35 self.as_query().distinct()
36 }
37}
38
39#[cfg(feature = "postgres_backend")]
47pub trait DistinctOnDsl<Selection> {
48 type Output;
50
51 fn distinct_on(self, selection: Selection) -> dsl::DistinctOn<Self, Selection>;
53}
54
55#[cfg(feature = "postgres_backend")]
56impl<T, Selection> DistinctOnDsl<Selection> for T
57where
58 Selection: SelectableExpression<T>,
59 T: Table + AsQuery<Query = SelectStatement<FromClause<T>>>,
60 SelectStatement<FromClause<T>>: DistinctOnDsl<Selection>,
61 T::DefaultSelection: Expression<SqlType = T::SqlType> + ValidGrouping<()>,
62 T::SqlType: TypedExpressionType,
63{
64 type Output = dsl::DistinctOn<SelectStatement<FromClause<T>>, Selection>;
65
66 fn distinct_on(self, selection: Selection) -> dsl::DistinctOn<Self, Selection> {
67 self.as_query().distinct_on(selection)
68 }
69}