diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-01-18 22:00:14 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-01-18 22:00:14 +0300 |
commit | 05f0ebba3a2c8ddf39e436f412dc2ab5bf1353b2 (patch) | |
tree | 11d0f2a6ec31c7793c184106cedc2ded3d9a2cc5 /app/finders/issuables/label_filter.rb | |
parent | ec73467c23693d0db63a797d10194da9e72a74af (diff) |
Add latest changes from gitlab-org/gitlab@15-8-stable-eev15.8.0-rc42
Diffstat (limited to 'app/finders/issuables/label_filter.rb')
-rw-r--r-- | app/finders/issuables/label_filter.rb | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/app/finders/issuables/label_filter.rb b/app/finders/issuables/label_filter.rb index 4e9c964e51c..81b86a1de32 100644 --- a/app/finders/issuables/label_filter.rb +++ b/app/finders/issuables/label_filter.rb @@ -14,6 +14,7 @@ module Issuables def filter(issuables) filtered = by_label(issuables) + filtered = by_label_union(filtered) by_negated_label(filtered) end @@ -27,18 +28,29 @@ module Issuables def by_label(issuables) return issuables unless label_names_from_params.present? - target_model = issuables.base_class - if filter_by_no_label? - issuables.where(label_link_query(target_model).arel.exists.not) + issuables.where(label_link_query(issuables).arel.exists.not) elsif filter_by_any_label? - issuables.where(label_link_query(target_model).arel.exists) + issuables.where(label_link_query(issuables).arel.exists) else issuables_with_selected_labels(issuables, label_names_from_params) end end # rubocop: enable CodeReuse/ActiveRecord + # rubocop: disable CodeReuse/ActiveRecord + def by_label_union(issuables) + return issuables unless or_filters_enabled? && label_names_from_or_params.present? + + if root_namespace + all_label_ids = find_label_ids(label_names_from_or_params).flatten + issuables.where(label_link_query(issuables, label_ids: all_label_ids).arel.exists) + else + issuables.where(label_link_query(issuables, label_names: label_names_from_or_params).arel.exists) + end + end + # rubocop: enable CodeReuse/ActiveRecord + def by_negated_label(issuables) return issuables unless label_names_from_not_params.present? @@ -55,19 +67,17 @@ module Issuables # rubocop: disable CodeReuse/ActiveRecord def issuables_with_selected_labels(issuables, label_names) - target_model = issuables.base_class - if root_namespace all_label_ids = find_label_ids(label_names) # Found less labels in the DB than we were searching for. Return nothing. return issuables.none if all_label_ids.size != label_names.size all_label_ids.each do |label_ids| - issuables = issuables.where(label_link_query(target_model, label_ids: label_ids).arel.exists) + issuables = issuables.where(label_link_query(issuables, label_ids: label_ids).arel.exists) end else label_names.each do |label_name| - issuables = issuables.where(label_link_query(target_model, label_names: label_name).arel.exists) + issuables = issuables.where(label_link_query(issuables, label_names: label_name).arel.exists) end end @@ -77,16 +87,14 @@ module Issuables # rubocop: disable CodeReuse/ActiveRecord def issuables_without_selected_labels(issuables, label_names) - target_model = issuables.base_class - if root_namespace label_ids = find_label_ids(label_names).flatten(1) return issuables if label_ids.empty? - issuables.where(label_link_query(target_model, label_ids: label_ids).arel.exists.not) + issuables.where(label_link_query(issuables, label_ids: label_ids).arel.exists.not) else - issuables.where(label_link_query(target_model, label_names: label_names).arel.exists.not) + issuables.where(label_link_query(issuables, label_names: label_names).arel.exists.not) end end # rubocop: enable CodeReuse/ActiveRecord @@ -134,7 +142,9 @@ module Issuables # rubocop: enable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord - def label_link_query(target_model, label_ids: nil, label_names: nil) + def label_link_query(issuables, label_ids: nil, label_names: nil) + target_model = issuables.base_class + relation = LabelLink.by_target_for_exists_query(target_model.name, target_model.arel_table['id'], label_ids) relation = relation.joins(:label).where(labels: { name: label_names }) if label_names @@ -150,6 +160,14 @@ module Issuables end end + def label_names_from_or_params + return if or_params.blank? || or_params[:label_name].blank? + + strong_memoize(:label_names_from_or_params) do + split_label_names(or_params[:label_name]) + end + end + def label_names_from_not_params return if not_params.blank? || not_params[:label_name].blank? |