GLQL <> ES WorkItems Filters Integration
## What is this Epic for and why should we focus on it: This Epic focuses on enabling the use of ElasticSearch (ES) as the backend for GLQL. This will enable, in some cases, up to 20 times more performant queries, and also allow for key feature development (such as querying Epics and Issues in a single table). The table provides a detailed breakdown of the work that needs to be done and has already been completed to enable ES on the backend. <table> <tr> <th>GLQL fields</th> <th>Supported Operators and wildcard filters</th> <th>Implemented</th> </tr> <tr> <td> `type` </td> <td> `=`, `in` </td> <td> :white_check_mark: </td> </tr> <tr> <td> `assignee` </td> <td> `=`, `in`, `!=`, `none`, `any` </td> <td> :white_check_mark: </td> </tr> <tr> <td> `closed` </td> <td> `=`, `>`, `<`, `>=`, `<=` </td> <td> :white_check_mark: </td> </tr> <tr> <td> `confidential` </td> <td> `=`, `!=` </td> <td> :white_check_mark: </td> </tr> <tr> <td> `created` </td> <td> `=`, `>`, `<`, `>=`, `<=` </td> <td> :white_check_mark: </td> </tr> <tr> <td> `due` </td> <td> `=`, `>`, `<`, `>=`, `<=` </td> <td> :white_check_mark: </td> </tr> <tr> <td> `group` </td> <td> `=` </td> <td> :white_check_mark: </td> </tr> <tr> <td> `health` </td> <td> `=`, `!=`, `none`, `any` </td> <td> :white_check_mark: </td> </tr> <tr> <td> `id` </td> <td> `=`, `in` </td> <td> :white_check_mark: </td> </tr> <tr> <td> `includeSubgroups` </td> <td> `=`, `!=` </td> <td> :warning: Currently we always search in the sub group hierarchy (`includeSubgroups = false` is not supported). </td> </tr> <tr> <td> `label` </td> <td> `=`, `in`, `!=`, `scoped_label::*` </td> <td> :white_check_mark: </td> </tr> <tr> <td> `milestone` </td> <td> `=`, `in`, `!=`, `none`, `any`, `started`, `upcoming` </td> <td> :white_check_mark: </td> </tr> <tr> <td> `project` </td> <td> `=` </td> <td> :white_check_mark: </td> </tr> <tr> <td> `state` </td> <td> `=` </td> <td> :white_check_mark: </td> </tr> <tr> <td> `updated` </td> <td> `=`, `>`, `<`, `>=`, `<=` </td> <td> :white_check_mark: </td> </tr> <tr> <td> `weight` </td> <td> `=`, `!=`, `none`, `any` </td> <td> :white_check_mark: </td> </tr> <tr> <td> `author` </td> <td> `=`, `!=`, `in` </td> <td> :white_check_mark: `=`, `!=` :x: `in` </td> </tr> <tr> <td> `sort` </td> <td> `created`, `updated`, `health`, `weight`, `closed`, `due`, `milestone`, `popularity`, `title` </td> <td> :white_check_mark: all implemented :x: except for `title` (see related [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/565410)) </td> </tr> <tr> <td> `parent` </td> <td> `=`, `!=`, `in`, `none`, `any`, `includeDescendantWorkItems` </td> <td> :x: </td> </tr> <tr> <td> `iteration` </td> <td> `=`, `in`, `!=` </td> <td> :x: </td> </tr> <tr> <td> `cadence` </td> <td> `=`, `in`, `!=` </td> <td> :x: </td> </tr> <tr> <td> `subscribed` </td> <td> `=`, `!=` </td> <td> :x: </td> </tr> <tr> <td> `my_reaction_emoji` </td> <td> `=`, `!=` </td> <td> :x: </td> </tr> <tr> <td> `custom_field` </td> <td> `=` </td> <td> :x: </td> </tr> <tr> <td> `custom_status` </td> <td> `=` </td> <td> :x: Will be supported when this [MR](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/202489) gets merged. </td> </tr> </table> ## Remaining Work as of 2025-09-01 Alisa departed GitLab and [noted](https://gitlab.com/groups/gitlab-org/-/epics/17460#note_2715064668) the following work required to finish off this Epic: * [ ] Implement the remaining filters and sorts (reference the above table for context) * [ ] Consider indexing all work items in ES, currently there are some limits set as to what to index https://gitlab.com/gitlab-org/gitlab/-/issues/526224 * [ ] Have separate Redis zset for work items to speed up reindexing from 1 minute to up to 1 second * [ ] Start using ES for Work items lists (there is already a feature flag in place (`:work_items_list_es_integration`) * [ ] Use traversal_ids for search confidential filter for even more optimization The `~glql-handover` label is added to the above Issues that should address the above goals.
epic