218 lines
6.0 KiB
Rust
218 lines
6.0 KiB
Rust
// Licensed to the Apache Software Foundation (ASF) under one
|
|
// or more contributor license agreements. See the NOTICE file
|
|
// distributed with this work for additional information
|
|
// regarding copyright ownership. The ASF licenses this file
|
|
// to you under the Apache License, Version 2.0 (the
|
|
// "License"); you may not use this file except in compliance
|
|
// with the License. You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing,
|
|
// software distributed under the License is distributed on an
|
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
// KIND, either express or implied. See the License for the
|
|
// specific language governing permissions and limitations
|
|
// under the License.
|
|
|
|
//! Arrow logical types
|
|
|
|
#![doc(
|
|
html_logo_url = "https://arrow.apache.org/img/arrow-logo_chevrons_black-txt_white-bg.svg",
|
|
html_favicon_url = "https://arrow.apache.org/img/arrow-logo_chevrons_black-txt_transparent-bg.svg"
|
|
)]
|
|
#![cfg_attr(docsrs, feature(doc_cfg))]
|
|
#![warn(missing_docs)]
|
|
|
|
mod datatype;
|
|
|
|
pub use datatype::*;
|
|
use std::fmt::Display;
|
|
mod datatype_display;
|
|
mod datatype_parse;
|
|
mod error;
|
|
pub use error::*;
|
|
pub mod extension;
|
|
mod field;
|
|
pub use field::*;
|
|
mod fields;
|
|
pub use fields::*;
|
|
mod schema;
|
|
pub use schema::*;
|
|
use std::ops;
|
|
|
|
#[cfg(feature = "ffi")]
|
|
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;
|
|
/// // configure using explicit initialization
|
|
/// let options = SortOptions {
|
|
/// descending: false,
|
|
/// nulls_first: true,
|
|
/// };
|
|
/// // Default is ASC NULLs First
|
|
/// assert_eq!(options, SortOptions::default());
|
|
/// assert_eq!(options.to_string(), "ASC NULLS FIRST");
|
|
///
|
|
/// // Configure using builder APIs
|
|
/// let options = SortOptions::default()
|
|
/// .desc()
|
|
/// .nulls_first();
|
|
/// assert_eq!(options.to_string(), "DESC NULLS FIRST");
|
|
///
|
|
/// // configure using explicit field values
|
|
/// let options = SortOptions::default()
|
|
/// .with_descending(false)
|
|
/// .with_nulls_first(false);
|
|
/// assert_eq!(options.to_string(), "ASC NULLS LAST");
|
|
/// ```
|
|
///
|
|
/// # Example operations
|
|
/// It is also possible to negate the sort options using the `!` operator.
|
|
/// ```
|
|
/// 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
|
|
pub descending: bool,
|
|
/// Whether to sort nulls first
|
|
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 {
|
|
write!(f, " NULLS FIRST")?;
|
|
} 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
|
|
///
|
|
/// See [Self::with_descending] to explicitly set the underlying field
|
|
pub fn desc(mut self) -> Self {
|
|
self.descending = true;
|
|
self
|
|
}
|
|
|
|
/// Set this sort options to sort in ascending order
|
|
///
|
|
/// See [Self::with_descending] to explicitly set the underlying field
|
|
pub fn asc(mut self) -> Self {
|
|
self.descending = false;
|
|
self
|
|
}
|
|
|
|
/// Set this sort options to sort nulls first
|
|
///
|
|
/// See [Self::with_nulls_first] to explicitly set the underlying field
|
|
pub fn nulls_first(mut self) -> Self {
|
|
self.nulls_first = true;
|
|
self
|
|
}
|
|
|
|
/// Set this sort options to sort nulls last
|
|
///
|
|
/// See [Self::with_nulls_first] to explicitly set the underlying field
|
|
pub fn nulls_last(mut self) -> Self {
|
|
self.nulls_first = 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 {
|
|
self.nulls_first = nulls_first;
|
|
self
|
|
}
|
|
}
|
|
|
|
impl Default for SortOptions {
|
|
fn default() -> Self {
|
|
Self {
|
|
descending: false,
|
|
// default to nulls first to match spark's behavior
|
|
nulls_first: true,
|
|
}
|
|
}
|
|
}
|
|
|
|
/// `!` operator is overloaded for `SortOptions` to invert boolean
|
|
/// fields of the struct.
|
|
impl ops::Not for SortOptions {
|
|
type Output = SortOptions;
|
|
|
|
fn not(self) -> SortOptions {
|
|
SortOptions {
|
|
descending: !self.descending,
|
|
nulls_first: !self.nulls_first,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_overloaded_not_sort_options() {
|
|
let sort_options_array = [
|
|
SortOptions {
|
|
descending: false,
|
|
nulls_first: false,
|
|
},
|
|
SortOptions {
|
|
descending: false,
|
|
nulls_first: true,
|
|
},
|
|
SortOptions {
|
|
descending: true,
|
|
nulls_first: false,
|
|
},
|
|
SortOptions {
|
|
descending: true,
|
|
nulls_first: true,
|
|
},
|
|
];
|
|
|
|
assert!((!sort_options_array[0]).descending);
|
|
assert!((!sort_options_array[0]).nulls_first);
|
|
|
|
assert!((!sort_options_array[1]).descending);
|
|
assert!(!(!sort_options_array[1]).nulls_first);
|
|
|
|
assert!(!(!sort_options_array[2]).descending);
|
|
assert!((!sort_options_array[2]).nulls_first);
|
|
|
|
assert!(!(!sort_options_array[3]).descending);
|
|
assert!(!(!sort_options_array[3]).nulls_first);
|
|
}
|