Documentation
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,
        }
    }

    /// 使用逻辑运算符解析查询表达式。将符合要求的数据转换为 `Vec<JsonMap>`
    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
    }
}