diesel/query_dsl/
positional_order_dsl.rs

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
7/// The `positional_order_by` method
8///
9/// This trait is not yet part of Diesel's public API. It may change in the
10/// future without a major version bump.
11///
12/// This trait exists as a stop-gap for users who need to order by column position
13/// in their queries, so that they are not forced to drop entirely to raw SQL. The
14/// arguments to `positional_order_by` are not checked, nor is the select statement
15/// forced to be valid.
16pub trait PositionalOrderDsl<Expr: IntoPositionalOrderExpr> {
17    /// The type returned by `.positional_order_by`
18    type Output;
19
20    /// See the trait documentation.
21    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);