diesel/pg/query_builder/
only.rs1use 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#[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}