diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-02-22 15:10:48 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-02-22 15:10:48 +0000 |
commit | 232e7582b0e81e95bd721ad8094fcb50ecbc8a04 (patch) | |
tree | a68e00760d0a3446c2030addd679b33acfa39d2d /app/finders | |
parent | 980d813e90c70f09861e39b9269e73b2c9a4e936 (diff) | |
download | gitlab-ce-232e7582b0e81e95bd721ad8094fcb50ecbc8a04.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/finders')
-rw-r--r-- | app/finders/issuable_finder.rb | 52 | ||||
-rw-r--r-- | app/finders/issuable_finder/params.rb | 27 | ||||
-rw-r--r-- | app/finders/issuables/author_filter.rb | 41 | ||||
-rw-r--r-- | app/finders/issuables/base_filter.rb | 36 | ||||
-rw-r--r-- | app/finders/merge_request_target_project_finder.rb | 11 |
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 |