use super::iden::DynIden;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum Order {
#[default]
Asc,
Desc,
}
impl Order {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
Self::Asc => "ASC",
Self::Desc => "DESC",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum NullOrdering {
First,
Last,
}
impl NullOrdering {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
Self::First => "NULLS FIRST",
Self::Last => "NULLS LAST",
}
}
}
#[derive(Debug, Clone)]
pub struct OrderExpr {
pub expr: OrderExprKind,
pub order: Order,
pub nulls: Option<NullOrdering>,
}
#[derive(Debug, Clone)]
pub enum OrderExprKind {
Column(DynIden),
TableColumn(DynIden, DynIden),
Expr(Box<crate::expr::SimpleExpr>),
}
impl OrderExpr {
pub fn new<I: super::iden::IntoIden>(column: I) -> Self {
Self {
expr: OrderExprKind::Column(column.into_iden()),
order: Order::Asc,
nulls: None,
}
}
pub fn new_table_column<T: super::iden::IntoIden, C: super::iden::IntoIden>(
table: T,
column: C,
) -> Self {
Self {
expr: OrderExprKind::TableColumn(table.into_iden(), column.into_iden()),
order: Order::Asc,
nulls: None,
}
}
#[must_use]
pub fn order(mut self, order: Order) -> Self {
self.order = order;
self
}
#[must_use]
pub fn nulls(mut self, nulls: NullOrdering) -> Self {
self.nulls = Some(nulls);
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use rstest::rstest;
#[rstest]
fn test_order_as_str() {
assert_eq!(Order::Asc.as_str(), "ASC");
assert_eq!(Order::Desc.as_str(), "DESC");
}
#[rstest]
fn test_order_default() {
assert_eq!(Order::default(), Order::Asc);
}
#[rstest]
fn test_null_ordering_as_str() {
assert_eq!(NullOrdering::First.as_str(), "NULLS FIRST");
assert_eq!(NullOrdering::Last.as_str(), "NULLS LAST");
}
#[rstest]
fn test_order_expr_builder() {
let expr = OrderExpr::new("column_name")
.order(Order::Desc)
.nulls(NullOrdering::Last);
assert_eq!(expr.order, Order::Desc);
assert_eq!(expr.nulls, Some(NullOrdering::Last));
}
}