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.tscompileNode(第 53-56 行)
  • packages/services/service-analytics/src/strategies/filter-normalizer.tsbuildNode(第 249-255 行)

两者都被一致性表在册:read-scope-sql-conformance.test.tsnative-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:86expect(...).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

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