-
Notifications
You must be signed in to change notification settings - Fork 745
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add additional documentation and builder APIs to SortOptions
#6441
Changes from 2 commits
d2cdce7
6b7fcc3
53ae9c2
9f1d298
4f22fd8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -18,7 +18,9 @@ | |||||
//! Arrow logical types | ||||||
|
||||||
mod datatype; | ||||||
|
||||||
pub use datatype::*; | ||||||
use std::fmt::Display; | ||||||
mod datatype_parse; | ||||||
mod error; | ||||||
pub use error::*; | ||||||
|
@@ -34,6 +36,35 @@ use std::ops; | |||||
pub mod ffi; | ||||||
|
||||||
/// Options that define the sort order of a given column | ||||||
/// | ||||||
/// The default sorts equivalently to of `ASC NULLS FIRST` in SQL (i.e. | ||||||
/// ascending order with nulls sorting before any other values). | ||||||
/// | ||||||
/// # Example creation | ||||||
/// ``` | ||||||
/// # use arrow_schema::SortOptions; | ||||||
/// let options = SortOptions { | ||||||
/// descending: false, | ||||||
/// nulls_first: true, | ||||||
/// }; | ||||||
/// // Default is ASC NULLs First | ||||||
/// assert_eq!(options, SortOptions::default()); | ||||||
/// assert_eq!(options.to_string(), "ASC"); | ||||||
/// | ||||||
/// // Configure using builder APIs | ||||||
/// let options = SortOptions::default() | ||||||
/// .desc() | ||||||
/// .with_nulls_first(true); | ||||||
/// assert_eq!(options.to_string(), "DESC NULLS FIRST"); | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
If |
||||||
/// ``` | ||||||
/// | ||||||
/// # Example operations | ||||||
/// It is also possible to negate the sort options using the `!` operator. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I found the use of the |
||||||
/// ``` | ||||||
/// use arrow_schema::SortOptions; | ||||||
/// let options = !SortOptions::default(); | ||||||
/// assert_eq!(options.to_string(), "DESC NULLS LAST"); | ||||||
/// ``` | ||||||
#[derive(Clone, Hash, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)] | ||||||
pub struct SortOptions { | ||||||
/// Whether to sort in descending order | ||||||
|
@@ -42,6 +73,56 @@ pub struct SortOptions { | |||||
pub nulls_first: bool, | ||||||
} | ||||||
|
||||||
impl Display for SortOptions { | ||||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { | ||||||
if self.descending { | ||||||
write!(f, "DESC")?; | ||||||
} else { | ||||||
write!(f, "ASC")?; | ||||||
} | ||||||
if self.nulls_first { | ||||||
// purposely don't display default NULLs value | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The default for There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, I think you are right -- it is more consistent even if more verbose |
||||||
} else { | ||||||
write!(f, " NULLS LAST")?; | ||||||
} | ||||||
Ok(()) | ||||||
} | ||||||
} | ||||||
|
||||||
impl SortOptions { | ||||||
/// Create a new `SortOptions` struct | ||||||
pub fn new(descending: bool, nulls_first: bool) -> Self { | ||||||
Self { | ||||||
descending, | ||||||
nulls_first, | ||||||
} | ||||||
} | ||||||
|
||||||
/// Set this sort options to sort in descending order | ||||||
pub fn desc(mut self) -> Self { | ||||||
self.descending = true; | ||||||
self | ||||||
} | ||||||
|
||||||
/// Set this sort options to sort in ascending order | ||||||
pub fn asc(mut self) -> Self { | ||||||
self.descending = false; | ||||||
self | ||||||
} | ||||||
|
||||||
/// Set this sort options to sort descending if argument is true | ||||||
pub fn with_descending(mut self, descending: bool) -> Self { | ||||||
self.descending = descending; | ||||||
self | ||||||
} | ||||||
|
||||||
/// Set this sort options to sort nulls first if argument is true | ||||||
pub fn with_nulls_first(mut self, nulls_first: bool) -> Self { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We can keep this API for sure, but to be consistent with what you propose at apache/datafusion#12595 ( There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. it is a good idea -- added in 4f22fd8 |
||||||
self.nulls_first = nulls_first; | ||||||
self | ||||||
} | ||||||
} | ||||||
|
||||||
impl Default for SortOptions { | ||||||
fn default() -> Self { | ||||||
Self { | ||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here is an example of using the new API
Not only is this more concise, I believe the intent is easier to reason about now (asc/desc)