perf(gap): resolvedTeeth 集合式形态 + 对拍工具(默认仍走 legacy)
形态:cand → scope → resolved 预聚合 → 牙位反连接。核心恒等式
∃x∈G: t(x) ⋛ a ⟺ max{t(x)} ⋛ a,分组 G=(患者,牙位)。
13 个分支对 sig 的相关性只有三类:时间门(10)/ 病历号等值(1)/ 无相关(2),
另有「建议优先」一条多个 sig.type 标量谓词(ndx 标志)。
⚠ ️ 集合式是**独立重写一份**,刻意不与 legacy 共用片段 —— 共用则重构写错的地方
两边一起错、对拍互相抵消。等价性靠 verify-gap-equivalence 逐行差分来证。
全口码(K05/K07)不进集合式:它们的 lateral PG 本来就会摘掉(零收益),
实测硬套进 gap_cand 还慢 2~3 倍(1309→4439ms / 1388→3065ms)。
新增:
· src/cli/verify-gap-equivalence.cli.ts —— 两版同一 REPEATABLE READ 快照,
双向 EXCEPT ALL 差分到 (患者,信号,牙位);--self 自对拍先证工具可信
· tests/gap-setbased-parity.spec.ts —— 结构对拍,守「分支集合不许走散」
(加分支只改一边 = 静默错召,tsc 和现有 spec 都发现不了)
· scenario.buildScenarioSql() 抽成独立方法,让对拍拿到线上跑的那条 SQL 本身
· PAC_GAP_VARIANT=setbased 切换;默认 legacy
本地实测(30K 库):11 个子场景全部零差异,行数逐个相同;
牙位级 ×1.05~1.73(库小全热,不作为收益判据,以测试机 585K 为准)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Showing
Please
register
or
sign in
to comment