use crate::columnar::Columns;
use crate::error::Result;
use crate::filter::{self, FilterInput, FilterSpec};
use crate::sort::{self, SortDirection, SortSpec};
use crate::value::Value;
pub fn filter_indices(
rows: &[Value],
columns: &Columns,
specs: Vec<FilterSpec>,
) -> Result<Vec<usize>> {
if let [spec] = specs.as_slice() {
if let Some(indices) = columns.filter(&spec.field, spec.op, &spec.value) {
return Ok(indices);
}
}
filter::filter_indices(rows, &FilterInput::Flat(specs))
}
pub fn sort_indices(rows: &[Value], columns: &Columns, specs: &[SortSpec]) -> Result<Vec<usize>> {
if !specs.is_empty() {
let order: Vec<usize> = (0..rows.len()).collect();
let keys: Vec<(&str, SortDirection)> = specs
.iter()
.map(|s| (s.field.as_str(), s.direction))
.collect();
if let Some(sorted) = columns.sort_subset(&order, &keys, None) {
return Ok(sorted);
}
}
sort::sort_indices(rows, specs)
}