mod filter;
mod operators;
pub use filter::{Filter, FilterEvaluator};
pub use operators::FilterOp;
use crate::types::MetadataValue;
use std::cmp::Ordering;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SortDirection {
Asc,
Desc,
}
#[derive(Debug, Clone)]
pub struct OrderBy {
pub field: String,
pub direction: SortDirection,
}
impl OrderBy {
pub fn asc(field: impl Into<String>) -> Self {
Self {
field: field.into(),
direction: SortDirection::Asc,
}
}
pub fn desc(field: impl Into<String>) -> Self {
Self {
field: field.into(),
direction: SortDirection::Desc,
}
}
}
pub fn compare_metadata_values(
a: Option<&MetadataValue>,
b: Option<&MetadataValue>,
) -> Ordering {
match (a, b) {
(Some(MetadataValue::String(sa)), Some(MetadataValue::String(sb))) => sa.cmp(sb),
(Some(MetadataValue::Int(ia)), Some(MetadataValue::Int(ib))) => ia.cmp(ib),
(Some(MetadataValue::Float(fa)), Some(MetadataValue::Float(fb))) => {
fa.partial_cmp(fb).unwrap_or(Ordering::Equal)
}
(Some(MetadataValue::Bool(ba)), Some(MetadataValue::Bool(bb))) => ba.cmp(bb),
(Some(MetadataValue::Int(i)), Some(MetadataValue::Float(f))) => {
(*i as f64).partial_cmp(f).unwrap_or(Ordering::Equal)
}
(Some(MetadataValue::Float(f)), Some(MetadataValue::Int(i))) => {
f.partial_cmp(&(*i as f64)).unwrap_or(Ordering::Equal)
}
(None, Some(_)) => Ordering::Greater, (Some(_), None) => Ordering::Less,
_ => Ordering::Equal,
}
}