Repository navigation
Description
TL;DR
FILTER_LOGIC_CASES(packages/spec/src/data/filter-logic-conformance.ts,#3774)的文件注释说它是「the four independent FilterCondition backends are each checked against」的共享标准。实测跑这套用例的是:driver-memory、driver-sql、packages/formula、service-analytics。
driver-mongodb 不在里面 —— 而 mongodb-filter.ts 的 translateFilter 是一个完全独立的第五个 backend,$and / $or / $not 的翻译跟 SQL、跟内存匹配器一行代码都不共用。它是被漏掉的,不是被排除的:#3774 数「四个」的时候没把它数进去。
driver-sqlite-wasm 同样没跑,但性质不同(见下)。
怎么发现的
#4363 的后续加了 scripts/check-driver-conformance.mjs(driver × 共享用例集的覆盖矩阵 gate)。它跑出来的第一版矩阵:
driver FILTER_LOGIC TEMPORAL TEMPORAL_TIME PAGINATION PAGINATION_UNORDERED
driver-memory ok ok ok ok ok
driver-mongodb DEBT ok ok ok ok
driver-sql ok ok ok ok ok
driver-sqlite-wasm DEBT ok ok ok ok
两个 DEBT 就是本 issue。(driver-sqlite-wasm 的两个 PAGINATION 格子当时也是空的,已在同一个 PR 里补上。)
两行的优先级不一样
driver-mongodb —— 真的洞,建议优先。 独立实现的组合子翻译从来没有被共享标准验证过。风险是具体的:$not 在 MongoDB 里没有顶层等价物(要靠 $nor 或 per-field $not),嵌套 $or 里的 $and 展开也容易和 SQL 语义分叉 —— 而分叉的表现是「过滤条件看起来生效了,但选出来的行不一样」,属于 #3948 那一族。
driver-sqlite-wasm —— 价值低但不该 exempt。 它继承 SqlDriver 的过滤编译器,所以风险不在「谓词编错」而在「sql.js 方言执行编好的谓词」—— 和它的 temporal / pagination 套件已经覆盖的是同一类风险。之所以记成 DEBT 而不是 EXEMPT:「继承了所以没问题」正是那两个套件存在的理由所要否证的假设。
清账方式
两条都写各自的 conformance 套件(照 packages/plugins/driver-sql/src/sql-driver-or-filter.test.ts 的形状),然后在同一个 PR 里删掉 scripts/check-driver-conformance.mjs 里对应的 ledger 条目。只删条目不写套件会挂 CONSUMED,写了套件不删条目会挂 RECONCILED。
mongodb-memory-server。发现它的环境拉不到 fastdl.mongodb.org(网络策略挡掉),所以没法在那里验证 —— 修它的人请先确认 mongod 能起,否则就是盲改。
关联
- driver-sql:
$orbranch contents are OR-ed instead of AND-ed, widening every$orfilter #3774 —— filter-logic 共享用例的出处,「四个 backend」的说法。 - 分页读取在没有 orderBy 时同样不确定:tie-breaker 只覆盖了「排了序的翻页」 #4363 —— 引出这个 gate 的 issue。
- A filter with an operator outside VALID_AST_OPERATORS is silently dropped, not rejected — single-condition views return unfiltered results #3948 —— 「未生效 / 生效得不一样的东西不该看起来正常」。
🤖 Generated with Claude Code
Activity
fix(batch,drivers): 分页确定性的两个后续 —— 把「有 gate」变成真的,把批处理翻页改成 keyset (#4363)…
os-zhuang commentedon Aug 2, 2026
认领:PM 循环第 4 轮(补编)
分支:
claude/issue-4405-filter-conformance-mongoWorktree:
objectstack-issue-4405分诊决定(PM 自决):两条 DEBT 一个 PR 清账,套件 + 删 ledger 条目同 PR(避免 CONSUMED/RECONCILED 挂账)。mongod 在本环境拉不到(403 已实证),按 #4459 已验证的模式拆分:translateFilter 纯翻译断言走无服务器套件(常跑),行为半区走 mongod 套件(环境缺失时跳过、CI 补跑)。
Generated by Claude Code
os-zhuang commentedon Aug 2, 2026
PM 验收:ACCEPT → PR #4596(已转正并启用 merge-when-ready;报告时 CI 21 项已全绿,入队即合)。
两条 DEBT 同 PR 清账,ledger 条目同步删除(CONSUMED/RECONCILED 双向反向对照实测)。driver-mongodb 按 #4459 模式拆分:无服务器半区(17 条共享用例 → translateFilter 输出的 Mongo 查询文档,进程内严格求值器 +
$not→$nor、嵌套展开的 wire-shape 断言 + 求值器自身判别力对照)+ 真 mongod 半区(本地 403 跳过,CI 上实跑 0 skipped,日志为证)。driver-sqlite-wasm 走自身 sql.js 引擎跑同一张表。结论:未发现翻译分歧——translateFilter 今天全对,收编的意义是从此有守卫;#3774 的「four backends」注释更正为五个。Revert-proof:重新引入 #3774 式误编译 → 两套件 28 条变红。第 4 轮至此全部收官(5/5:2 done、1 已被 main 修复关闭、1 转第 2 步完成、本条)。
Generated by Claude Code
test(drivers): enroll driver-mongodb and driver-sqlite-wasm in the fi…
test(drivers): a conformance run that discovers zero drivers is a fai…
fix(driver-memory): refuse the filters the live query path cannot eva…