diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-10-21 07:08:36 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-10-21 07:08:36 +0000 |
commit | 48aff82709769b098321c738f3444b9bdaa694c6 (patch) | |
tree | e00c7c43e2d9b603a5a6af576b1685e400410dee /app/finders/merge_requests_finder.rb | |
parent | 879f5329ee916a948223f8f43d77fba4da6cd028 (diff) | |
download | gitlab-ce-48aff82709769b098321c738f3444b9bdaa694c6.tar.gz |
Add latest changes from gitlab-org/gitlab@13-5-stable-eev13.5.0-rc42
Diffstat (limited to 'app/finders/merge_requests_finder.rb')
-rw-r--r-- | app/finders/merge_requests_finder.rb | 63 |
1 files changed, 61 insertions, 2 deletions
diff --git a/app/finders/merge_requests_finder.rb b/app/finders/merge_requests_finder.rb index 37da29b32ff..c998de75ab2 100644 --- a/app/finders/merge_requests_finder.rb +++ b/app/finders/merge_requests_finder.rb @@ -33,7 +33,21 @@ class MergeRequestsFinder < IssuableFinder include MergedAtFilter def self.scalar_params - @scalar_params ||= super + [:wip, :draft, :target_branch, :merged_after, :merged_before] + @scalar_params ||= super + [ + :approved_by_ids, + :deployed_after, + :deployed_before, + :draft, + :environment, + :merged_after, + :merged_before, + :target_branch, + :wip + ] + end + + def self.array_params + @array_params ||= super.merge(approved_by_usernames: []) end def klass @@ -42,11 +56,13 @@ class MergeRequestsFinder < IssuableFinder def filter_items(_items) items = by_commit(super) - items = by_deployment(items) items = by_source_branch(items) items = by_draft(items) items = by_target_branch(items) items = by_merged_at(items) + items = by_approvals(items) + items = by_deployments(items) + by_source_project_id(items) end @@ -80,17 +96,21 @@ class MergeRequestsFinder < IssuableFinder items.where(target_branch: target_branch) end + # rubocop: enable CodeReuse/ActiveRecord def source_project_id @source_project_id ||= params[:source_project_id].presence end + # rubocop: disable CodeReuse/ActiveRecord def by_source_project_id(items) return items unless source_project_id items.where(source_project_id: source_project_id) end + # rubocop: enable CodeReuse/ActiveRecord + # rubocop: disable CodeReuse/ActiveRecord def by_draft(items) draft_param = params[:draft] || params[:wip] @@ -102,6 +122,7 @@ class MergeRequestsFinder < IssuableFinder items end end + # rubocop: enable CodeReuse/ActiveRecord # WIP is deprecated in favor of Draft. Currently both options are supported def wip_match(table) @@ -121,16 +142,54 @@ class MergeRequestsFinder < IssuableFinder .or(table[:title].matches('(Draft)%')) end + # rubocop: disable CodeReuse/ActiveRecord def by_deployment(items) return items unless deployment_id items.includes(:deployment_merge_requests) .where(deployment_merge_requests: { deployment_id: deployment_id }) end + # rubocop: enable CodeReuse/ActiveRecord def deployment_id @deployment_id ||= params[:deployment_id].presence end + + # Filter by merge requests that had been approved by specific users + # rubocop: disable CodeReuse/Finder + def by_approvals(items) + MergeRequests::ByApprovalsFinder + .new(params[:approved_by_usernames], params[:approved_by_ids]) + .execute(items) + end + # rubocop: enable CodeReuse/Finder + + def by_deployments(items) + # Until this feature flag is enabled permanently, we retain the old + # filtering behaviour/code. + return by_deployment(items) unless Feature.enabled?(:deployment_filters) + + env = params[:environment] + before = params[:deployed_before] + after = params[:deployed_after] + id = params[:deployment_id] + + return items if !env && !before && !after && !id + + # Each filter depends on the same JOIN+WHERE. To prevent this JOIN+WHERE + # from being duplicated for every filter, we only produce it once. The + # filter methods in turn expect the JOIN+WHERE to already be present. + # + # This approach ensures that query performance doesn't degrade as the number + # of deployment related filters increases. + deploys = DeploymentMergeRequest.join_deployments_for_merge_requests + deploys = deploys.by_deployment_id(id) if id + deploys = deploys.deployed_to(env) if env + deploys = deploys.deployed_before(before) if before + deploys = deploys.deployed_after(after) if after + + items.where_exists(deploys) + end end MergeRequestsFinder.prepend_if_ee('EE::MergeRequestsFinder') |