Skip to main content

diesel/query_dsl/
positional_order_dsl.rs

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