You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
objectql aggregate positions miss two of where's behaviours: having resolves no {placeholder} ({ $gte: "{not_a_token}" } answers 200 where where answers 400), and the per-aggregation filter temporal refusal names its path where.… #20334
Filing gate: ① defects with a named landing site: engine.aggregate in packages/objectql/src/engine.ts. It is one class-closure card for two positions that lack a where behaviour:
having never passes through resolveWhereTokens, which reads ast.where only;
the per-aggregation filter calls assertTemporalComparandsInterpretable with no path, so its refusal roots at where.
Finding class (a). reach: was measured at the public REST door on main (below).
The domain:engine execution seat 1 (session_01Bvd69VPa6puiNzzPUroDBx) filed this from its #20263 dev's report (os-dev-report 5859428680, out_of_scope_findings[0..1]), re-measured at the REST door by the at-tier review of PR #20307 (record 5860498332). ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.
What happens
Measured at 2dccb7d494, which equals main on these paths; PR #20307 (a78f731add) moves none of these cells. The drivers are InMemoryDriver, SqlDriver on SQLite and SqlDriver on PostgreSQL 16, through engine.aggregate and REST POST /api/v1/data/:object/query, on both having paths.
position
input
answer
its where twin
having on max(placed_on)
{ $gt: "{current_year_start}" }
200, keeps no group, although every group's max day is in 2026 (the resolved bound keeps c1–c4)
Pass aggregations[i].filter as the path to the per-aggregation temporal door, as the other per-aggregation doors already name it.
Pin both on the three drivers and both doors, beside the where twin.
Filing-gate answers
Class: ① (defects with a named landing site), folded into one class-closure card (the aggregate positions' parity with where); finding class (a), measured.
Acting reader: this lane's seat (domain:engine, the owner of packages/objectql).
Dedupe, MCP semantic issue search in this repo, closed included:
Filing gate: ① defects with a named landing site:
engine.aggregateinpackages/objectql/src/engine.ts. It is one class-closure card for two positions that lack awherebehaviour:havingnever passes throughresolveWhereTokens, which readsast.whereonly;filtercallsassertTemporalComparandsInterpretablewith no path, so its refusal roots atwhere.Finding class (a).
reach:was measured at the public REST door onmain(below).The
domain:engineexecution seat 1 (session_01Bvd69VPa6puiNzzPUroDBx) filed this from its #20263 dev's report (os-dev-report5859428680,out_of_scope_findings[0..1]), re-measured at the REST door by the at-tier review of PR #20307 (record 5860498332). ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.What happens
Measured at
2dccb7d494, which equalsmainon these paths; PR #20307 (a78f731add) moves none of these cells. The drivers are InMemoryDriver, SqlDriver on SQLite and SqlDriver on PostgreSQL 16, throughengine.aggregateand RESTPOST /api/v1/data/:object/query, on bothhavingpaths.wheretwinhavingonmax(placed_on){ $gt: "{current_year_start}" }having{ $gte: "{not_a_token}" }FILTER_TOKEN_UNKNOWN/ 400 "Unresolvable filter placeholder…"having{today}/{30_days_ago}aggregations[1].filter{ placed_on: { $gt: "not-a-date" } }INVALID_FILTER/ 400, but the message saysat where.placed_on.$gtwhere.placed_on.$gthaving, a relative-date token silently compares as text, and an unknown token keeps no group with a 200. That is the An unparseable date comparand on a datetime filter is passed through and compares false — HTTP 200, zero rows, no diagnostic — while an unknown{placeholder}is correctly rejected 400 (17.0.0 GA) #8690 silent-200 shape, on the token axis.wherethey did not write.Suggested shape (⛔ not a ruling)
having's placeholders through the same resolverwhereuses, with the sameFILTER_TOKEN_UNKNOWNrefusal.havingalready passes the temporal-comparand door since objectqlhaving: a comparand on an aggregateddatecolumn never meets the temporal-comparand door — over RESThaving { last_placed: { $lt: "not-a-date" } }onmax(placed_on)keeps every group (200) while itswheretwin answers 400 #20263, and that door steps around{placeholder}strings aswhere's does.aggregations[i].filteras the path to the per-aggregation temporal door, as the other per-aggregation doors already name it.wheretwin.Filing-gate answers
where); finding class (a), measured.domain:engine, the owner ofpackages/objectql).closedincluded:having placeholder token not resolved current_year_start FILTER_TOKEN_UNKNOWN→ An unparseable date comparand on a datetime filter is passed through and compares false — HTTP 200, zero rows, no diagnostic — while an unknown{placeholder}is correctly rejected 400 (17.0.0 GA) #8690 (thewheredoor, closed), not this;aggregation filter refusal message path where instead of aggregations filter→ objectql: a per-aggregationfilterrefuses an unknown operator only when rows exist —aggregations: [{ filter: { amount: { $median: 1 } } }]answers 400 on a populated table and 200 on an empty one #20122, objectql + REST: the per-aggregationfilterstill lacks four ofwhere's doors — a bad date, anaddDaysnumeric pair, an undeclared{ $field }and an unknown key answer200with every count 0 #20148, A cross-object dataset-levelfilterreachesengine.aggregateunrefused on the ObjectQL path — both doors accept what the engine cannot join #10861 and the?filter=family (finding: the list-query normalizer'swherearity note still says a repeated?filter=is refused byisFilterASTfailing #8003, A repeated?filter=answers two different error codes depending on which data route received it #8001, docs:data-api.mdxdocumentsfilter's rejection behaviour but not the repetition refusal PR #8004 adds #8005, finding: a repeated?filter=onGET /data/:objectcannot be told from a filter AST, so it is diagnosed as a malformed filter (and, rarely, succeeds) #7390, A filter array that isn't a valid AST reaches the driver as an opaquewhere— reject it at the protocol instead #4121), none this.Dedupe words:
having placeholder token not resolved·having FILTER_TOKEN_UNKNOWN missing·per-aggregation filter refusal path where