• Data Governance Dev's avatar
    feat(governance): 抽样范围 partial/full radio(per-IND 独立控制) · 23ebacc6
    Data Governance Dev authored
    用户需求:针对特定字段的分析(国标字段规范、业务字段规范、用户自定义规则)
    希望可切换「部分(前 1000 行)抽样 / 全量扫描」,且每个分析项独立配置(A 项选部分,
    B 项可独立选全量)。
    
    ## 后端
    - 新增 web/core/sql_utils.py: apply_sample_limit(sql, sample_limit, db_type)
      - sample_limit=None  → 移除末尾 LIMIT N / AND ROWNUM <= N(全量扫描)
      - sample_limit=int   → 保留原样(partial 模式)
      - 三方言均覆盖:MySQL / 达梦(标准 LIMIT)/ Oracle 11g(AND ROWNUM <= N)
    - models.ConnectRequest 新增 sample_limits: dict[str, int | None]
    - job_manager.submit 透传 sample_limits 给 orchestrator
    - orchestrator.run_governance_workflow 新增 sample_limits kwarg;按 step_id 取值
      分发给各 _run_* 闭包
    - step7_standards._run_round1/2/3_* 全部加 sample_limit 参数:渲染 SQL 后用
      apply_sample_limit 二次处理(partial→加 LIMIT 1000,full→剥 LIMIT)
    - step9_custom_rules.run_step_custom_value_check 加 sample_limit 参数:
      SQL 构造按 None / oracle / else 三分支
    
    ## 前端
    - index.html sampleScope ref + SAMPLE_PARTIAL_LIMIT 常量
    - 每个 IND-XXX leaf 行(checkbox 之后、字段名输入框之前)加 partial/full radio
      - key = step_id(每个 IND 独立),不再按 group 共享
      - 标签去掉了「1000」后缀,仅显示「部分 / 全量」
    - 自定义规则卡片保持 card-level 单个 radio(共享 custom_value_check step_id):
      step9 后端所有规则共用一个 LIMIT,要下沉需另改接口
    - watch(analysisTree.groups) 加载后为每个 step_id 初始化 sampleScope='partial'
    - buildSampleLimitsForSubmit() 把 sampleScope 转成后端要的 {step_id: int|None}
    - startJob() payload 加 sample_limits 字段
    - style.css 新增 .sample-scope--leaf(margin-left: 8px,紧贴字段名输入框)
    
    ## 端到端验证
    - 用户在 IND-001/002/003 选全量、IND-004 选部分 → payload 正确:
      {std_ind_001: None, std_ind_002: None, std_ind_003: None, std_ind_004: 1000}
    - Pydantic ConnectRequest 解析通过;类型 [(str, 'NoneType'/'int'), ...]
    - 三方言 × partial/full × 多种 SQL 形态,行为符合预期
    
    ## 踩坑
    edit 工具改函数签名+docstring 时只换首行 → 留孤儿 """ → SyntaxError。
    教训:edit 改函数签名 + docstring 时,把整个 docstring 完整贴一遍。
    23ebacc6
sql_utils.py 2.79 KB