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}
13
14impl SortOrder {
15    pub fn expr(&self) -> &Expr {
16        &self.expr
17    }
18}
19
20/// Ascending sort, nulls first (Spark default for ASC).
21pub fn asc(column: &Column) -> SortOrder {
22    SortOrder {
23        expr: column.expr().clone(),
24        descending: false,
25        nulls_last: false,
26    }
27}
28
29/// Ascending sort, nulls first.
30pub fn asc_nulls_first(column: &Column) -> SortOrder {
31    SortOrder {
32        expr: column.expr().clone(),
33        descending: false,
34        nulls_last: false,
35    }
36}
37
38/// Ascending sort, nulls last.
39pub fn asc_nulls_last(column: &Column) -> SortOrder {
40    SortOrder {
41        expr: column.expr().clone(),
42        descending: false,
43        nulls_last: true,
44    }
45}
46
47/// Descending sort, nulls last (Spark default for DESC).
48pub fn desc(column: &Column) -> SortOrder {
49    SortOrder {
50        expr: column.expr().clone(),
51        descending: true,
52        nulls_last: true,
53    }
54}
55
56/// Descending sort, nulls first.
57pub fn desc_nulls_first(column: &Column) -> SortOrder {
58    SortOrder {
59        expr: column.expr().clone(),
60        descending: true,
61        nulls_last: false,
62    }
63}
64
65/// Descending sort, nulls last.
66pub fn desc_nulls_last(column: &Column) -> SortOrder {
67    SortOrder {
68        expr: column.expr().clone(),
69        descending: true,
70        nulls_last: true,
71    }
72}