Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-02-22 18:10:48 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-02-22 18:10:48 +0300
commit232e7582b0e81e95bd721ad8094fcb50ecbc8a04 (patch)
treea68e00760d0a3446c2030addd679b33acfa39d2d /app/finders
parent980d813e90c70f09861e39b9269e73b2c9a4e936 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/finders')
-rw-r--r--app/finders/issuable_finder.rb52
-rw-r--r--app/finders/issuable_finder/params.rb27
-rw-r--r--app/finders/issuables/author_filter.rb41
-rw-r--r--app/finders/issuables/base_filter.rb36
-rw-r--r--app/finders/merge_request_target_project_finder.rb11
5 files changed, 109 insertions, 58 deletions
diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb
index fc03d5cd90c..2409dc9d77d 100644
--- a/app/finders/issuable_finder.rb
+++ b/app/finders/issuable_finder.rb
@@ -47,6 +47,7 @@ class IssuableFinder
NEGATABLE_PARAMS_HELPER_KEYS = %i[project_id scope status include_subgroups].freeze
attr_accessor :current_user, :params
+ attr_reader :original_params
attr_writer :parent
delegate(*%i[assignee milestones], to: :params)
@@ -87,7 +88,7 @@ class IssuableFinder
end
def valid_params
- @valid_params ||= scalar_params + [array_params.merge(not: {})]
+ @valid_params ||= scalar_params + [array_params.merge(or: {}, not: {})]
end
end
@@ -101,6 +102,7 @@ class IssuableFinder
def initialize(current_user, params = {})
@current_user = current_user
+ @original_params = params
@params = params_class.new(params, current_user, klass)
end
@@ -142,7 +144,7 @@ class IssuableFinder
end
def should_filter_negated_args?
- return false unless Feature.enabled?(:not_issuable_queries, params.group || params.project, default_enabled: true)
+ return false unless not_filters_enabled?
# API endpoints send in `nil` values so we test if there are any non-nil
not_params.present? && not_params.values.any?
@@ -150,7 +152,6 @@ class IssuableFinder
# Negates all params found in `negatable_params`
def filter_negated_items(items)
- items = by_negated_author(items)
items = by_negated_assignee(items)
items = by_negated_label(items)
items = by_negated_milestone(items)
@@ -372,31 +373,14 @@ class IssuableFinder
end
# rubocop: enable CodeReuse/ActiveRecord
- # rubocop: disable CodeReuse/ActiveRecord
def by_author(items)
- if params.author
- items.where(author_id: params.author.id)
- elsif params.no_author?
- items.where(author_id: nil)
- elsif params.author_id? || params.author_username? # author not found
- items.none
- else
- items
- end
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- # rubocop: disable CodeReuse/ActiveRecord
- def by_negated_author(items)
- if not_params.author
- items.where.not(author_id: not_params.author.id)
- elsif not_params.author_id? || not_params.author_username? # author not found
- items.none
- else
- items
- end
+ Issuables::AuthorFilter.new(
+ items,
+ params: original_params,
+ or_filters_enabled: or_filters_enabled?,
+ not_filters_enabled: not_filters_enabled?
+ ).filter
end
- # rubocop: enable CodeReuse/ActiveRecord
def by_assignee(items)
if params.filter_by_no_assignee?
@@ -514,4 +498,20 @@ class IssuableFinder
def by_non_archived(items)
params[:non_archived].present? ? items.non_archived : items
end
+
+ def or_filters_enabled?
+ strong_memoize(:or_filters_enabled) do
+ Feature.enabled?(:or_issuable_queries, feature_flag_scope, default_enabled: :yaml)
+ end
+ end
+
+ def not_filters_enabled?
+ strong_memoize(:not_filters_enabled) do
+ Feature.enabled?(:not_issuable_queries, feature_flag_scope, default_enabled: :yaml)
+ end
+ end
+
+ def feature_flag_scope
+ params.group || params.project
+ end
end
diff --git a/app/finders/issuable_finder/params.rb b/app/finders/issuable_finder/params.rb
index 803b30e86ac..a62210ceac5 100644
--- a/app/finders/issuable_finder/params.rb
+++ b/app/finders/issuable_finder/params.rb
@@ -27,19 +27,6 @@ class IssuableFinder
params.present?
end
- def author_id?
- params[:author_id].present? && params[:author_id] != NONE
- end
-
- def author_username?
- params[:author_username].present? && params[:author_username] != NONE
- end
-
- def no_author?
- # author_id takes precedence over author_username
- params[:author_id] == NONE || params[:author_username] == NONE
- end
-
def filter_by_no_assignee?
params[:assignee_id].to_s.downcase == FILTER_NONE
end
@@ -170,20 +157,6 @@ class IssuableFinder
end
# rubocop: disable CodeReuse/ActiveRecord
- def author
- strong_memoize(:author) do
- if author_id?
- User.find_by(id: params[:author_id])
- elsif author_username?
- User.find_by_username(params[:author_username])
- else
- nil
- end
- end
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- # rubocop: disable CodeReuse/ActiveRecord
def assignees
strong_memoize(:assignees) do
if assignee_id?
diff --git a/app/finders/issuables/author_filter.rb b/app/finders/issuables/author_filter.rb
new file mode 100644
index 00000000000..ce68dbafb95
--- /dev/null
+++ b/app/finders/issuables/author_filter.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Issuables
+ class AuthorFilter < BaseFilter
+ def filter
+ filtered = by_author(issuables)
+ filtered = by_author_union(filtered)
+ by_negated_author(filtered)
+ end
+
+ private
+
+ def by_author(issuables)
+ if params[:author_id].present?
+ issuables.authored(params[:author_id])
+ elsif params[:author_username].present?
+ issuables.authored(User.by_username(params[:author_username]))
+ else
+ issuables
+ end
+ end
+
+ def by_author_union(issuables)
+ return issuables unless or_filters_enabled? && or_params&.fetch(:author_username).present?
+
+ issuables.authored(User.by_username(or_params[:author_username]))
+ end
+
+ def by_negated_author(issuables)
+ return issuables unless not_filters_enabled? && not_params.present?
+
+ if not_params[:author_id].present?
+ issuables.not_authored(not_params[:author_id])
+ elsif not_params[:author_username].present?
+ issuables.not_authored(User.by_username(not_params[:author_username]))
+ else
+ issuables
+ end
+ end
+ end
+end
diff --git a/app/finders/issuables/base_filter.rb b/app/finders/issuables/base_filter.rb
new file mode 100644
index 00000000000..641ae2568cc
--- /dev/null
+++ b/app/finders/issuables/base_filter.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module Issuables
+ class BaseFilter
+ attr_reader :issuables, :params
+
+ def initialize(issuables, params:, or_filters_enabled: false, not_filters_enabled: false)
+ @issuables = issuables
+ @params = params
+ @or_filters_enabled = or_filters_enabled
+ @not_filters_enabled = not_filters_enabled
+ end
+
+ def filter
+ raise NotImplementedError
+ end
+
+ private
+
+ def or_params
+ params[:or]
+ end
+
+ def not_params
+ params[:not]
+ end
+
+ def or_filters_enabled?
+ @or_filters_enabled
+ end
+
+ def not_filters_enabled?
+ @not_filters_enabled
+ end
+ end
+end
diff --git a/app/finders/merge_request_target_project_finder.rb b/app/finders/merge_request_target_project_finder.rb
index 85a73e0c6ff..dc9b28ab0a0 100644
--- a/app/finders/merge_request_target_project_finder.rb
+++ b/app/finders/merge_request_target_project_finder.rb
@@ -5,29 +5,30 @@ class MergeRequestTargetProjectFinder
attr_reader :current_user, :source_project
- def initialize(current_user: nil, source_project:)
+ def initialize(current_user: nil, source_project:, project_feature: :merge_requests)
@current_user = current_user
@source_project = source_project
+ @project_feature = project_feature
end
- # rubocop: disable CodeReuse/ActiveRecord
def execute(include_routes: false)
if source_project.fork_network
include_routes ? projects.inc_routes : projects
else
- Project.where(id: source_project)
+ Project.id_in(source_project.id)
end
end
- # rubocop: enable CodeReuse/ActiveRecord
private
+ attr_reader :project_feature
+
def projects
source_project
.fork_network
.projects
.public_or_visible_to_user(current_user)
.non_archived
- .with_feature_available_for_user(:merge_requests, current_user)
+ .with_feature_available_for_user(project_feature, current_user)
end
end