1use super::{Alias, AliasSource, AliasedField};
2
3use crate::expression;
4use crate::query_source::{QueryRelation, QueryRelationField, TableNotEqual};
5
6pub trait FieldAliasMapper<S> {
17 type Out;
22
23 fn map(self, alias: &Alias<S>) -> Self::Out;
25}
26
27#[doc(hidden)]
28pub trait FieldAliasMapperAssociatedTypesDisjointnessTrick<CT, S, C> {
33 type Out;
34 fn map(column: C, alias: &Alias<S>) -> Self::Out;
35}
36impl<S, C> FieldAliasMapper<S> for C
37where
38 S: AliasSource,
39 C: QueryRelationField,
40 S::Target: FieldAliasMapperAssociatedTypesDisjointnessTrick<C::QueryRelation, S, C>,
41{
42 type Out = <S::Target as FieldAliasMapperAssociatedTypesDisjointnessTrick<
43 C::QueryRelation,
44 S,
45 C,
46 >>::Out;
47
48 fn map(self, alias: &Alias<S>) -> Self::Out {
49 <S::Target as FieldAliasMapperAssociatedTypesDisjointnessTrick<C::QueryRelation, S, C>>::map(
50 self, alias,
51 )
52 }
53}
54
55impl<TS, TC, S, C> FieldAliasMapperAssociatedTypesDisjointnessTrick<TC, S, C> for TS
56where
57 S: AliasSource<Target = TS>,
58 C: QueryRelationField<QueryRelation = TC>,
59 TC: QueryRelation,
60 TS: TableNotEqual<TC>,
61{
62 type Out = C;
63
64 fn map(column: C, _alias: &Alias<S>) -> Self::Out {
65 column
67 }
68}
69
70macro_rules! field_alias_mapper {
71 ($(
72 $Tuple:tt {
73 $(($idx:tt) -> $T:ident, $ST:ident, $TT:ident,)+
74 }
75 )+) => {
76 $(
77 impl<_S, $($T,)*> FieldAliasMapper<_S> for ($($T,)*)
78 where
79 _S: AliasSource,
80 $($T: FieldAliasMapper<_S>,)*
81 {
82 type Out = ($(<$T as FieldAliasMapper<_S>>::Out,)*);
83
84 fn map(self, alias: &Alias<_S>) -> Self::Out {
85 (
86 $(self.$idx.map(alias),)*
87 )
88 }
89 }
90 )*
91 }
92}
93
94impl<_S, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
T31> FieldAliasMapper<_S> for
(T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16,
T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31)
where _S: AliasSource, T: FieldAliasMapper<_S>, T1: FieldAliasMapper<_S>,
T2: FieldAliasMapper<_S>, T3: FieldAliasMapper<_S>,
T4: FieldAliasMapper<_S>, T5: FieldAliasMapper<_S>,
T6: FieldAliasMapper<_S>, T7: FieldAliasMapper<_S>,
T8: FieldAliasMapper<_S>, T9: FieldAliasMapper<_S>,
T10: FieldAliasMapper<_S>, T11: FieldAliasMapper<_S>,
T12: FieldAliasMapper<_S>, T13: FieldAliasMapper<_S>,
T14: FieldAliasMapper<_S>, T15: FieldAliasMapper<_S>,
T16: FieldAliasMapper<_S>, T17: FieldAliasMapper<_S>,
T18: FieldAliasMapper<_S>, T19: FieldAliasMapper<_S>,
T20: FieldAliasMapper<_S>, T21: FieldAliasMapper<_S>,
T22: FieldAliasMapper<_S>, T23: FieldAliasMapper<_S>,
T24: FieldAliasMapper<_S>, T25: FieldAliasMapper<_S>,
T26: FieldAliasMapper<_S>, T27: FieldAliasMapper<_S>,
T28: FieldAliasMapper<_S>, T29: FieldAliasMapper<_S>,
T30: FieldAliasMapper<_S>, T31: FieldAliasMapper<_S> {
type Out =
(<T as FieldAliasMapper<_S>>::Out, <T1 as FieldAliasMapper<_S>>::Out,
<T2 as FieldAliasMapper<_S>>::Out, <T3 as FieldAliasMapper<_S>>::Out,
<T4 as FieldAliasMapper<_S>>::Out, <T5 as FieldAliasMapper<_S>>::Out,
<T6 as FieldAliasMapper<_S>>::Out, <T7 as FieldAliasMapper<_S>>::Out,
<T8 as FieldAliasMapper<_S>>::Out, <T9 as FieldAliasMapper<_S>>::Out,
<T10 as FieldAliasMapper<_S>>::Out,
<T11 as FieldAliasMapper<_S>>::Out,
<T12 as FieldAliasMapper<_S>>::Out,
<T13 as FieldAliasMapper<_S>>::Out,
<T14 as FieldAliasMapper<_S>>::Out,
<T15 as FieldAliasMapper<_S>>::Out,
<T16 as FieldAliasMapper<_S>>::Out,
<T17 as FieldAliasMapper<_S>>::Out,
<T18 as FieldAliasMapper<_S>>::Out,
<T19 as FieldAliasMapper<_S>>::Out,
<T20 as FieldAliasMapper<_S>>::Out,
<T21 as FieldAliasMapper<_S>>::Out,
<T22 as FieldAliasMapper<_S>>::Out,
<T23 as FieldAliasMapper<_S>>::Out,
<T24 as FieldAliasMapper<_S>>::Out,
<T25 as FieldAliasMapper<_S>>::Out,
<T26 as FieldAliasMapper<_S>>::Out,
<T27 as FieldAliasMapper<_S>>::Out,
<T28 as FieldAliasMapper<_S>>::Out,
<T29 as FieldAliasMapper<_S>>::Out,
<T30 as FieldAliasMapper<_S>>::Out,
<T31 as FieldAliasMapper<_S>>::Out);
fn map(self, alias: &Alias<_S>) -> Self::Out {
(self.0.map(alias), self.1.map(alias), self.2.map(alias),
self.3.map(alias), self.4.map(alias), self.5.map(alias),
self.6.map(alias), self.7.map(alias), self.8.map(alias),
self.9.map(alias), self.10.map(alias), self.11.map(alias),
self.12.map(alias), self.13.map(alias), self.14.map(alias),
self.15.map(alias), self.16.map(alias), self.17.map(alias),
self.18.map(alias), self.19.map(alias), self.20.map(alias),
self.21.map(alias), self.22.map(alias), self.23.map(alias),
self.24.map(alias), self.25.map(alias), self.26.map(alias),
self.27.map(alias), self.28.map(alias), self.29.map(alias),
self.30.map(alias), self.31.map(alias))
}
}diesel_derives::__diesel_for_each_tuple!(field_alias_mapper);
95
96impl<SPrev, SNew, F> FieldAliasMapper<SNew> for AliasedField<SPrev, F>
99where
100 SNew: AliasSource,
101{
102 type Out = Self;
103
104 fn map(self, _alias: &Alias<SNew>) -> Self::Out {
105 self
107 }
108}
109
110impl<S, F> FieldAliasMapper<S> for expression::nullable::Nullable<F>
111where
112 F: FieldAliasMapper<S>,
113{
114 type Out = expression::nullable::Nullable<<F as FieldAliasMapper<S>>::Out>;
115
116 fn map(self, alias: &Alias<S>) -> Self::Out {
117 expression::nullable::Nullable::new(self.0.map(alias))
118 }
119}
120
121impl<S, F> FieldAliasMapper<S> for expression::grouped::Grouped<F>
122where
123 F: FieldAliasMapper<S>,
124{
125 type Out = expression::grouped::Grouped<<F as FieldAliasMapper<S>>::Out>;
126
127 fn map(self, alias: &Alias<S>) -> Self::Out {
128 expression::grouped::Grouped(self.0.map(alias))
129 }
130}