grafbase_sql_ast/ast/
ordering.rs1use crate::ast::{Column, Expression};
2
3pub type OrderDefinition<'a> = (Expression<'a>, Option<Order>);
5
6#[derive(Debug, Default, PartialEq, Clone)]
8pub struct Ordering<'a>(pub Vec<OrderDefinition<'a>>);
9
10impl<'a> Ordering<'a> {
11    pub fn append(&mut self, value: OrderDefinition<'a>) {
12        self.0.push(value);
13    }
14
15    pub fn new(values: Vec<OrderDefinition<'a>>) -> Self {
16        Self(values)
17    }
18
19    pub fn is_empty(&self) -> bool {
20        self.0.is_empty()
21    }
22}
23
24#[derive(Clone, Copy, Debug, Eq, PartialEq)]
26pub enum Order {
27    Asc,
29    Desc,
31    AscNullsFirst,
33    AscNullsLast,
35    DescNullsFirst,
37    DescNullsLast,
39}
40
41pub trait Orderable<'a>
43where
44    Self: Sized,
45{
46    fn order(self, order: Option<Order>) -> OrderDefinition<'a>;
48
49    fn ascend(self) -> OrderDefinition<'a> {
51        self.order(Some(Order::Asc))
52    }
53
54    fn descend(self) -> OrderDefinition<'a> {
56        self.order(Some(Order::Desc))
57    }
58
59    fn ascend_nulls_first(self) -> OrderDefinition<'a> {
61        self.order(Some(Order::AscNullsFirst))
62    }
63
64    fn ascend_nulls_last(self) -> OrderDefinition<'a> {
66        self.order(Some(Order::AscNullsLast))
67    }
68
69    fn descend_nulls_first(self) -> OrderDefinition<'a> {
71        self.order(Some(Order::DescNullsFirst))
72    }
73
74    fn descend_nulls_last(self) -> OrderDefinition<'a> {
76        self.order(Some(Order::DescNullsLast))
77    }
78}
79
80pub trait IntoOrderDefinition<'a> {
82    fn into_order_definition(self) -> OrderDefinition<'a>;
83}
84
85impl<'a> IntoOrderDefinition<'a> for &'a str {
86    fn into_order_definition(self) -> OrderDefinition<'a> {
87        let column: Column<'a> = self.into();
88        (column.into(), None)
89    }
90}
91
92impl<'a> IntoOrderDefinition<'a> for Column<'a> {
93    fn into_order_definition(self) -> OrderDefinition<'a> {
94        (self.into(), None)
95    }
96}
97
98impl<'a> IntoOrderDefinition<'a> for OrderDefinition<'a> {
99    fn into_order_definition(self) -> OrderDefinition<'a> {
100        self
101    }
102}
103
104impl<'a> Orderable<'a> for Column<'a> {
105    fn order(self, order: Option<Order>) -> OrderDefinition<'a> {
106        (self.into(), order)
107    }
108}
109
110impl<'a> Orderable<'a> for &'a str {
111    fn order(self, order: Option<Order>) -> OrderDefinition<'a> {
112        let column: Column<'a> = self.into();
113        column.order(order)
114    }
115}
116
117impl<'a> Orderable<'a> for (&'a str, &'a str) {
118    fn order(self, order: Option<Order>) -> OrderDefinition<'a> {
119        let column: Column<'a> = self.into();
120        column.order(order)
121    }
122}