sqlx-query-dsl 0.1.1

A query DSL extension for SQLx
Documentation

use serde::Deserialize;
use serde_json::Value;

/// 通用查询参数结构体
/// 用于接收前端传递的查询条件、分页、排序等信息
#[derive(Debug, Deserialize)]
pub struct QueryParams {
    /// 过滤条件表达式(支持嵌套的 AND/OR)
    pub filter: Option<FilterExpr>,
    /// GROUP BY 字段列表
    pub group_by: Option<Vec<String>>,
    /// HAVING 过滤条件
    pub having: Option<FilterExpr>,
    /// 排序规则列表
    pub sort: Vec<SortItem>,
    /// 当前页码(通常从 0 开始,具体取决于实现)
    pub page: u32,
    /// 每页记录数
    pub page_size: u32,
}

/// 过滤表达式枚举
/// 支持逻辑与、逻辑或以及具体条件
#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub enum FilterExpr {
    /// 逻辑与 (AND)
    And { and: Vec<FilterExpr> },
    /// 逻辑或 (OR)
    Or { or: Vec<FilterExpr> },
    /// 单个过滤条件
    Cond(FilterCond),
}

/// 单个过滤条件详情
#[derive(Debug, Deserialize)]
pub struct FilterCond {
    /// 数据库字段名
    pub field: Option<String>,
    /// 操作符
    pub op: Op,
    /// 比较值
    pub value: Option<Value>,
}

/// 支持的 SQL 操作符
#[derive(Debug, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Op {
    /// 等于 (=)
    Eq,
    /// 不等于 (!=)
    Ne,
    /// 模糊匹配 (LIKE)
    Like,
    /// 大于 (>)
    Gt,
    /// 小于 (<)
    Lt,
    /// 大于等于 (>=)
    Gte,
    /// 小于等于 (<=)
    Lte,
    /// 包含在列表内 (IN)
    In,
    /// 不包含在列表内 (NOT IN)
    NotIn,
    /// 在范围内 (BETWEEN)
    Between,
    /// 逗号分隔字符串查找 (FIND_IN_SET)
    FindInSet,
    /// JSON 包含 (JSON_CONTAINS)
    JsonContains,
    /// 为空 (IS NULL)
    IsNull,
    /// 不为空 (IS NOT NULL)
    IsNotNull,
    /// 存在子查询 (EXISTS)
    Exists,
    /// 不存在子查询 (NOT EXISTS)
    NotExists,
}

/// 排序项
#[derive(Debug, Deserialize)]
pub struct SortItem {
    /// 排序字段名
    pub field: String,
    /// 是否降序 (true: DESC, false: ASC)
    pub desc: bool,
}

/// EXISTS/NOT EXISTS 操作符所需的值结构
#[derive(Debug, Deserialize)]
pub struct ExistsValue {
    /// 子查询 SQL 语句
    pub sql: String,
    /// 子查询绑定的参数列表
    pub bind: Option<Vec<Value>>,
}