summaryrefslogtreecommitdiff
path: root/app/finders/issuable_finder.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/finders/issuable_finder.rb')
-rw-r--r--app/finders/issuable_finder.rb63
1 files changed, 24 insertions, 39 deletions
diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb
index 9f3ca385d93..cf706a8f98e 100644
--- a/app/finders/issuable_finder.rb
+++ b/app/finders/issuable_finder.rb
@@ -41,7 +41,6 @@ class IssuableFinder
include FinderMethods
include CreatedAtFilter
include Gitlab::Utils::StrongMemoize
- prepend OptimizedIssuableLabelFilter
requires_cross_project_access unless: -> { params.project? }
@@ -149,7 +148,6 @@ class IssuableFinder
# Negates all params found in `negatable_params`
def filter_negated_items(items)
- items = by_negated_label(items)
items = by_negated_milestone(items)
items = by_negated_release(items)
items = by_negated_my_reaction_emoji(items)
@@ -172,29 +170,19 @@ class IssuableFinder
count_params = params.merge(state: nil, sort: nil, force_cte: true)
finder = self.class.new(current_user, count_params)
+ state_counts = finder
+ .execute
+ .reorder(nil)
+ .group(:state_id)
+ .count
+
counts = Hash.new(0)
- # Searching by label includes a GROUP BY in the query, but ours will be last
- # because it is added last. Searching by multiple labels also includes a row
- # per issuable, so we have to count those in Ruby - which is bad, but still
- # better than performing multiple queries.
- #
- # This does not apply when we are using a CTE for the search, as the labels
- # GROUP BY is inside the subquery in that case, so we set labels_count to 1.
- #
- # Groups and projects have separate feature flags to suggest the use
- # of a CTE. The CTE will not be used if the sort doesn't support it,
- # but will always be used for the counts here as we ignore sorting
- # anyway.
- labels_count = params.label_names.any? ? params.label_names.count : 1
- labels_count = 1 if use_cte_for_search?
-
- finder.execute.reorder(nil).group(:state_id).count.each do |key, value|
- counts[count_key(key)] += value / labels_count
+ state_counts.each do |key, value|
+ counts[count_key(key)] += value
end
counts[:all] = counts.values.sum
-
counts.with_indifferent_access
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -332,6 +320,7 @@ class IssuableFinder
def by_search(items)
return items unless search
return items if items.is_a?(ActiveRecord::NullRelation)
+ return items if Feature.enabled?(:disable_anonymous_search, type: :ops) && current_user.nil?
if use_cte_for_search?
cte = Gitlab::SQL::CTE.new(klass.table_name, items)
@@ -359,7 +348,7 @@ class IssuableFinder
def sort(items)
# Ensure we always have an explicit sort order (instead of inheriting
# multiple orders when combining ActiveRecord::Relation objects).
- params[:sort] ? items.sort_by_attribute(params[:sort], excluded_labels: params.label_names) : items.reorder(id: :desc)
+ params[:sort] ? items.sort_by_attribute(params[:sort], excluded_labels: label_filter.label_names_excluded_from_priority_sort) : items.reorder(id: :desc)
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -383,6 +372,20 @@ class IssuableFinder
end
end
+ def by_label(items)
+ label_filter.filter(items)
+ end
+
+ def label_filter
+ strong_memoize(:label_filter) do
+ Issuables::LabelFilter.new(
+ params: original_params,
+ project: params.project,
+ group: params.group
+ )
+ end
+ end
+
# rubocop: disable CodeReuse/ActiveRecord
def by_milestone(items)
return items unless params.milestones?
@@ -435,24 +438,6 @@ class IssuableFinder
items.without_particular_release(not_params[:release_tag], not_params[:project_id])
end
- def by_label(items)
- return items unless params.labels?
-
- if params.filter_by_no_label?
- items.without_label
- elsif params.filter_by_any_label?
- items.any_label(params[:sort])
- else
- items.with_label(params.label_names, params[:sort])
- end
- end
-
- def by_negated_label(items)
- return items unless not_params.labels?
-
- items.without_particular_labels(not_params.label_names)
- end
-
def by_my_reaction_emoji(items)
return items unless params[:my_reaction_emoji] && current_user