use edm_core::extension::{JsonMapExt, JsonValueExt};
use edm_core::{JsonMap, JsonValue, SharedString};
#[derive(Debug, Clone)]
pub struct Query {
fields: Vec<String>,
filters: JsonMap,
sort_order: Vec<(SharedString, bool)>,
offset: usize,
limit: usize,
}
impl Query {
#[inline]
pub fn new(filters: impl Into<JsonValue>) -> Self {
Self {
fields: Vec::new(),
filters: filters.into().into_map_opt().unwrap_or_default(),
sort_order: Vec::new(),
offset: 0,
limit: 0,
}
}
fn parse_logical_query(expr: &str) -> Vec<JsonMap> {
let mut filters = Vec::new();
for expr in expr.trim_end_matches(')').split(',') {
if let Some((key, expr)) = expr.split_once('.') {
if let Some((operate, value)) = expr.split_once('.') {
if value.starts_with('$') {
if let Some((operator, expr)) = value.split_once('(') {
JsonMap::from_entry(operator, Self::parse_logical_query(expr)).into()
} else {
JsonValue::from(value)
};
};
let filter = JsonMap::from_entry(key, JsonMap::from_entry(operate, value));
filters.push(filter);
}
}
}
filters
}
}