Commit 0b0ade4d authored by Dylan Griffith's avatar Dylan Griffith

Don't use Elasticsearch join for group/project MR searches

When searching for merge requests in the context of a group we don't
need to use an Elasticsearch join. The join logic [defined in
ApplicationClassProxy](
https://gitlab.com/gitlab-org/gitlab/-/blob/339e55b484ce7f4250ef5bbb451c9ed2eac7c6e2/ee/lib/elastic/latest/application_class_proxy.rb#L145
) is not necessary as we are already filtering down based on the project
ID list the user has access to and hence we can just use the
`target_project_id` field instead of joining to the project and using
the ID field.

This MR is basically identical to
https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46461 but in this
case we need to use `target_project_id` instead of `project_id` since
the MR only had `target_project_id` until recently and `project_id` is
not yet backfilled.

This change on it's own will make searches more performance (since this
term query is more efficient than a join) but it will additionally be
the next step in allowing us to move merge requests to a separate index
in Elasticsearch https://gitlab.com/groups/gitlab-org/-/epics/5468
parent 805cb39b
---
title: Don't use Elasticsearch join for group/project MR searches
merge_request: 60249
author:
type: performance
...@@ -32,6 +32,31 @@ module Elastic ...@@ -32,6 +32,31 @@ module Elastic
relation.includes(target_project: [:project_feature]) relation.includes(target_project: [:project_feature])
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
private
# Builds an elasticsearch query that will select documents from a
# set of projects for Group and Project searches, taking user access
# rules for merge_requests into account. Relies upon super for Global searches
def project_ids_filter(query_hash, options)
return super if options[:public_and_internal_projects]
current_user = options[:current_user]
scoped_project_ids = scoped_project_ids(current_user, options[:project_ids])
return super if scoped_project_ids == :any
context.name(:project) do
query_hash[:query][:bool][:filter] ||= []
query_hash[:query][:bool][:filter] << {
terms: {
_name: context.name,
target_project_id: filter_ids_by_feature(scoped_project_ids, current_user, 'merge_requests')
}
}
end
query_hash
end
end end
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment