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 实施期间发现,未认领)

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions