diesel/query_builder/
select_clause.rs
1use super::from_clause::AsQuerySource;
2use crate::expression::{Expression, SelectableExpression};
3use crate::query_builder::*;
4use crate::query_source::QuerySource;
5
6#[doc(hidden)]
7pub struct DefaultSelectClause<QS: AsQuerySource> {
8 default_selection: <QS::QuerySource as QuerySource>::DefaultSelection,
9}
10
11impl<QS> std::fmt::Debug for DefaultSelectClause<QS>
12where
13 QS: AsQuerySource,
14 <QS::QuerySource as QuerySource>::DefaultSelection: std::fmt::Debug,
15{
16 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17 f.debug_struct("DefaultSelectClause")
18 .field("default_selection", &self.default_selection)
19 .finish()
20 }
21}
22
23impl<QS> Clone for DefaultSelectClause<QS>
24where
25 QS: AsQuerySource,
26 <QS::QuerySource as QuerySource>::DefaultSelection: Clone,
27{
28 fn clone(&self) -> Self {
29 Self {
30 default_selection: self.default_selection.clone(),
31 }
32 }
33}
34
35impl<QS> Copy for DefaultSelectClause<QS>
36where
37 QS: AsQuerySource,
38 <QS::QuerySource as QuerySource>::DefaultSelection: Copy,
39{
40}
41
42impl<QS: AsQuerySource> DefaultSelectClause<QS> {
43 pub(crate) fn new(qs: &QS) -> Self {
44 Self {
45 default_selection: qs.as_query_source().default_selection(),
46 }
47 }
48}
49
50impl<QS> QueryId for DefaultSelectClause<QS>
51where
52 QS: AsQuerySource,
53 <QS::QuerySource as QuerySource>::DefaultSelection: QueryId,
54{
55 type QueryId = <<QS::QuerySource as QuerySource>::DefaultSelection as QueryId>::QueryId;
56
57 const HAS_STATIC_QUERY_ID: bool =
58 <<QS::QuerySource as QuerySource>::DefaultSelection as QueryId>::HAS_STATIC_QUERY_ID;
59}
60
61#[derive(Debug, Clone, Copy, QueryId)]
62pub struct SelectClause<T>(pub T);
63
64#[cfg_attr(
69 feature = "i-implement-a-third-party-backend-and-opt-into-breaking-changes",
70 cfg(feature = "i-implement-a-third-party-backend-and-opt-into-breaking-changes")
71)]
72pub trait SelectClauseExpression<QS> {
73 type Selection;
75 type SelectClauseSqlType;
77}
78
79impl<T, QS> SelectClauseExpression<FromClause<QS>> for SelectClause<T>
80where
81 QS: QuerySource,
82 T: SelectableExpression<QS>,
83{
84 type Selection = T;
85 type SelectClauseSqlType = T::SqlType;
86}
87
88impl<T> SelectClauseExpression<NoFromClause> for SelectClause<T>
89where
90 T: SelectableExpression<NoFromClause>,
91{
92 type Selection = T;
93 type SelectClauseSqlType = T::SqlType;
94}
95
96impl<QS> SelectClauseExpression<FromClause<QS>> for DefaultSelectClause<FromClause<QS>>
97where
98 QS: QuerySource,
99{
100 type Selection = QS::DefaultSelection;
101 type SelectClauseSqlType = <Self::Selection as Expression>::SqlType;
102}
103
104impl<T, DB> QueryFragment<DB> for SelectClause<T>
105where
106 DB: Backend,
107 T: QueryFragment<DB>,
108{
109 fn walk_ast<'b>(&'b self, pass: AstPass<'_, 'b, DB>) -> QueryResult<()> {
110 self.0.walk_ast(pass)
111 }
112}
113
114impl<QS, DB> QueryFragment<DB> for DefaultSelectClause<QS>
115where
116 DB: Backend,
117 QS: AsQuerySource,
118 <QS::QuerySource as QuerySource>::DefaultSelection: QueryFragment<DB>,
119{
120 fn walk_ast<'b>(&'b self, pass: AstPass<'_, 'b, DB>) -> QueryResult<()> {
121 self.default_selection.walk_ast(pass)
122 }
123}