sqlint/ast/
ordering.rs

1use crate::ast::{Column, Expression};
2
3/// Defines ordering for an `ORDER BY` statement.
4pub type OrderDefinition<'a> = (Expression<'a>, Option<Order>);
5
6/// A list of definitions for the `ORDER BY` statement.
7#[derive(Debug, Default, PartialEq, Clone)]
8pub struct Ordering<'a>(pub Vec<OrderDefinition<'a>>);
9
10impl<'a> Ordering<'a> {
11    #[doc(hidden)]
12    pub fn append(mut self, value: OrderDefinition<'a>) -> Self {
13        self.0.push(value);
14        self
15    }
16
17    pub fn new(values: Vec<OrderDefinition<'a>>) -> Self {
18        Self(values)
19    }
20
21    pub fn is_empty(&self) -> bool {
22        self.0.is_empty()
23    }
24}
25
26/// The ordering direction
27#[derive(Clone, Copy, Debug, Eq, PartialEq)]
28pub enum Order {
29    /// Ascending
30    Asc,
31    /// Descending
32    Desc,
33    /// Ascending Nulls First
34    AscNullsFirst,
35    /// Ascending Nulls Last
36    AscNullsLast,
37    /// Descending Nulls First
38    DescNullsFirst,
39    /// Descending Nulls Last
40    DescNullsLast,
41}
42
43/// An item that can be used in the `ORDER BY` statement
44pub trait Orderable<'a>
45where
46    Self: Sized,
47{
48    /// Order by `self` in the given order
49    fn order(self, order: Option<Order>) -> OrderDefinition<'a>;
50
51    /// Change the order to `ASC`
52    fn ascend(self) -> OrderDefinition<'a> {
53        self.order(Some(Order::Asc))
54    }
55
56    /// Change the order to `DESC`
57    fn descend(self) -> OrderDefinition<'a> {
58        self.order(Some(Order::Desc))
59    }
60
61    /// Change the order to `ASC NULLS FIRST`
62    fn ascend_nulls_first(self) -> OrderDefinition<'a> {
63        self.order(Some(Order::AscNullsFirst))
64    }
65
66    /// Change the order to `ASC NULLS LAST`
67    fn ascend_nulls_last(self) -> OrderDefinition<'a> {
68        self.order(Some(Order::AscNullsLast))
69    }
70
71    /// Change the order to `DESC NULLS FIRST`
72    fn descend_nulls_first(self) -> OrderDefinition<'a> {
73        self.order(Some(Order::DescNullsFirst))
74    }
75
76    /// Change the order to `ASC NULLS LAST`
77    fn descend_nulls_last(self) -> OrderDefinition<'a> {
78        self.order(Some(Order::DescNullsLast))
79    }
80}
81
82/// Convert the value into an order definition with order item and direction
83pub trait IntoOrderDefinition<'a> {
84    fn into_order_definition(self) -> OrderDefinition<'a>;
85}
86
87impl<'a> IntoOrderDefinition<'a> for &'a str {
88    fn into_order_definition(self) -> OrderDefinition<'a> {
89        let column: Column<'a> = self.into();
90        (column.into(), None)
91    }
92}
93
94impl<'a> IntoOrderDefinition<'a> for Column<'a> {
95    fn into_order_definition(self) -> OrderDefinition<'a> {
96        (self.into(), None)
97    }
98}
99
100impl<'a> IntoOrderDefinition<'a> for OrderDefinition<'a> {
101    fn into_order_definition(self) -> OrderDefinition<'a> {
102        self
103    }
104}
105
106impl<'a> Orderable<'a> for Column<'a> {
107    fn order(self, order: Option<Order>) -> OrderDefinition<'a> {
108        (self.into(), order)
109    }
110}
111
112impl<'a> Orderable<'a> for &'a str {
113    fn order(self, order: Option<Order>) -> OrderDefinition<'a> {
114        let column: Column<'a> = self.into();
115        column.order(order)
116    }
117}
118
119impl<'a> Orderable<'a> for (&'a str, &'a str) {
120    fn order(self, order: Option<Order>) -> OrderDefinition<'a> {
121        let column: Column<'a> = self.into();
122        column.order(order)
123    }
124}