use std::{any::Any, sync::Arc};
use arrow::{
compute::SortOptions,
datatypes::{DataType, Field},
};
use crate::sort_expr::PhysicalSortExpr;
use super::AggregateExpr;
pub fn down_cast_any_ref(any: &dyn Any) -> &dyn Any {
if let Some(obj) = any.downcast_ref::<Arc<dyn AggregateExpr>>() {
obj.as_any()
} else if let Some(obj) = any.downcast_ref::<Box<dyn AggregateExpr>>() {
obj.as_any()
} else {
any
}
}
pub fn ordering_fields(
ordering_req: &[PhysicalSortExpr],
data_types: &[DataType],
) -> Vec<Field> {
ordering_req
.iter()
.zip(data_types.iter())
.map(|(sort_expr, dtype)| {
Field::new(
sort_expr.expr.to_string().as_str(),
dtype.clone(),
true,
)
})
.collect()
}
pub fn get_sort_options(ordering_req: &[PhysicalSortExpr]) -> Vec<SortOptions> {
ordering_req.iter().map(|item| item.options).collect()
}