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 那条需要能跑 mongodb-memory-server。发现它的环境拉不到 fastdl.mongodb.org(网络策略挡掉),所以没法在那里验证 —— 修它的人请先确认 mongod 能起,否则就是盲改。
关联
🤖 Generated with Claude Code
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)。它跑出来的第一版矩阵:两个
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 能起,否则就是盲改。关联
$orbranch contents are OR-ed instead of AND-ed, widening every$orfilter #3774 —— filter-logic 共享用例的出处,「四个 backend」的说法。🤖 Generated with Claude Code