From 9e5665ddbc5c956d1f104a315464806518192018 Mon Sep 17 00:00:00 2001 From: Vladimir Shushlin Date: Thu, 19 Dec 2024 13:05:09 +0100 Subject: [PATCH] Rewrite GLQL docs to move blocks down I see a lot of value in blocks/embeds being on the same page as the GLQL docs So instead of splitting the page in two, I suggest we list "features" down on the same page. I just moved a paragraphs around, didn't change the content much. If you have any suggestions on the content which was already there, please open a follow-up MR. See the discussion in https://gitlab.com/gitlab-org/gitlab/-/issues/509798#note_2266036431 Update file index.md Update GLQL docs Use authenticated user instead of logged in user Formatting edits to functions.md Edit page intros and add availability Format example code blocks More TW edits Move additional details above examples Fix offering format Fix linting for real Update docs as per feedback Address review feedback Fix offering spelling Trim and compress image --- doc/user/glql/fields.md | 1034 ++++++++++++++++++++++++ doc/user/glql/functions.md | 142 ++++ doc/user/glql/img/glql_table_v17_5.png | Bin 33554 -> 0 bytes doc/user/glql/img/glql_table_v17_8.png | Bin 0 -> 27489 bytes doc/user/glql/index.md | 234 ++---- 5 files changed, 1257 insertions(+), 153 deletions(-) create mode 100644 doc/user/glql/fields.md create mode 100644 doc/user/glql/functions.md delete mode 100644 doc/user/glql/img/glql_table_v17_5.png create mode 100644 doc/user/glql/img/glql_table_v17_8.png diff --git a/doc/user/glql/fields.md b/doc/user/glql/fields.md new file mode 100644 index 00000000000000..67dfda746a31b2 --- /dev/null +++ b/doc/user/glql/fields.md @@ -0,0 +1,1034 @@ +--- +stage: Plan +group: Knowledge +info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments +--- + +# GLQL fields + +DETAILS: +**Tier:** Free, Premium, Ultimate +**Offering:** GitLab.com, GitLab Self-Managed +**Status:** Experiment + +> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/14767) in GitLab 17.4 [with a flag](../../administration/feature_flags.md) named `glql_integration`. Disabled by default. +> - Enabled on GitLab.com in GitLab 17.4 for a subset of groups and projects. +> - `iteration` and `cadence` fields [introduced](https://gitlab.com/gitlab-org/gitlab-query-language/gitlab-query-language/-/issues/74) in GitLab 17.6. + +FLAG: +The availability of this feature is controlled by a feature flag. +For more information, see the history. +This feature is available for testing, but not ready for production use. + +In a GitLab Query Language (GLQL) [query](index.md#query-syntax), a field is the leftmost part +of the expression. +In queries, fields follow the syntax of ` and ...`, + +In a [GLQL view](index.md#glql-views), fields are included as a comma-separated list of tokens in +the `fields:` option. + +This page lists fields available to use as filters when querying issues or work items. + +## Type + +**Field name**: `type` + +**Allowed operators**: `=`, `in` + +**Allowed value types**: + +- `Enum` (one of `Issue`, `Incident`, `TestCase`, `Requirement`, `Task`, `Ticket`, `Objective`, + `KeyResult`, `Epic`, or `MergeRequest`) +- `List` (containing one or more `enum` values above) + +**Allowed in columns of a GLQL view**: Only for issue and work item types. + +**Additional details**: + +- If omitted when used inside a GLQL view, all issue and work item types are included by default. +- Work item types (like `Issue`, `Task`, or `Objective`) cannot be used together with `MergeRequest` types. +- The type field isn't allowed in columns of a GLQL view for `MergeRequest` types. + +**Examples**: + +- List issues of type `Incident`: + + ```plaintext + type = incident + ``` + +- List issues of types `Issue` or `Task`: + + ```plaintext + type in (Issue, Task) + ``` + +- List all merge requests assigned to the current user: + + ```plaintext + type = MergeRequest and assignee = currentUser() + `` + +## Approved by user + +**Field name**: `approver` + +**Allowed operators**: `=`, `!=` + +**Allowed value types**: + +- `String` +- `User` (for example, `@username`) +- `List` (containing `String` or `User` values) +- `Nullable` (either of `null`, `none`, or `any`) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: `MergeRequest` + +**Examples**: + +- List all merge requests approved by current user and `@johndoe` + + ```plaintext + type = MergeRequest and approver = (currentUser(), @johndoe) + ``` + +## Assignees + +**Field name**: `assignee` + +**Allowed operators**: `=`, `in`, `!=` + +**Allowed value types**: + +- `String` +- `User` (for example, `@username`) +- `List` (containing `String` or `User` values) +- `Nullable` (either of `null`, `none`, or `any`) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` +- `MergeRequest` + +**Examples**: + +- List all issues where assignee is `@johndoe`: + + ```plaintext + assignee = @johndoe + ``` + +- List all issues where assignees are both `@johndoe` and `@janedoe`: + + ```plaintext + assignee = (@johndoe, @janedoe) + ``` + +- List all issues where assignees are either of `@johndoe` or `@janedoe`: + + ```plaintext + assignee in (@johndoe, @janedoe) + ``` + +- List all issues where assignee is neither of `@johndoe` or `@janedoe`: + + ```plaintext + assignee != (@johndoe, @janedoe) + ``` + +- List all merge requests where assignee is `@johndoe`: + + ```plaintext + type = MergeRequest and assignee = @johndoe + ``` + +**Additional details:** + +- `List` values and the `in` operator are not supported for `MergeRequest` types. + +## Author + +**Field name**: `author` + +**Allowed operators**: `=`, `in`, `!=` + +**Allowed value types**: + +- `String` +- `User` (for example, `@username`) +- `List` (containing `String` or `User` values) +- `Nullable` (either of `null`, `none`, or `any`) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` +- `MergeRequest` + +**Additional details**: + +- Because an issue can have only one author, the `=` operator cannot be used with `List` type for + the `author` field. +- `List` values and the `in` operator are not supported for `MergeRequest` types. + +**Examples**: + +- List all issues where author is `@johndoe`: + + ```plaintext + author = @johndoe + ``` + +- List all issues where author is either of `@johndoe` or `@janedoe`: + + ```plaintext + author in (@johndoe, @janedoe) + ``` + +- List all issues where author is neither of `@johndoe` or `@janedoe`: + + ```plaintext + author != (@johndoe, @janedoe) + ``` + +- List all merge requests where author is `@johndoe`: + + ```plaintext + type = MergeRequest and author = @johndoe + ``` + +## Cadence + +**Field name**: `cadence` + +**Allowed operators**: `=`, `in`, `!=` + +**Allowed value types**: + +- `Number` (only positive integers) +- `List` (containing `Number` values) +- `Nullable` (either of `none`, or `any`) + +**Allowed in columns of a GLQL view**: No + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` + +**Additional details**: + +- Because an issue can have only one iteration, the `=` operator cannot be used with `List` type for the `cadence` field. + +**Examples**: + +- List all issues with iteration that are a part of cadence ID `123456`: + + ```plaintext + cadences = 123456 + ``` + +- List all issues with iterations that are a part of any cadences `123` or `456`: + + ```plaintext + cadence in (123, 456) + ``` + +## Closed at + +**Field name**: `closed` + +**Allowed operators**: `=`, `>`, `<` + +**Allowed value types**: + +- `AbsoluteDate` (in the format `YYYY-MM-DD`) +- `RelativeDate` (in the format ``, where sign is `+`, `-`, or omitted, + digit is an integer, and `unit` is one of `d` (days), `w` (weeks), `m` (months) or `y` (years)) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` + +**Additional details**: + +- For the `=` operator, the time range is considered from 00:00 to 23:59 in the user's time zone. + +**Examples**: + +- List all issues closed since yesterday: + + ```plaintext + closed > -1d + ``` + +- List all issues closed today: + + ```plaintext + closed = today() + ``` + +- List all issues closed in the month of February 2023: + + ```plaintext + closed > 2023-02-01 and closed < 2023-02-28 + ``` + +## Confidential + +**Field name**: `confidential` + +**Allowed operators**: `=`, `!=` + +**Allowed value types**: + +- `Boolean` (either of `true` or `false`) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` + +**Additional details**: + +- Confidential issues queried using GLQL are only visible to people who have permission to view them. + +**Examples**: + +- List all confidential issues: + + ```plaintext + confidential = true + ``` + +- List all issues that are not confidential: + + ```plaintext + confidential = false + ``` + +## Created at + +**Field name**: `created` + +**Allowed operators**: `=`, `>`, `<` + +**Allowed value types**: + +- `AbsoluteDate` (in the format `YYYY-MM-DD`) +- `RelativeDate` (in the format ``, where sign is `+`, `-`, or omitted, + digit is an integer, and `unit` is one of `d` (days), `w` (weeks), `m` (months) or `y` (years)) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` +- `MergeRequests` + +**Additional details**: + +- For the `=` operator, the time range is considered from 00:00 to 23:59 in the user's time zone. + +**Examples**: + +- List all issues that were created in the last week: + + ```plaintext + created > -1w + ``` + +- List all issues created today: + + ```plaintext + created = today() + ``` + +- List all issues created in the month of January 2025 that are still open: + + ```plaintext + created > 2025-01-01 and created < 2025-01-31 and state = opened + ``` + +## Deployed at + +**Field name**: `deployed` + +**Allowed operators**: `=`, `>`, `<` + +**Allowed value types**: + +- `AbsoluteDate` (in the format `YYYY-MM-DD`) +- `RelativeDate` (in the format ``, where sign is `+`, `-`, or omitted, + digit is an integer, and `unit` is one of `d` (days), `w` (weeks), `m` (months) or `y` (years)) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: `MergeRequest` + +**Additional details**: + +- For the `=` operator, the time range is considered from 00:00 to 23:59 in the user's time zone. + +**Examples**: + +- List all merge requests that have been deployed in the past week: + + ```plaintext + type = MergeRequest and deployed > -1w + ``` + +- List all merge requests that have been deployed in the month of January 2025: + + ```plaintext + type = MergeRequest and deployed > 2025-01-01 and deployed < 2025-01-31 + ``` + +## Draft + +**Field name**: `draft` + +**Allowed operators**: `=`, `!=` + +**Allowed value types**: + +- `Boolean` (either of `true` or `false`) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: `MergeRequest` + +**Examples**: + +- List all draft merge requests: + + ```plaintext + type = MergeRequest and draft = true + ``` + +- List all merge requests that are not in draft state: + + ```plaintext + type = MergeRequest and draft = false + ``` + +## Due date + +**Field name**: `due` + +**Allowed operators**: `=`, `>`, `<` + +**Allowed value types**: + +- `AbsoluteDate` (in the format `YYYY-MM-DD`) +- `RelativeDate` (in the format ``, where sign is `+`, `-`, or omitted, + digit is an integer, and `unit` is one of `d` (days), `w` (weeks), `m` (months) or `y` (years)) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` + +**Additional details**: + +- For the `=` operator, the time range is considered from 00:00 to 23:59 in the user's time zone. + +**Examples**: + +- List all issues due in a week: + + ```plaintext + due < 1w + ``` + +- List all issues that were overdue as of January 1, 2025: + + ```plaintext + due < 2025-01-01 + ``` + +- List all issues that are due today (but not due yesterday or tomorrow): + + ```plaintext + due = today() + ``` + +- List all issues that have been overdue in the last 1 month: + + ```plaintext + due > -1m and due < today() + ``` + +## Environment + +**Field name**: `environment` + +**Allowed operators**: `=` + +**Allowed value types**: `String` + +**Allowed in columns of a GLQL view**: No + +**Supported for object types**: `MergeRequest` + +**Examples**: + +- List all merge requests that have been deployed to environment `production`: + + ```plaintext + environment = "production" + ``` + +## Group + +**Field name**: `group` + +**Allowed operators**: `=` + +**Allowed value types**: `String` + +**Allowed in columns of a GLQL view**: No + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` +- `MergeRequest` + +**Additional details**: + +- Only one group can be queried at a time. +- The `group` cannot be used together with the `project` field. +- If omitted when using inside a GLQL view in a group object (like an epic), `group` is assumed to + be the current group. +- Using the `group` field queries all objects in that group, all its subgroups, and child projects. + +**Examples**: + +- List all issues in the `gitlab-org` group and any of its subgroups: + + ```plaintext + group = "gitlab-org" + ``` + +- List all Tasks in the `gitlab-org` group and any of its subgroups: + + ```plaintext + group = "gitlab-org" and type = Task + ``` + +## Health status + +**Field name**: `health` + +**Allowed operators**: `=` + +**Allowed value types**: + +- `StringEnum` (one of `"needs attention"`, `"at risk"` or `"on track"`) +- `Nullable` (either of `null`, `none`, or `any`) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` + +**Examples**: + +- List all issues that don't have a health status set: + + ```plaintext + health = any + ``` + +- List all issues where the health status is "needs attention": + + ```plaintext + health = "needs attention" + ``` + +## ID + +**Field name**: `id` + +**Allowed operators**: `=`, `in` + +**Allowed value types**: + +- `Number` (only positive integers) +- `List` (containing `Number` values) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` +- `MergeRequest` + +**Examples**: + +- List issue with ID `123`: + + ```plaintext + id = 123 + ``` + +- List issues with IDs `1`, `2`, or `3`: + + ```plaintext + id in (1, 2, 3) + ``` + +- List all merge requests with IDs `1`, `2`, or `3`: + + ```plaintext + type = MergeRequest and id in (1, 2, 3) + ``` + +## Iteration + +**Field name**: `iteration` + +**Allowed operators**: `=`, `in`, `!=` + +**Allowed value types**: + +- `Number` (only positive integers) +- `Iteration` (for example, `*iteration:123456`) +- `List` (containing `Number` or `Iteration` values) +- `Enum` (only `current` is supported) +- `Nullable` (either of `none`, or `any`) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` + +**Additional details**: + +- Because an issue can have only one iteration, the `=` operator cannot be used with `List` type for the `iteration` field. +- The `in` operator is not supported for `MergeRequest` types. + +**Examples**: + +- List all issues with iteration ID `123456` (using a number in the query): + + ```plaintext + iteration = 123456 + ``` + +- List all issues that are a part of iterations `123` or `456` (using numbers): + + ```plaintext + iteration in (123, 456) + ``` + +- List all issues with iteration ID `123456` (using iteration syntax): + + ```plaintext + iteration = *iteration:123456 + ``` + +- List all issues that are a part of iterations `123` or `456` (using iteration syntax): + + ```plaintext + iteration in (*iteration:123, *iteration:456) + ``` + +- List all issues in the current iteration + + ```plaintext + iteration = current + ``` + +## Labels + +**Field name**: `label` + +**Allowed operators**: `=`, `in`, `!=` + +**Allowed value types**: + +- `String` +- `Label` (for example, `~bug`, `~"team::planning"`) +- `List` (containing `String` or `Label` values) +- `Nullable` (either of `none`, or `any`) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` +- `MergeRequest` + +**Additional details**: + +- Scoped labels, or labels containing spaces must be wrapped in quotes. +- The `in` operator is not supported for `MergeRequest` types. + +**Examples**: + +- List all issues with label `~bug`: + + ```plaintext + label = ~bug + ``` + +- List all issues not having label `~"workflow::in progress"`: + + ```plaintext + label != ~"workflow::in progress" + ``` + +- List all issues with labels `~bug` and `~"team::planning"`: + + ```plaintext + label = (~bug, ~"team::planning") + ``` + +- List all issues with labels `~bug` or `~feature`: + + ```plaintext + label in (~bug, ~feature) + ``` + +- List all issues where the labels include neither of `~bug` or `~feature`: + + ```plaintext + label != (~bug, ~feature) + ``` + +- List all issues where none of the scoped labels apply, with scope `workflow::`: + + ```plaintext + label != ~"workflow::*" + ``` + +- List all merge requests with labels `~bug` and `~"team::planning"` + + ```plaintext + type = MergeRequest and label = (~bug, ~"team::planning") + ``` + +## Merged at + +**Field name**: `merged` + +**Allowed operators**: `=`, `>`, `<` + +**Allowed value types**: + +- `AbsoluteDate` (in the format `YYYY-MM-DD`) +- `RelativeDate` (in the format ``, where sign is `+`, `-`, or omitted, + digit is an integer, and `unit` is one of `d` (days), `w` (weeks), `m` (months) or `y` (years)) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: `MergeRequest` + +**Additional details**: + +- For the `=` operator, the time range is considered from 00:00 to 23:59 in the user's time zone. + +**Examples**: + +- List all merge requests that have been merged in the last 6 months: + + ```plaintext + type = MergeRequest and merged > -6m + ``` + +- List all merge requests that have been merged in the month of January 2025: + + ```plaintext + type = MergeRequest and merged > 2025-01-01 and merged < 2025-01-31 + ``` + +## Merged by user + +**Field name**: `merger` + +**Allowed operators**: `=` + +**Allowed value types**: + +- `String` +- `User` (for example, `@username`) +- `List` (containing `String` or `User` values) +- `Nullable` (either of `null`, `none`, or `any`) + +**Allowed in columns of a GLQL view**: No + +**Supported for object types**: `MergeRequest` + +**Examples**: + +- List all merge requests merged by the current user: + + ```plaintext + type = MergeRequest and merger = currentUser() + ``` + +## Milestone + +**Field name**: `milestone` + +**Allowed operators**: `=`, `in`, `!=` + +**Allowed value types**: + +- `String` +- `Milestone` (for example, `%Backlog`, `%"Awaiting Further Demand"`) +- `List` (containing `String` or `Milestone` values) +- `Nullable` (either of `none`, or `any`) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` +- `MergeRequest` + +**Additional details**: + +- Milestones containing spaces must be wrapped in quotes (`"`). +- Because an issue can have only one milestone, the `=` operator cannot be used with `List` type for the `milestone` field. +- The `in` operator is not supported for `MergeRequest` types. + +**Examples**: + +- List all issues with milestone `%Backlog`: + + ```plaintext + milestone = %Backlog + ``` + +- List all issues with milestones `%17.7` or `%17.8`: + + ```plaintext + milestone in (%17.7, %17.8) + ``` + +- List all issues in an upcoming milestone: + + ```plaintext + milestone = upcoming + ``` + +- List all issues in a current milestone: + + ```plaintext + milestone = started + ``` + +- List all issues where the milestone is neither of `%17.7` or `%17.8`: + + ```plaintext + milestone != (%17.7, %17.8) + ``` + +## Project + +**Field name**: `project` + +**Allowed operators**: `=` + +**Allowed value types**: `String` + +**Allowed in columns of a GLQL view**: No + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` +- `MergeRequest` + +**Additional details**: + +- Only one project can be queried at a time. +- The `project` field cannot be used together with the `group` field. +- If omitted when using inside a GLQL view, `project` is assumed to be the current project. + +**Examples**: + +- List all issues and work items in the `gitlab-org/gitlab` project: + + ```plaintext + project = "gitlab-org/gitlab" + ``` + +## Reviewers + +**Field name**: `reviewer` + +**Allowed operators**: `=`, `!=` + +**Allowed value types**: + +- `String` +- `User` (for example, `@username`) +- `List` (containing `String` or `User` values) +- `Nullable` (either of `null`, `none`, or `any`) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: `MergeRequest` + +**Examples**: + +- List all merge requests reviewed by current user and `@johndoe` + + ```plaintext + type = MergeRequest and reviwer = (currentUser(), @johndoe) + ``` + +## State + +**Field name**: `state` + +**Allowed operators**: `=` + +**Allowed in columns of a GLQL view**: Yes + +**Allowed value types**: + +- `Enum` + - For issue and work item types, one of `opened`, `closed`, or `all` + - For `MergeRequest` types, one of `opened`, `closed`, `merged`, or `all` + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` +- `MergeRequest` + +**Additional details**: + +- The `state` field does not support the `!=` operator. + +**Examples**: + +- List all closed issues: + + ```plaintext + state = closed + ``` + +- List all open issues: + + ```plaintext + state = opened + ``` + +- List all issues regardless of their state (also the default): + + ```plaintext + state = all + ``` + +- List all merged merge requests: + + ```plaintext + type = MergeRequest and state = merged + ``` + +## Updated at + +**Field name**: `updated` + +**Allowed operators**: `=`, `>`, `<` + +**Allowed value types**: + +- `AbsoluteDate` (in the format `YYYY-MM-DD`) +- `RelativeDate` (in the format ``, where sign is `+`, `-`, or omitted, + digit is an integer, and `unit` is one of `d` (days), `w` (weeks), `m` (months) or `y` (years)) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` +- `MergeRequests` + +**Additional details**: + +- For the `=` operator, the time range is considered from 00:00 to 23:59 in the user's time zone. + +**Examples**: + +- List all issues that haven't been edited in the last 1 month: + + ```plaintext + updated < -1m + ``` + +- List all issues that were edited today: + + ```plaintext + updated = today() + ``` + +- List all open MRs that haven't been edited in the last 1 week: + + ```plaintext + type = MergeRequest and state = opened and updated < -1w + ``` + +## Weight + +**Field name**: `weight` + +**Allowed operators**: `=`, `!=` + +**Allowed value types**: + +- `Number` (only positive integers) + +**Allowed in columns of a GLQL view**: Yes + +**Supported for object types**: + +- `Issue` +- Work item types like `Task` or `Objective` + +**Additional details**: + +- Comparison operators `<` and `>` cannot be used. + +**Examples**: + +- List all issues with weight 5: + + ```plaintext + weight = 5 + ``` + +- List all issues with weight not 5: + + ```plaintext + weight != 5 + ``` diff --git a/doc/user/glql/functions.md b/doc/user/glql/functions.md new file mode 100644 index 00000000000000..fbf46920eb540d --- /dev/null +++ b/doc/user/glql/functions.md @@ -0,0 +1,142 @@ +--- +stage: Plan +group: Knowledge +info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments +--- + +# GLQL functions + +DETAILS: +**Tier:** Free, Premium, Ultimate +**Offering:** GitLab.com, GitLab Self-Managed +**Status:** Experiment + +> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/14767) in GitLab 17.4 [with a flag](../../administration/feature_flags.md) named `glql_integration`. Disabled by default. +> - Enabled on GitLab.com in GitLab 17.4 for a subset of groups and projects. +> - `iteration` and `cadence` fields [introduced](https://gitlab.com/gitlab-org/gitlab-query-language/gitlab-query-language/-/issues/74) in GitLab 17.6. + +FLAG: +The availability of this feature is controlled by a feature flag. +For more information, see the history. +This feature is available for testing, but not ready for production use. + +Use functions with [GitLab Query Language (GLQL)](index.md) to create dynamic queries. + +## Functions inside query + +To make a query context-specific, use functions inside a [query](index.md#query-syntax), for example, +by filtering by a current user or a date. + +### Current user + +**Function name**: `currentUser` + +**Parameters**: None + +**Syntax**: `currentUser()` + +**Description**: Evaluates to the current authenticated user. + +**Additional details**: + +- Using this function in a query makes the query fail for users who are not authenticated. + +**Examples**: + +- List all issues where the current authenticated user is the assignee: + + ```plaintext + assignee = currentUser() + ``` + +- List all merge requests where the current authenticated user is the assignee but not the author: + + ```plaintext + type = MergeRequest and assignee = currentUser() and author != currentUser() + ``` + +### Today + +**Function name**: `today` + +**Parameters**: None + +**Syntax**: `today()` + +**Description**: Evaluates to today's date at 00:00 in the user's time zone. + +**Additional details**: + +- When used with the `=` operator, the time range is considered from 00:00 to 23:59 in the user's time zone. + +**Examples**: + +- List all issues created today: + + ```plaintext + created = today() + ``` + +- List all merge requests merged today: + + ```plaintext + type = MergeRequest and merged = today() + ``` + +## Functions in GLQL views + +To derive a new column from an existing field of a [GLQL view](index.md#glql-views), include +functions in the `fields` parameter. + +### Extract labels into a new column + +**Function name**: `labels` + +**Parameters**: One or more `String` values + +**Syntax**: `labels("field1", "field2")` + +**Description**: + +The `labels` function takes one or more label name string values as parameter, +and creates a filtered column with only those labels on issues. +The function also works as an extractor, so if a label has been extracted, it no longer shows up +in the regular `labels` column, if you choose to display that column as well. + +**Additional details**: + +- By default, this function looks for an exact match to the label name. + A wildcard character (`*`) in the string to match any character. +- A minimum of 1 and maximum of 100 label names can be passed to the `labels` function. +- Label names passed to this function are case-insensitive. For example, `Deliverable` and `deliverable` are equivalent. + +**Examples**: + +- Include all `workflow` scoped labels in the column: + + ```plaintext + labels("workflow::*") + ``` + +- Include labels `Deliverable`, `Stretch`, and `Spike`: + + ```plaintext + labels("Deliverable", "Stretch", "Spike") + ``` + +- Include all labels like `backend`, `frontend`, and others that end with `end`: + + ```plaintext + labels("*end") + ``` + +To include the `labels` function in a GLQL view: + +````markdown +```glql +display: list +fields: title, health, due, labels("workflow::*"), labels +limit: 5 +query: project = "gitlab-org/gitlab" AND assignee = currentUser() AND opened = true +``` +```` diff --git a/doc/user/glql/img/glql_table_v17_5.png b/doc/user/glql/img/glql_table_v17_5.png deleted file mode 100644 index 026d2a5e741e837abb33907fde32920de0cfd3ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33554 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 W6v`^PrkjC*fx*+&&t;ucLK6UAH^~10 diff --git a/doc/user/glql/img/glql_table_v17_8.png b/doc/user/glql/img/glql_table_v17_8.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb6b5ed3a6e962470af6e942b72468e2424c5ff GIT binary patch literal 27489 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 and ...`. -- Wikis (group and project) -- Epics and epic comments -- Issue and issue comments -- Merge requests and merge request comments -- Work items (tasks, OKRs, epics [with the new look](../group/epics/epic_work_items.md)) and work item comments +### Fields -### Supported objects to query +Field names can have values like `assignee`, `author`, `label`, and `milestone`. +A `type` field can be used to filter a query by the object type, like `Issue`, `MergeRequest`, +or work item types like `Task` or `Objective`. -GLQL can only query issues under a project or group. +For a full list of supported fields, supported operators, and value types, see [GLQL fields](fields.md). -## Syntax +### Operators -> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/508956) in GitLab 17.7: Configuring the presentation layer using YAML front matter is deprecated. +**Comparison operators:** -The syntax of GLQL is a superset of YAML that consists of: +| GLQL operator | Description | Equivalent in search | +|---------------|-----------------------------------------|------------------------| +| `=` | Equals / Includes all in list | `is` (equal to) | +| `!=` | Doesn't equal / Isn't contained in list | `is not` (equal to) | +| `in` | Contained in list | `or` / `is one of` | +| `>` | Greater than | **{dotted-circle}** No | +| `<` | Less than | **{dotted-circle}** No | -- The `query` parameter: Expressions joined together with a logical operator, such as `AND`. -- Parameters related to the presentation layer, like `display`, `limit`, `fields`. +**Logical operators**: Only `and` is supported. +`or` is indirectly supported for some fields by using the `in` comparison operator. -A GLQL block is defined in Markdown as a code block, similar to other code blocks like Mermaid. +### Values -For example: +Values can include: -> Display a table of first 5 open issues assigned to the authenticated user in `gitlab-org/gitlab`. -> Display columns `title`, `state`, `health`, `description`, `epic`, `milestone`, `weight`, and `updated`. - -````markdown -```glql -display: table -fields: title, state, health, epic, milestone, weight, updated -limit: 5 -query: project = "gitlab-org/gitlab" AND assignee = currentUser() AND opened = true -``` -```` - -This query should render a table like the one below: +- Strings +- Numbers +- Relative dates (like `-1d`, `2w`, `-6m`, or `1y`) +- Absolute dates (in `YYYY-MM-DD` format, like `2025-01-01`) +- Functions (like `currentUser()` for user fields or `today()` for dates) +- Enum values (like `upcoming` or `started` for milestones) +- Booleans (`true` or `false`) +- Nullable values (like `null`, `none`, or `any`) +- GitLab references (like `~label` for a label, `%Backlog` for a milestone, or `@username` for a user) +- Lists containing any of the above (surrounded by parenthesis: `()` and delimited by commas: `,`) -![A table listing issues assigned to the current user](img/glql_table_v17_5.png) +## GLQL views -### Query syntax +> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/508956) in GitLab 17.7: Configuring the presentation layer using YAML front matter is deprecated. -GLQL syntax consists primarily of logical expressions. -These expressions follow the syntax of ` [< | > | = | != | in] [AND] ...`. +A view created with GLQL is a display representation of a query that executes to +fetch the desired results. -**Field names** include `assignee`, `author`, `label`, and `milestone`. -For a full list of supported fields, see the table at the bottom of this section. +### Supported areas -**Comparison operators**: +Views can be embedded in the following areas: -| GLQL operator | Description | Equivalent in search | -| ------------- | ----------------- | -------------------- | -| `=` | Equals | `is` (equal to) | -| `!=` | Doesn't equal | `is not` (equal to) | -| `in` | Contained in list | `or` / `is one of` | -| `>` | Greater than | **{dotted-circle}** No | -| `<` | Less than | **{dotted-circle}** No | +- Group and project wikis +- Descriptions and comments of: + - Epics + - Issues + - Merge requests + - Work items (tasks, OKRs, epics [with the new look](../group/epics/epic_work_items.md)) -**Logical operators**: Only `AND` is supported. -`OR` is indirectly supported for some fields by using the `IN` comparison operator. +### Syntax -**Values**: Values can include: +The syntax of views is a superset of YAML that consists of: -- Strings -- Numbers -- Dates (relative or absolute) -- Functions (like `currentUser()` for assignee or `today()` for dates) -- Special tokens (like `upcoming` or `started` for milestones) +- The `query` parameter: Expressions joined together with a logical operator, such as `and`. +- Parameters related to the presentation layer, like `display`, `limit`, or `fields`. -The following table lists all supported fields and their value types: +A GLQL view is defined in Markdown as a code block, similar to other code blocks like Mermaid. -| Field | Operators | Values | Examples | -| ------------------------------------------------- | ---------------------------- | -------------------------------------------------------------------------- | -------- | -| `assignee`
`author` | `=`
`!=`
`in` | `String`
`Collection`
`currentUser()`
`any`
`none` | `assignee = "foobar"`
`assignee in ("foobar", "baz")`
`author = currentUser()`
`author = any`
`assignee = none` | -| `project`
`group` | `=`
`!=` | `String` | `project = "gitlab-org/gitlab"`
`group = "gitlab-org"` | -| `closed`
`opened`
`confidential` | `=`
`!=` | `Boolean` | `closed = true`
`opened = true`
`confidential = true` | -| `closed`
`opened`
`created`
`updated` | `=`
`!=`
`<`
`>` | `Date`
`String`
`today()` | `updated = today()`
`created > -28d` (created in the last 28 days)
`created < -7d` (created at least a week ago)
`created > 2024-08-12`
`updated < "2024-08-12"` | -| `health` | `=`
`!=` | `Enum(`
`"on track"`
`"needsAttention"`
`"at risk"`
`)` | `health = "on track"`
`health != "on track"`
`health = "at risk"` | -| `milestone` | `=`
`!=` | `String`
`any`
`none`
`started`
`upcoming` | `milestone = "17.4"`
`milestone = "Backlog"`
`milestone != none` | -| `iteration`
`cadence` | `=`
`!=` | `String`
`any`
`none`
`current` | `iteration = 123`
`cadence = 123`
`cadence = 123 and iteration = current` | -| `label` | `=`
`!=`
`in` | `String`
`Collection`
`any`
`none` | `label != none`
`label in ("feature", "bug")` (has the `feature` or `bug` label)
`label = ("bug", "priority::1")` (has both `bug` and `priority::1` labels)
`label = "bug"` | -| `weight` | `=`
`!=` | `Number` | `weight = 1`
`weight != 2 and weight != 1` | +For example: -#### Query shorthand syntax +> Display a table of first 5 open issues assigned to the authenticated user in `gitlab-org/gitlab`. +> Display columns `title`, `state`, `health`, `description`, `epic`, `milestone`, `weight`, and `updated`. -When querying multiple labels and assignees, you can also use the shorthand syntax to simplify the query. +````yaml +```glql +display: table +fields: title, state, health, epic, milestone, weight, updated +limit: 5 +query: project = "gitlab-org/gitlab" AND assignee = currentUser() AND opened = true +``` +```` -For example: +This query should render a table like the one below: -| Shorthand syntax | Full equivalent | -| --------------------------------- | --------------- | -| `label != ("label 1", "label 2")` | `label != "label 1" and label != "label 2"` | -| `label = ("label 1", "label 2")` | `label = "label 1" and label = "label 2"` | -| `assignee != ("user1", "user2")` | `assignee != "user1" and assignee != "user2"` | -| `assignee = ("user1", "user2")` | `assignee = "user1" and assignee = "user2"` | +![A table listing issues assigned to the current user](img/glql_table_v17_8.png) -### Presentation syntax +#### Presentation syntax Aside from the `query` parameter, you can configure presentation details for your GLQL query using some more parameters. -Three parameters are supported: - -| Parameter | Default | Description | -| ------------ | ------- | ----------- | -| `display` | `table` | How to display the data. Supported options: `table`, `list`, or `orderedList`. | -| `limit` | `100` | How many items to display. The maximum value is `100`. | -| `fields` | `title` | A comma-separated list of fields. | - -Supported fields to display: - -- `assignees` -- `author` -- `closed` -- `created` -- `description` -- `due` -- `health` -- `iteration` -- `cadence` -- `labels` -- `milestone` -- `state` -- `title` -- `type` -- `updated` -- `weight` +Supported parameters: -For example: +| Parameter | Default | Description | +| --------- | ------- | ----------- | +| `display` | `table` | How to display the data. Supported options: `table`, `list`, or `orderedList`. | +| `limit` | `100` | How many items to display. The maximum value is `100`. | +| `fields` | `title` | A comma-separated list of [fields](fields.md). All fields allowed in columns of a GLQL view are supported. | -> Display first five issues assigned to current user in the `gitlab-org/gitlab` project as a list, -> displaying fields `title`, `health`, and `due`. +For example, to display first five issues assigned to current user in the `gitlab-org/gitlab` +project as a list, displaying fields `title`, `health`, and `due`: -````markdown +````yaml ```glql ---- display: list fields: title, health, due limit: 5 ---- -project = "gitlab-org/gitlab" AND assignee = currentUser() AND opened = true +query: project = "gitlab-org/gitlab" AND assignee = currentUser() AND opened = true ``` ```` #### Field functions -In the `fields` parameter, you can also include functions to derive a column from an existing field. - -In the initial version, only the `labels` function is supported. - -##### `labels` - -- **Syntax**: `labels("field1", "field2")` - -- **Description**: The `labels` function takes one or more label name string values as parameter, - and creates a filtered column with only those labels on issues. - The function also works as an extractor, so if a label has been extracted, it no longer shows up - in the regular `labels` column, if you choose to display that column as well. - - By default, this function looks for an exact match to the label name. You can include `*` in the string to match one or more - wildcard characters. - - The label names you pass are case-insensitive, so `Deliverable` and `deliverable` are equivalent. - -- **Limits**: A minimum of 1 and maximum of 100 label names can be passed to the `labels` function. - -- **Usage examples**: - - - `labels("workflow::*")`: Include all `workflow` scoped labels in the column. - - `labels("Deliverable", "Stretch", "Spike")`: Include labels `Deliverable`, `Stretch`, and `Spike`. - - `labels("*end")`: Include all labels like `backend`, `frontend`, and others that end with `end`. - - To include the function in the query, follow this example: - - ````markdown - ```glql - display: list - fields: title, health, due, labels("workflow::*"), labels - limit: 5 - query: project = "gitlab-org/gitlab" AND assignee = currentUser() AND opened = true - ``` - ```` - -## Known issues - -For a full list of known issues, see [epic 14437 "GitLab Query Language (GLQL) Strategy"](https://gitlab.com/groups/gitlab-org/-/epics/14437). +To create dynamically generated columns, use functions in the `fields` parameters in views. +For a full list, see [Functions in GLQL views](functions.md#functions-in-glql-views). -- GitLab