fix(custom-rules): 自定义规则结果「规则」列显示可读 SQL(替代 'tree' 字面量)
用户反馈:自定义规则命中明细表里「规则」列只显示 'tree',没有信息量。
## 改动
- step9_custom_rules.py: 新增 _serialize_rule_human(group) 递归把条件树
序列化为可读 SQL 形态字符串
- 叶子: col LIKE '%X%' / col NOT LIKE '%Y%' / col > 10 / col < '2026-01-01'
- 顶层组: children 用 AND/OR 串接;单 child 不加括号
- 嵌套组: (children) 加括号让优先级清晰
- 每条 entry 增加 rule_text 字段(common dict);删除无意义的 rule_type 赋值
- ColumnSpec: prop 'rule_type' → 'rule_text';render tag → code(等宽字体)
;min_width 120 → 240
- step8_report._md_custom_value_check / docx 版同步:
- 去掉「关键字」列(v1 字段,v2 已不存在)
- 「规则」列改用 rule_text
## 端到端验证
mock DB 跑一条含嵌套组的规则:
输入: AND(contains(X), OR(contains(Y), not_contains(Z)))
rule_text: 'col LIKE \'%X%\' AND (col LIKE \'%Y%\' OR col NOT LIKE \'%Z%\')'
真实 SQL: '... WHERE (`id_card` LIKE %s ESCAPE \'!\' AND (`id_card` LIKE %s ESCAPE \'!\' OR `id_card` NOT LIKE %s ESCAPE \'!\')) LIMIT 100'
显示与真实 SQL 语义一致;区别仅是显示用 'col' 占位列名(方便看),真实 SQL 用 quote_ident。
## 踩坑
第一版递归在父循环对子组额外包括号 '(" + walk() + ")',而 walk(is_top=False)
内部对嵌套组已经返回带括号形式 → 嵌套组变成 '((col < 5 OR col = 100))'。
修法:用 is_top 参数让递归本身决定是否加括号,调用方不再重复加。
教训:写递归字符串拼接时给一个 is_root / is_top 参数控制顶层 vs 嵌套行为。
Showing
Please register or sign in to comment