diesel/pg/query_builder/
only.rs

1use crate::expression::{Expression, ValidGrouping};
2use crate::pg::Pg;
3use crate::query_builder::{AsQuery, AstPass, FromClause, QueryFragment, QueryId, SelectStatement};
4use crate::query_source::private::PlainQuerySource;
5use crate::query_source::{QueryRelation, QuerySource, TableNotEqual};
6use crate::result::QueryResult;
7use crate::{JoinTo, SelectableExpression, Table};
8
9/// Represents a query with an `ONLY` clause.
10#[derive(#[automatically_derived]
impl<S: ::core::fmt::Debug> ::core::fmt::Debug for Only<S> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "Only",
            "source", &&self.source)
    }
}Debug, #[automatically_derived]
impl<S: ::core::clone::Clone> ::core::clone::Clone for Only<S> {
    #[inline]
    fn clone(&self) -> Only<S> {
        Only { source: ::core::clone::Clone::clone(&self.source) }
    }
}Clone, #[automatically_derived]
impl<S: ::core::marker::Copy> ::core::marker::Copy for Only<S> { }Copy, #[automatically_derived]
impl<S: ::core::default::Default> ::core::default::Default for Only<S> {
    #[inline]
    fn default() -> Only<S> {
        Only { source: ::core::default::Default::default() }
    }
}Default)]
11pub struct Only<S> {
12    pub(crate) source: S,
13}
14
15#[diagnostic::do_not_recommend]
16impl<T1, T2> TableNotEqual<T1> for Only<T2>
17where
18    T1: PlainQuerySource,
19    T2: TableNotEqual<T1>,
20    Self: Table,
21{
22}
23
24#[diagnostic::do_not_recommend]
25impl<T1, T2> TableNotEqual<Only<T1>> for T2
26where
27    T1: QueryRelation,
28    T2: PlainQuerySource + TableNotEqual<T1>,
29    Only<T1>: Table,
30{
31}
32
33impl<S> QueryId for Only<S>
34where
35    Self: 'static,
36    S: QueryId,
37{
38    type QueryId = Self;
39    const HAS_STATIC_QUERY_ID: bool = <S as QueryId>::HAS_STATIC_QUERY_ID;
40}
41
42impl<S> QuerySource for Only<S>
43where
44    S: Table + Clone,
45    <S as QuerySource>::DefaultSelection: ValidGrouping<()> + SelectableExpression<Only<S>>,
46{
47    type FromClause = Self;
48    type DefaultSelection = <S as QuerySource>::DefaultSelection;
49
50    fn from_clause(&self) -> Self::FromClause {
51        self.clone()
52    }
53
54    fn default_selection(&self) -> Self::DefaultSelection {
55        self.source.default_selection()
56    }
57}
58
59impl<S> QueryFragment<Pg> for Only<S>
60where
61    S: QueryFragment<Pg>,
62{
63    fn walk_ast<'b>(&'b self, mut pass: AstPass<'_, 'b, Pg>) -> QueryResult<()> {
64        pass.push_sql(" ONLY ");
65        self.source.walk_ast(pass.reborrow())?;
66        Ok(())
67    }
68}
69
70impl<S> AsQuery for Only<S>
71where
72    S: Table + Clone,
73    <S as QuerySource>::DefaultSelection: ValidGrouping<()> + SelectableExpression<Only<S>>,
74{
75    type SqlType = <<Self as QuerySource>::DefaultSelection as Expression>::SqlType;
76    type Query = SelectStatement<FromClause<Self>>;
77
78    fn as_query(self) -> Self::Query {
79        SelectStatement::simple(self)
80    }
81}
82
83impl<S, T> JoinTo<T> for Only<S>
84where
85    S: JoinTo<T>,
86    T: Table,
87    S: Table,
88{
89    type FromClause = <S as JoinTo<T>>::FromClause;
90    type OnClause = <S as JoinTo<T>>::OnClause;
91
92    fn join_target(rhs: T) -> (Self::FromClause, Self::OnClause) {
93        <S as JoinTo<T>>::join_target(rhs)
94    }
95}
96impl<S> Table for Only<S>
97where
98    S: Table + Clone + AsQuery,
99
100    <S as Table>::PrimaryKey: SelectableExpression<Only<S>>,
101    <S as Table>::AllColumns: SelectableExpression<Only<S>>,
102    <S as QuerySource>::DefaultSelection: ValidGrouping<()> + SelectableExpression<Only<S>>,
103{
104    type PrimaryKey = <S as Table>::PrimaryKey;
105    type AllColumns = <S as Table>::AllColumns;
106
107    fn primary_key(&self) -> Self::PrimaryKey {
108        self.source.primary_key()
109    }
110
111    fn all_columns() -> Self::AllColumns {
112        S::all_columns()
113    }
114}