use serde::{Deserialize, Serialize};
use super::partition::Transform;
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
pub enum SortDirection {
#[serde(rename = "asc")]
Ascending,
#[serde(rename = "desc")]
Descending,
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
pub enum NullOrder {
#[serde(rename = "nulls-first")]
First,
#[serde(rename = "nulls-last")]
Last,
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
#[serde(rename_all = "kebab-case")]
pub struct SortField {
pub source_id: i32,
pub transform: Transform,
pub direction: SortDirection,
pub null_order: NullOrder,
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
#[serde(rename_all = "kebab-case")]
pub struct SortOrder {
pub order_id: i32,
pub fields: Vec<SortField>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sort_field() {
let sort_field = r#"
{
"transform": "bucket[4]",
"source-id": 3,
"direction": "desc",
"null-order": "nulls-last"
}
"#;
let field: SortField = serde_json::from_str(sort_field).unwrap();
assert_eq!(Transform::Bucket(4), field.transform);
assert_eq!(3, field.source_id);
assert_eq!(SortDirection::Descending, field.direction);
assert_eq!(NullOrder::Last, field.null_order);
}
#[test]
fn sort_order() {
let sort_order = r#"
{
"order-id": 1,
"fields": [ {
"transform": "identity",
"source-id": 2,
"direction": "asc",
"null-order": "nulls-first"
}, {
"transform": "bucket[4]",
"source-id": 3,
"direction": "desc",
"null-order": "nulls-last"
} ]
}
"#;
let order: SortOrder = serde_json::from_str(sort_order).unwrap();
assert_eq!(Transform::Identity, order.fields[0].transform);
assert_eq!(2, order.fields[0].source_id);
assert_eq!(SortDirection::Ascending, order.fields[0].direction);
assert_eq!(NullOrder::First, order.fields[0].null_order);
assert_eq!(Transform::Bucket(4), order.fields[1].transform);
assert_eq!(3, order.fields[1].source_id);
assert_eq!(SortDirection::Descending, order.fields[1].direction);
assert_eq!(NullOrder::Last, order.fields[1].null_order);
}
}