reinhardt_query/types/
order.rs1use super::iden::DynIden;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
13pub enum Order {
14 #[default]
16 Asc,
17 Desc,
19}
20
21impl Order {
22 #[must_use]
24 pub fn as_str(&self) -> &'static str {
25 match self {
26 Self::Asc => "ASC",
27 Self::Desc => "DESC",
28 }
29 }
30}
31
32#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
37pub enum NullOrdering {
38 First,
40 Last,
42}
43
44impl NullOrdering {
45 #[must_use]
47 pub fn as_str(&self) -> &'static str {
48 match self {
49 Self::First => "NULLS FIRST",
50 Self::Last => "NULLS LAST",
51 }
52 }
53}
54
55#[derive(Debug, Clone)]
59pub struct OrderExpr {
60 pub expr: OrderExprKind,
62 pub order: Order,
64 pub nulls: Option<NullOrdering>,
66}
67
68#[derive(Debug, Clone)]
70pub enum OrderExprKind {
71 Column(DynIden),
73 TableColumn(DynIden, DynIden),
75 Expr(Box<crate::expr::SimpleExpr>),
77}
78
79impl OrderExpr {
80 pub fn new<I: super::iden::IntoIden>(column: I) -> Self {
82 Self {
83 expr: OrderExprKind::Column(column.into_iden()),
84 order: Order::Asc,
85 nulls: None,
86 }
87 }
88
89 pub fn new_table_column<T: super::iden::IntoIden, C: super::iden::IntoIden>(
91 table: T,
92 column: C,
93 ) -> Self {
94 Self {
95 expr: OrderExprKind::TableColumn(table.into_iden(), column.into_iden()),
96 order: Order::Asc,
97 nulls: None,
98 }
99 }
100
101 #[must_use]
103 pub fn order(mut self, order: Order) -> Self {
104 self.order = order;
105 self
106 }
107
108 #[must_use]
110 pub fn nulls(mut self, nulls: NullOrdering) -> Self {
111 self.nulls = Some(nulls);
112 self
113 }
114}
115
116#[cfg(test)]
117mod tests {
118 use super::*;
119 use rstest::rstest;
120
121 #[rstest]
122 fn test_order_as_str() {
123 assert_eq!(Order::Asc.as_str(), "ASC");
124 assert_eq!(Order::Desc.as_str(), "DESC");
125 }
126
127 #[rstest]
128 fn test_order_default() {
129 assert_eq!(Order::default(), Order::Asc);
130 }
131
132 #[rstest]
133 fn test_null_ordering_as_str() {
134 assert_eq!(NullOrdering::First.as_str(), "NULLS FIRST");
135 assert_eq!(NullOrdering::Last.as_str(), "NULLS LAST");
136 }
137
138 #[rstest]
139 fn test_order_expr_builder() {
140 let expr = OrderExpr::new("column_name")
141 .order(Order::Desc)
142 .nulls(NullOrdering::Last);
143
144 assert_eq!(expr.order, Order::Desc);
145 assert_eq!(expr.nulls, Some(NullOrdering::Last));
146 }
147}