Skip to main content

tdm_server_rust/repository/
episode_sort.rs

1//! 话数标签排序 SQL(兼容 `e32103` 等非数字标签)
2
3use sea_orm::sea_query::{Expr, SimpleExpr};
4
5/// 话数主段(`+` 前)安全转 numeric:纯数字才 cast,否则 NULL
6pub fn episode_label_sort_sql(column: &str) -> String {
7    format!(
8        r#"CASE WHEN split_part({column}::text, '+', 1) ~ '^[0-9]+(\.[0-9]+)?$' THEN split_part({column}::text, '+', 1)::numeric END"#,
9        column = column
10    )
11}
12
13/// SeaORM `ORDER BY` 用语数排序表达式
14pub fn episode_label_sort_expr(column: &str) -> SimpleExpr {
15    Expr::cust(episode_label_sort_sql(column))
16}
17
18#[cfg(test)]
19mod tests {
20    use super::episode_label_sort_sql;
21
22    #[test]
23    fn sort_sql_guards_non_numeric() {
24        let sql = episode_label_sort_sql(r#"me."mangaEpisode""#);
25        assert!(sql.contains("~ '^[0-9]+"));
26        assert!(sql.contains("::numeric"));
27        assert!(!sql.contains("CAST(me.\"mangaEpisode\" AS DECIMAL"));
28    }
29}