返回正文目录

2026-10-21 主题更正:本文对应已迁高级篇的 Compose 旧稿,不是当前基础第十四章。当前建模 JOIN 见 新实操记录。以下旧验证事实保留。

第十四章实操记录:QM JOIN 与聚合 JOIN

2026-10-21。当前 Codex 会话实际调用项目内 Foggy CLI 完成;没有另开干净 Codex 会话仅凭正文短提示词做独立复现。正文见第十四章。

环境与变更

实际顺序

  1. capabilities 确认 Compose validate/preview/execute;检查绑定、Customer 结构与现有两个 QM 的实时字段。
  2. 保存原六模型和数据库摘要;创建客户 TM/QM,models validate --models-dir lab/models 后刷新,再 describe 三个输入 QM。
  3. 通过 models describe ... --format markdown 实时获得客户查询说明,保存阅读样本,不作为预生成的查询依赖。
  4. 逐脚本 validate,合法请求 preview 后 execute;权限拒绝和故意无效连接键均未执行。
  5. 用只读 SQLite 原行与 Python Decimal 独立核对,计算客户、账单、明细映射,不复用引擎生成 SQL 作为预期结果。
  6. 移除权限测试 Bundle,刷新、核对模型列表,再回归原账单固定均额、明细金额数量和十二个月汇总。

模型文件:客户 TM、客户 QM。

用例与结果

脚本编号 预期与实际核对
01 客户 LEFT JOIN 当年账单 95 行=83 张账单+12 位未匹配客户,金额 477.53
02 同一输入 INNER JOIN 83 行、47 位客户;逐张账单核对
03 客户 LEFT JOIN 按客户汇总账单 59 行,其中 47 位有金额、12 位指标缺失;477.53、83 张
04 同一聚合输入 INNER JOIN 47 行,金额与左连接中的匹配客户逐一相同
05 两侧都按客户聚合再 JOIN 47 行,账单/明细金额逐客户相等;各合计 477.53,数量 447
06 错误粒度对照 原始账单与原始明细按客户关联产生 946 个组合,账单累计放大为 6818.09;本例故意展示错误业务写法,不是引擎计算出错
07/08 最终结果分页 按金额降序、客户 ID 升序,前两页各 5 行与完整结果对应位置一致
09 无账单期间 1990 年账单输入为空,LEFT JOIN 仍有 59 位客户,账单指标未返回
12 固定 USA 权限输入 客户目录仍为 59 位,右侧仅 13 位有金额,合计 127.98;21 张账单
13/14 拒绝模型、隐藏输入字段 COMPOSE_SCRIPT_INVALID,阶段 compose.validate,未执行;详细消息保留具体来源错误
10/11 校验缺口、输入 limit 两项限制已复现,单独记录,不计为预期通过

10 项 Compose 用例完成独立核对(含错误粒度演示),2 项权限预期拒绝;另有 2 项未满足预期的边界。三个旧查询回归通过。金额在 SQLite 浮点 SUM 后可能有极小误差,独立基线使用 Decimal,对比误差小于 1e-9,正文展示两位小数。

结果字段为空时,当前序列化可能省略该键,核对时区分缺失键/NULL 与数值 0。没有把未匹配行计作零金额账单。

复跑

客户模型创建与查询分开。现有客户文件准备好后,在资料根目录执行:

python -u .\lab\checks\run-chapter-14.py

这是完整自动复跑:包含模型校验刷新、临时权限模型登记、查询、负例核对、清理与旧查询回归,不是正文第一步的“先不查询”。它依赖前章已接入的同一个本地服务,不会启动或重启服务。

只核对已保存响应与独立原行,可运行:

python .\lab\checks\verify-chapter-14.py

查询脚本目录、验收摘要、回归、清理记录。每个脚本保留独立 validate/preview/execute 响应,失败请求没有 execute 文件。

问题与范围

两项引擎边界的输入、阶段、预期与实际见Compose 边界记录,已提交 #150 和 #151,均附 0.1.30 复现、预期/实际及关键返回。权限模型第一次校验使用了返回对象的简写箭头函数,FSScript 解析失败;改为 resolver: (context) => { return {...}; } 后通过。保留原失败响应,不将它算作引擎权限失败。

验证仅覆盖同源 SQLite、等值 INNER/LEFT、有限分页、固定权限测试模型;未验证其他数据库、跨源 JOIN、RIGHT/FULL、真实身份服务或完整 Compose。受限模型失败不能换公共模型绕过;返回的 safeToAutoRepair 等通用建议不构成改变权限的授权。

正文中的连接类型、先聚合与最终分页均有实际数据证据;未知 JOIN 键校验缺口和输入 limit 未生效明确保留,未伪装全量通过。