1use 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 #[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#[derive(Clone, Copy, Debug, Eq, PartialEq)]
28pub enum Order {
29 Asc,
31 Desc,
33 AscNullsFirst,
35 AscNullsLast,
37 DescNullsFirst,
39 DescNullsLast,
41}
42
43pub trait Orderable<'a>
45where
46 Self: Sized,
47{
48 fn order(self, order: Option<Order>) -> OrderDefinition<'a>;
50
51 fn ascend(self) -> OrderDefinition<'a> {
53 self.order(Some(Order::Asc))
54 }
55
56 fn descend(self) -> OrderDefinition<'a> {
58 self.order(Some(Order::Desc))
59 }
60
61 fn ascend_nulls_first(self) -> OrderDefinition<'a> {
63 self.order(Some(Order::AscNullsFirst))
64 }
65
66 fn ascend_nulls_last(self) -> OrderDefinition<'a> {
68 self.order(Some(Order::AscNullsLast))
69 }
70
71 fn descend_nulls_first(self) -> OrderDefinition<'a> {
73 self.order(Some(Order::DescNullsFirst))
74 }
75
76 fn descend_nulls_last(self) -> OrderDefinition<'a> {
78 self.order(Some(Order::DescNullsLast))
79 }
80}
81
82pub 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}