• Data Governance Dev's avatar
    fix(custom-rules): 自定义规则结果「规则」列显示可读 SQL(替代 'tree' 字面量) · 21170b4b
    Data Governance Dev authored
    用户反馈:自定义规则命中明细表里「规则」列只显示 '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 嵌套行为。
    21170b4b
WORKLOG.md 271 KB