Skip to content

空组合子在同仓有两个对立答案:五个后端归约成布尔单位元,service-analytics 的两个编译器 fail-closed 抛错 —— #5239 的一致性表四条因此进不了表 #5322

Description

@os-zhuang

实现 #5239 的 spec 半边(FILTER_LOGIC_CASES 扩四条布尔单位元)时实测发现,不在该单范围内,按 Prime Directive #10 单独记在这里,unassigned。

#5239 的前提是「四条只差 driver-mongodb 一家,补上归约即可全绿」。实测这条前提不成立:一致性表在册的另外两个后端对同样四条给出的不是「错的答案」,而是相反的立场,并且写在代码注释里、还有 pin 测试钉着。

实测矩阵(origin/main @ 175d789,四行 fixture)

后端 {$and:[]} {$or:[]} {$or:[{a:'x'},{}]} {$not:{}}
期望(#5134 / #5239 裁定) 全部行 零行 全部行 零行
formula matchesFilterCondition 全部行 零行 全部行 零行
driver-memory 全部行 零行 全部行 零行
driver-sql(#5134 / PR #5243) 全部行 零行 全部行 零行
driver-sqlite-wasm 全部行 零行 全部行 零行
driver-mongodb(#5239 本次) 全部行 零行 全部行 零行
read-scope-sql 抛错 抛错 行 1,2 整表
analytics filter-normalizer 抛错 抛错 行 1,2 整表

两处落点:

  • packages/services/service-analytics/src/read-scope-sql.ts 的 compileNode(第 53-56 行)
  • packages/services/service-analytics/src/strategies/filter-normalizer.ts 的 buildNode(第 249-255 行)

两者都被一致性表在册:read-scope-sql-conformance.test.ts 与 native-sql-filter-logic-conformance.test.ts 各自遍历全部 FILTER_LOGIC_CASES。所以四条一进表,这两个 suite 立刻各红四格。

为什么这是「要拍板」而不是「有人没跟上」

对立是成文的,不是遗漏。filter-normalizer.ts 的错误消息逐字写着:

"$and" requires a non-empty array. An empty combinator has no defensible reading — dropping it widens the query, and treating it as "match nothing" silently empties a chart.

「treating it as match nothing」正是 #5134 为 $or: [] 定下的答案。而 read-scope-sql.test.ts:86 用 expect(...).toThrowError(/non-empty array/) 把这个抛错钉住了。所以这不是「照抄 #5296 即可」的那类跟进(#5297 的 $not 就是那类),而是两条已落地的立场必须有一条让步。

顺带注意:「响亮拒收」本身是有先例的答案 —— #5240 对 { field: {} } 取的正是拒收,理由是「让 AI 生成的元数据在编写期就炸」。同一条理由套在空组合子上同样成立:一个 disjunct 列表循环出零项,几乎必然是 producer 的 bug,而不是作者想表达「零行」。

两轴分析

A. 项目长远合理性

B. 让 AI 写的元数据难写错

推荐:取单位元,analytics 两处对齐 —— 理由是 A 轴的组合性(拒收无法回答嵌套),加上 B 轴上 $or: [] = 零行本身已经是 fail-closed。若维护者更看重编写期信号,可以两者兼取:归约照做,同时在 publish/lint 面对字面量空组合子响亮拒收 —— 运行期语义单一,作者错误仍在编写期爆炸,这是 PD #12「在生产端拒绝、不要在消费端容忍」的标准形状,也是唯一不需要任何一边让步的读法。

连带

关联

#5239(一致性表扩条,被本单阻塞)、#5134 / PR #5243(driver-sql 单位元)、#5297(同两处的 $not 分叉)、#5240({field:{}} 取拒收的先例)、cloud#1073、#3774。

Activity

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

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions