feat(governance): 抽样范围 partial/full radio(per-IND 独立控制)
用户需求:针对特定字段的分析(国标字段规范、业务字段规范、用户自定义规则)
希望可切换「部分(前 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 完整贴一遍。
Showing
web/core/sql_utils.py
0 → 100644
Please register or sign in to comment