在 #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 判定为「同一个事实要求写两遍,因此有了两处互相矛盾的余地」的那种冗余,只是它活在契约没有覆盖的方法上。两个后果:
要求 object 的那几处 :调用方手上只有 where / groupBy 时叫不出类型的名字,于是走 as any —— [spec] IDataDriver 的 query 参数要求 QueryAST.object 与第一实参重复 —— 下游被迫 as any(20 处实测),提议 Omit/optional 化 #5181 的 changeset 记过这笔账的代价(cloud#1053 实测 20 处,cloud#1030 的 $like 就是从这个口子活到运行时的)。
写成 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) #6210 在 performAggregation 上就是因为这一点选了 Omit< QueryInput, 'object' > 而不是 DriverQuery;
analyzeQuery / findWithWindowFunctions 是否还有生产者,值得先量一量再决定是收窄还是退役(explain 已经只是 analyzeQuery 的一层转发)。
⚠️ 另注:driver-memory / driver-mongodb 在 #5499 的冻结面内,跨面处置请按冻结令的口径框定范围。
会话:session_01WyvqvKMG6asi9aXjKE6xtx(#6075 实施期间发现,未认领)
在 #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:653aggregate(object, pipeline: Record< string, any >[] | QueryAST, …)objectdriver-memory/src/memory-driver.ts:612distinct(object, field, query?: QueryInput)objectdriver-mongodb/src/mongodb-driver.ts:468aggregate(object, query: QueryAST, …)objectdriver-sql/src/sql-driver.ts:3249aggregate(object, query: any, …)any,全无检查driver-sql/src/sql-driver.ts:3372findWithWindowFunctions(object, query: any, …)anydriver-sql/src/sql-driver.ts:3409analyzeQuery(object, query: any, …)anydriver-turso/src/turso-driver.ts:547aggregate(object, query: any, …)any(行号取自
origin/main@80f7dc6,会漂。)为什么单独记一笔
这正是 #5181 判定为「同一个事实要求写两遍,因此有了两处互相矛盾的余地」的那种冗余,只是它活在契约没有覆盖的方法上。两个后果:
object的那几处:调用方手上只有where/groupBy时叫不出类型的名字,于是走as any—— [spec] IDataDriver 的 query 参数要求QueryAST.object与第一实参重复 —— 下游被迫as any(20 处实测),提议 Omit/optional 化 #5181 的 changeset 记过这笔账的代价(cloud#1053 实测 20 处,cloud#1030 的$like就是从这个口子活到运行时的)。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) #6210 在performAggregation上就是因为这一点选了Omit< QueryInput, 'object' >而不是DriverQuery;analyzeQuery/findWithWindowFunctions是否还有生产者,值得先量一量再决定是收窄还是退役(explain已经只是analyzeQuery的一层转发)。driver-memory/driver-mongodb在 #5499 的冻结面内,跨面处置请按冻结令的口径框定范围。会话:
session_01WyvqvKMG6asi9aXjKE6xtx(#6075 实施期间发现,未认领)