Bump GLQL to 0.39.0
What does this MR do and why?
Bumps GLQL gem and npm package to 0.39.0. Integration work tracked in glql#229 (closed).
Presenter changes (app/assets/javascripts/glql/):
- Chart labels flatten list-valued parameters, so
userTier(thresholds=[4, 25, 100])renders as "User tier (4, 25, 100)" instead of "(4,25,100)". - A
Grouplabel formatter is registered for chart dimensions. Without it, unregistered object types label as "" and every group collapses into one series. It prefersfullName, thenfullPath, to match the table's link presenter. - Fixed-day buckets (
30d) are labelled as a date range, same as weekly buckets, and the multi-year label check extends the last bucket by its span. - Table columns of
Grouptype sort by full name; the sorter had noGroupentry, so clicking the newgroupdimension's header did nothing. - The DuoWorkflows
totalCountstat description matches the backend field description, "Total number of flows, optionally filtered by status." (pot regenerated).
Docs:
duo_workflows.md:userTierdimension,flowTypesUsed/activeDaysfilters,statusparameter ontotalCount,groupdimension, and examples.ai_usage_events.md:groupdimension._index.md: list values in field parameters, fixed-day granularities, theoriginparameter with a two-period example, and the operators behaviour change below.- Every analytics source page: wider granularity wording.
doc/api/glql.md: the new schema parameter kinds and attributes.
Deliberately left out: the DAP Impact dashboard changes listed in glql#229 (closed) (group comparison panel, status tiles, origin-based period comparison). Those will be a separate MR.
Behaviour changes to call out
- Compile error for
=combined with another comparison on the same date field, for every data source and mode, standard mode included. Example:type = Issue and created = 2024-01-01 and created > 2023-01-01now returns an error. Before, only one of the two conditions reached the query. Existing GLQL blocks written this way will show the error after this bump. Source: glql!516 (merged).
Observed, not changed: labelWithParameter appends every resolved parameter value, so an unaliased group dimension is titled "Group (1)" from the defaulted depth, and an unaliased created(granularity=30d, origin=2026-07-16) is titled "Created (30d, 2026-07-16T00:00:00Z)" in both chart axis titles and table headers. Same mechanism as created(weekly) today; the docs examples alias these fields.
Follow-ups (not in this MR)
- Chart builders use the dimension label as the series identity. Rows that share a label, including several
group: nullrows from the newgroupdimension, overwrite each other, so counts of 12 and 7 display as 7. Needs identity separated from label forUserCore,ProjectandGroup, plus an explicit policy for unresolved rows, since summing is wrong for unique counts, averages and quantiles. Tracked in #630162. userTiervalues render raw (tier_0,tier_1, ...). A human label such as "4-24" needsparameters.thresholdsin both the table presenter and the chart label formatter, or tables and charts disagree. The docs row explains the tier numbering.- Fixed-day bucket labels use calendar dates and ignore the time of day of
origin. Showing the exact boundary would mean readingparameters.originin the label formatter, since the bucket start the engine returns is date-only. No issue filed; the docs state the limitation.
Related glql MRs shipped in 0.39.0
- glql!516 (merged) - userTier, flowTypesUsed, activeDays
- glql!522 (merged) - list literals in field-function arguments
- glql!527 (merged) - totalCount(status=...)
- glql!528 (merged) - fixed-day Xd granularity
- glql!529 (merged) - origin parameter
- glql!530 (merged) - group dimension
Screenshots
Verified on GDK with a locally built 0.39.0 wasm package, against local ClickHouse data. Every GLQL example added to the docs compiles with the 0.39.0 gem through the same path as POST /api/glql and renders without errors on GDK.
| GLQL | Screenshot |
|---|---|
|
|
|
|
|
|
|
|
|
How to set up and validate locally
-
With the
dap_impact_v1feature flag enabled:mode: analytics query: type = DuoWorkflow and group = "<your-group>" and created > -90d dimensions: userTier(thresholds=[4, 25, 100]), flowType metrics: totalCount, usersCount sort: userTier asc
MR acceptance checklist
This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.
- I have evaluated the MR acceptance checklist for this MR.
Related to glql#229 (closed)




