Skip to main content

robin_sparkless_polars/functions/
sort.rs

1//! Sort order specification for orderBy/sort.
2
3use crate::column::Column;
4use polars::prelude::Expr;
5
6/// Sort order specification for use in orderBy/sort. Holds expr + direction + null placement.
7#[derive(Debug, Clone)]
8pub struct SortOrder {
9    pub(crate) expr: Expr,
10    pub descending: bool,
11    pub nulls_last: bool,
12    pub(crate) column_name: String,
13}
14
15impl SortOrder {
16    pub fn expr(&self) -> &Expr {
17        &self.expr
18    }
19
20    pub fn column_name(&self) -> &str {
21        &self.column_name
22    }
23}
24
25/// Ascending sort, nulls first (Spark default for ASC).
26pub fn asc(column: &Column) -> SortOrder {
27    SortOrder {
28        expr: column.expr().clone(),
29        descending: false,
30        nulls_last: false,
31        column_name: column.name().to_string(),
32    }
33}
34
35/// Ascending sort, nulls first.
36pub fn asc_nulls_first(column: &Column) -> SortOrder {
37    SortOrder {
38        expr: column.expr().clone(),
39        descending: false,
40        nulls_last: false,
41        column_name: column.name().to_string(),
42    }
43}
44
45/// Ascending sort, nulls last.
46pub fn asc_nulls_last(column: &Column) -> SortOrder {
47    SortOrder {
48        expr: column.expr().clone(),
49        descending: false,
50        nulls_last: true,
51        column_name: column.name().to_string(),
52    }
53}
54
55/// Descending sort, nulls last (Spark default for DESC).
56pub fn desc(column: &Column) -> SortOrder {
57    SortOrder {
58        expr: column.expr().clone(),
59        descending: true,
60        nulls_last: true,
61        column_name: column.name().to_string(),
62    }
63}
64
65/// Descending sort, nulls first.
66pub fn desc_nulls_first(column: &Column) -> SortOrder {
67    SortOrder {
68        expr: column.expr().clone(),
69        descending: true,
70        nulls_last: false,
71        column_name: column.name().to_string(),
72    }
73}
74
75/// Descending sort, nulls last.
76pub fn desc_nulls_last(column: &Column) -> SortOrder {
77    SortOrder {
78        expr: column.expr().clone(),
79        descending: true,
80        nulls_last: true,
81        column_name: column.name().to_string(),
82    }
83}
84
85/// Ascending sort by column name (for orderBy with mixed string/Column exprs).
86pub fn asc_from_name(name: &str) -> SortOrder {
87    asc(&Column::new(name.to_string()))
88}