1use crate::backend::{Backend, DieselReserveSpecialization};
2use crate::expression::helper_types::{Asc, Desc};
3use crate::expression::Expression;
4use crate::query_builder::{AstPass, QueryFragment, QueryId};
5use crate::QueryResult;
6
7pub trait PositionalOrderDsl<Expr: IntoPositionalOrderExpr> {
17 type Output;
19
20 fn positional_order_by(self, expr: Expr) -> Self::Output;
22}
23
24pub trait PositionalOrderExpr: Expression {}
25
26impl PositionalOrderExpr for OrderColumn {}
27impl<T: PositionalOrderExpr> PositionalOrderExpr for Asc<T> {}
28impl<T: PositionalOrderExpr> PositionalOrderExpr for Desc<T> {}
29
30pub trait IntoPositionalOrderExpr {
31 type Output: PositionalOrderExpr;
32
33 fn into_positional_expr(self) -> Self::Output;
34}
35
36impl IntoPositionalOrderExpr for u32 {
37 type Output = OrderColumn;
38
39 fn into_positional_expr(self) -> Self::Output {
40 self.into()
41 }
42}
43impl<T: PositionalOrderExpr> IntoPositionalOrderExpr for Asc<T> {
44 type Output = Asc<T>;
45
46 fn into_positional_expr(self) -> Self::Output {
47 self
48 }
49}
50impl<T: PositionalOrderExpr> IntoPositionalOrderExpr for Desc<T> {
51 type Output = Desc<T>;
52
53 fn into_positional_expr(self) -> Self::Output {
54 self
55 }
56}
57
58#[derive(#[automatically_derived]
impl ::core::fmt::Debug for OrderColumn {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_tuple_field1_finish(f, "OrderColumn",
&&self.0)
}
}Debug, #[automatically_derived]
impl ::core::clone::Clone for OrderColumn {
#[inline]
fn clone(&self) -> OrderColumn {
let _: ::core::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for OrderColumn { }Copy, const _: () =
{
use diesel;
#[allow(non_camel_case_types)]
impl diesel::query_builder::QueryId for OrderColumn {
type QueryId = OrderColumn<>;
const HAS_STATIC_QUERY_ID: bool = true;
const IS_WINDOW_FUNCTION: bool = false;
}
};QueryId)]
59pub struct OrderColumn(pub u32);
60
61impl Expression for OrderColumn {
62 type SqlType = crate::sql_types::Integer;
63}
64
65impl<DB> QueryFragment<DB> for OrderColumn
66where
67 DB: Backend + DieselReserveSpecialization,
68{
69 fn walk_ast<'b>(&'b self, mut pass: AstPass<'_, 'b, DB>) -> QueryResult<()> {
70 pass.push_sql(&self.0.to_string());
71 Ok(())
72 }
73}
74
75impl From<u32> for OrderColumn {
76 fn from(order: u32) -> Self {
77 OrderColumn(order)
78 }
79}
80
81macro_rules! impl_positional_order_expr_for_all_tuples {
82 ($(
83 $unused1:tt {
84 $(($idx:tt) -> $T:ident, $U:ident, $unused3:tt,)+
85 }
86 )+) => {
87 $(
88 impl<$($T: PositionalOrderExpr),+> PositionalOrderExpr for ($($T,)+) { }
89
90 impl<$($T, $U,)+> IntoPositionalOrderExpr for ($($T,)+)
91 where
92 $($T: IntoPositionalOrderExpr<Output = $U>,)+
93 $($U: PositionalOrderExpr,)+
94 {
95 type Output = ($($U,)+);
96
97 fn into_positional_expr(self) -> Self::Output {
98 ($(self.$idx.into_positional_expr(),)+)
99 }
100 }
101 )+
102 };
103}
104
105impl<T: PositionalOrderExpr, T1: PositionalOrderExpr, T2: PositionalOrderExpr,
T3: PositionalOrderExpr, T4: PositionalOrderExpr, T5: PositionalOrderExpr,
T6: PositionalOrderExpr, T7: PositionalOrderExpr, T8: PositionalOrderExpr,
T9: PositionalOrderExpr, T10: PositionalOrderExpr,
T11: PositionalOrderExpr, T12: PositionalOrderExpr,
T13: PositionalOrderExpr, T14: PositionalOrderExpr,
T15: PositionalOrderExpr, T16: PositionalOrderExpr,
T17: PositionalOrderExpr, T18: PositionalOrderExpr,
T19: PositionalOrderExpr, T20: PositionalOrderExpr,
T21: PositionalOrderExpr, T22: PositionalOrderExpr,
T23: PositionalOrderExpr, T24: PositionalOrderExpr,
T25: PositionalOrderExpr, T26: PositionalOrderExpr,
T27: PositionalOrderExpr, T28: PositionalOrderExpr,
T29: PositionalOrderExpr, T30: PositionalOrderExpr,
T31: PositionalOrderExpr> PositionalOrderExpr 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)
{}
impl<T, ST, T1, ST1, T2, ST2, T3, ST3, T4, ST4, T5, ST5, T6, ST6, T7, ST7, T8,
ST8, T9, ST9, T10, ST10, T11, ST11, T12, ST12, T13, ST13, T14, ST14, T15,
ST15, T16, ST16, T17, ST17, T18, ST18, T19, ST19, T20, ST20, T21, ST21,
T22, ST22, T23, ST23, T24, ST24, T25, ST25, T26, ST26, T27, ST27, T28,
ST28, T29, ST29, T30, ST30, T31, ST31> IntoPositionalOrderExpr 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 T: IntoPositionalOrderExpr<Output = ST>,
T1: IntoPositionalOrderExpr<Output = ST1>,
T2: IntoPositionalOrderExpr<Output = ST2>,
T3: IntoPositionalOrderExpr<Output = ST3>,
T4: IntoPositionalOrderExpr<Output = ST4>,
T5: IntoPositionalOrderExpr<Output = ST5>,
T6: IntoPositionalOrderExpr<Output = ST6>,
T7: IntoPositionalOrderExpr<Output = ST7>,
T8: IntoPositionalOrderExpr<Output = ST8>,
T9: IntoPositionalOrderExpr<Output = ST9>,
T10: IntoPositionalOrderExpr<Output = ST10>,
T11: IntoPositionalOrderExpr<Output = ST11>,
T12: IntoPositionalOrderExpr<Output = ST12>,
T13: IntoPositionalOrderExpr<Output = ST13>,
T14: IntoPositionalOrderExpr<Output = ST14>,
T15: IntoPositionalOrderExpr<Output = ST15>,
T16: IntoPositionalOrderExpr<Output = ST16>,
T17: IntoPositionalOrderExpr<Output = ST17>,
T18: IntoPositionalOrderExpr<Output = ST18>,
T19: IntoPositionalOrderExpr<Output = ST19>,
T20: IntoPositionalOrderExpr<Output = ST20>,
T21: IntoPositionalOrderExpr<Output = ST21>,
T22: IntoPositionalOrderExpr<Output = ST22>,
T23: IntoPositionalOrderExpr<Output = ST23>,
T24: IntoPositionalOrderExpr<Output = ST24>,
T25: IntoPositionalOrderExpr<Output = ST25>,
T26: IntoPositionalOrderExpr<Output = ST26>,
T27: IntoPositionalOrderExpr<Output = ST27>,
T28: IntoPositionalOrderExpr<Output = ST28>,
T29: IntoPositionalOrderExpr<Output = ST29>,
T30: IntoPositionalOrderExpr<Output = ST30>,
T31: IntoPositionalOrderExpr<Output = ST31>, ST: PositionalOrderExpr,
ST1: PositionalOrderExpr, ST2: PositionalOrderExpr,
ST3: PositionalOrderExpr, ST4: PositionalOrderExpr,
ST5: PositionalOrderExpr, ST6: PositionalOrderExpr,
ST7: PositionalOrderExpr, ST8: PositionalOrderExpr,
ST9: PositionalOrderExpr, ST10: PositionalOrderExpr,
ST11: PositionalOrderExpr, ST12: PositionalOrderExpr,
ST13: PositionalOrderExpr, ST14: PositionalOrderExpr,
ST15: PositionalOrderExpr, ST16: PositionalOrderExpr,
ST17: PositionalOrderExpr, ST18: PositionalOrderExpr,
ST19: PositionalOrderExpr, ST20: PositionalOrderExpr,
ST21: PositionalOrderExpr, ST22: PositionalOrderExpr,
ST23: PositionalOrderExpr, ST24: PositionalOrderExpr,
ST25: PositionalOrderExpr, ST26: PositionalOrderExpr,
ST27: PositionalOrderExpr, ST28: PositionalOrderExpr,
ST29: PositionalOrderExpr, ST30: PositionalOrderExpr,
ST31: PositionalOrderExpr {
type Output =
(ST, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8, ST9, ST10, ST11, ST12,
ST13, ST14, ST15, ST16, ST17, ST18, ST19, ST20, ST21, ST22, ST23,
ST24, ST25, ST26, ST27, ST28, ST29, ST30, ST31);
fn into_positional_expr(self) -> Self::Output {
(self.0.into_positional_expr(), self.1.into_positional_expr(),
self.2.into_positional_expr(), self.3.into_positional_expr(),
self.4.into_positional_expr(), self.5.into_positional_expr(),
self.6.into_positional_expr(), self.7.into_positional_expr(),
self.8.into_positional_expr(), self.9.into_positional_expr(),
self.10.into_positional_expr(), self.11.into_positional_expr(),
self.12.into_positional_expr(), self.13.into_positional_expr(),
self.14.into_positional_expr(), self.15.into_positional_expr(),
self.16.into_positional_expr(), self.17.into_positional_expr(),
self.18.into_positional_expr(), self.19.into_positional_expr(),
self.20.into_positional_expr(), self.21.into_positional_expr(),
self.22.into_positional_expr(), self.23.into_positional_expr(),
self.24.into_positional_expr(), self.25.into_positional_expr(),
self.26.into_positional_expr(), self.27.into_positional_expr(),
self.28.into_positional_expr(), self.29.into_positional_expr(),
self.30.into_positional_expr(), self.31.into_positional_expr())
}
}diesel_derives::__diesel_for_each_tuple!(impl_positional_order_expr_for_all_tuples);