1use crate::QueryResult;
2use crate::backend::{Backend, DieselReserveSpecialization};
3use crate::expression::Expression;
4use crate::expression::helper_types::{Asc, Desc};
5use crate::query_builder::{AstPass, QueryFragment, QueryId};
6use alloc::string::ToString;
7
8pub trait PositionalOrderDsl<Expr: IntoPositionalOrderExpr> {
18 type Output;
20
21 fn positional_order_by(self, expr: Expr) -> Self::Output;
23}
24
25pub trait PositionalOrderExpr: Expression {}
26
27impl PositionalOrderExpr for OrderColumn {}
28impl<T: PositionalOrderExpr> PositionalOrderExpr for Asc<T> {}
29impl<T: PositionalOrderExpr> PositionalOrderExpr for Desc<T> {}
30
31pub trait IntoPositionalOrderExpr {
32 type Output: PositionalOrderExpr;
33
34 fn into_positional_expr(self) -> Self::Output;
35}
36
37impl IntoPositionalOrderExpr for u32 {
38 type Output = OrderColumn;
39
40 fn into_positional_expr(self) -> Self::Output {
41 self.into()
42 }
43}
44impl<T: PositionalOrderExpr> IntoPositionalOrderExpr for Asc<T> {
45 type Output = Asc<T>;
46
47 fn into_positional_expr(self) -> Self::Output {
48 self
49 }
50}
51impl<T: PositionalOrderExpr> IntoPositionalOrderExpr for Desc<T> {
52 type Output = Desc<T>;
53
54 fn into_positional_expr(self) -> Self::Output {
55 self
56 }
57}
58
59#[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)]
60pub struct OrderColumn(pub u32);
61
62impl Expression for OrderColumn {
63 type SqlType = crate::sql_types::Integer;
64}
65
66impl<DB> QueryFragment<DB> for OrderColumn
67where
68 DB: Backend + DieselReserveSpecialization,
69{
70 fn walk_ast<'b>(&'b self, mut pass: AstPass<'_, 'b, DB>) -> QueryResult<()> {
71 pass.push_sql(&self.0.to_string());
72 Ok(())
73 }
74}
75
76impl From<u32> for OrderColumn {
77 fn from(order: u32) -> Self {
78 OrderColumn(order)
79 }
80}
81
82macro_rules! impl_positional_order_expr_for_all_tuples {
83 ($(
84 $unused1:tt {
85 $(($idx:tt) -> $T:ident, $U:ident, $unused3:tt,)+
86 }
87 )+) => {
88 $(
89 impl<$($T: PositionalOrderExpr),+> PositionalOrderExpr for ($($T,)+) { }
90
91 impl<$($T, $U,)+> IntoPositionalOrderExpr for ($($T,)+)
92 where
93 $($T: IntoPositionalOrderExpr<Output = $U>,)+
94 $($U: PositionalOrderExpr,)+
95 {
96 type Output = ($($U,)+);
97
98 fn into_positional_expr(self) -> Self::Output {
99 ($(self.$idx.into_positional_expr(),)+)
100 }
101 }
102 )+
103 };
104}
105
106impl<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);