Skip to content

filter-logic conformance 少了两个 backend:MongoDB 的 translateFilter 从来没被 #3774 的标准收编 #4405

Description

@os-zhuang

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

Activity

  1. self-assigned this
    on Aug 2, 2026
  2. os-zhuang commented on Aug 2, 2026

    @os-zhuang
    ContributorAuthor

    认领:PM 循环第 4 轮(补编)
    分支:claude/issue-4405-filter-conformance-mongo
    Worktree:objectstack-issue-4405
    分诊决定(PM 自决):两条 DEBT 一个 PR 清账,套件 + 删 ledger 条目同 PR(避免 CONSUMED/RECONCILED 挂账)。mongod 在本环境拉不到(403 已实证),按 #4459 已验证的模式拆分:translateFilter 纯翻译断言走无服务器套件(常跑),行为半区走 mongod 套件(环境缺失时跳过、CI 补跑)。


    Generated by Claude Code

  3. os-zhuang commented on Aug 2, 2026

    @os-zhuang
    ContributorAuthor

    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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions