Skip to content

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

Closed

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. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Aug 2, 2026
  2. self-assigned this
    on Aug 2, 2026
  3. 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

  4. 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

Labels

bugSomething isn't workingpm:dispatchedDispatched to a dev agent by /pm-dispatchpm:queueReady for the PM dispatch loop

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions