Skip to content

[finding][drivers] DriverQuery 收窄之外:aggregate / distinct / analyzeQuery 等驱动自有查询方法仍要求把对象名写两遍 #6212

Description

@os-zhuang

#6075(PR #6210)把五个驱动的六个契约方法签名迁到 DriverQuery 时实测发现,记录备查。观察类,不挂 pm:queue,请分诊轮定级。

现状

#5181 只收窄了 IDataDriver 声明的六个方法(find / findOne / count / updateMany / deleteMany / explain),#6075 让五个驱动的实现跟上。但驱动上还有一批同样吃 query AST、却不在 IDataDriver的方法,它们的第一个实参同样已经是对象名,query 里却仍然要求(或放任)再写一遍 object

位置 签名 形态
driver-memory/src/memory-driver.ts:653 aggregate(object, pipeline: Record< string, any >[] | QueryAST, …) 要求 object
driver-memory/src/memory-driver.ts:612 distinct(object, field, query?: QueryInput) 要求 object
driver-mongodb/src/mongodb-driver.ts:468 aggregate(object, query: QueryAST, …) 要求 object
driver-sql/src/sql-driver.ts:3249 aggregate(object, query: any, …) any,全无检查
driver-sql/src/sql-driver.ts:3372 findWithWindowFunctions(object, query: any, …) any
driver-sql/src/sql-driver.ts:3409 analyzeQuery(object, query: any, …) any
driver-turso/src/turso-driver.ts:547 aggregate(object, query: any, …) any

(行号取自 origin/main @ 80f7dc6,会漂。)

为什么单独记一笔

这正是 #5181 判定为「同一个事实要求写两遍,因此有了两处互相矛盾的余地」的那种冗余,只是它活在契约没有覆盖的方法上。两个后果:

  1. 要求 object 的那几处:调用方手上只有 where / groupBy 时叫不出类型的名字,于是走 as any —— [spec] IDataDriver 的 query 参数要求 QueryAST.object 与第一实参重复 —— 下游被迫 as any(20 处实测),提议 Omit/optional 化 #5181 的 changeset 记过这笔账的代价(cloud#1053 实测 20 处,cloud#1030 的 $like 就是从这个口子活到运行时的)。
  2. 写成 any 的那几处:连 where / orderBy / fields 的检查一起关掉,与 [finding][drivers] 五个驱动的 find/count/… 仍声明 query: QueryAST,而调用方已可省略 object —— 双变让它编译,但声明开始说谎 #6075 刚在 turso 上收回来的是同一批检查。

PR #6210 没有动它们:它们不是 #5181 收窄的那六个方法,顺手改属于超范围。

不是缺陷,别当缺陷派

今天没有人踩:git grep 'query\.object' -- 'packages/drivers/*/src'main 上仍是零命中,这几个方法自己也不读 query.object。所以这是休眠的冗余 + 放弃的检查,不是活体缺陷,判级请按观察类走。

如果要做

给这批方法定一个 query 参数类型。要注意它们彼此并不同形,不是一刀切换成 DriverQuery 就完:

  • memory.aggregate 的形参是 pipeline,联合了 mongo 风格管线数组与 AST 两种输入,收窄前得先确认两条分支各自的真实生产者;
  • memory.distinct 用的是输入形 QueryInput(不是输出形 QueryAST),直接换成 DriverQuery 会连带收紧 groupBy 的元素类型 —— PR refactor(drivers)!: 五个驱动的 query 参数跟进 DriverQuery,休眠的类型谎言没有藏身处 (#6075) #6210performAggregation 上就是因为这一点选了 Omit< QueryInput, 'object' > 而不是 DriverQuery
  • analyzeQuery / findWithWindowFunctions 是否还有生产者,值得先量一量再决定是收窄还是退役(explain 已经只是 analyzeQuery 的一层转发)。

⚠️ 另注:driver-memory / driver-mongodb#5499 的冻结面内,跨面处置请按冻结令的口径框定范围。

会话:session_01WyvqvKMG6asi9aXjKE6xtx#6075 实施期间发现,未认领)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions