diff options
author | Sean McGivern <sean@gitlab.com> | 2019-01-11 11:28:52 +0000 |
---|---|---|
committer | Sean McGivern <sean@gitlab.com> | 2019-01-11 11:28:52 +0000 |
commit | 7a10ef6e751e643b482a171a305c4ce485b1b039 (patch) | |
tree | a45a0a8d84e0efa1a3278918c287ae836cefb296 /app/models/milestone.rb | |
parent | b98f6e53f6fa97ef1166fb2da95909c79894fd28 (diff) | |
parent | 2490cfeeb2f8426b1a8f4e24bd0297e41a870ca2 (diff) | |
download | gitlab-ce-7a10ef6e751e643b482a171a305c4ce485b1b039.tar.gz |
Merge branch '53431-fix-upcoming-milestone-filter-for-groups' into 'master'
Add group milestones in upcoming filter
Closes #53431
See merge request gitlab-org/gitlab-ce!23098
Diffstat (limited to 'app/models/milestone.rb')
-rw-r--r-- | app/models/milestone.rb | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/app/models/milestone.rb b/app/models/milestone.rb index f55c39d9912..1ebcbcda0d8 100644 --- a/app/models/milestone.rb +++ b/app/models/milestone.rb @@ -38,12 +38,14 @@ class Milestone < ActiveRecord::Base scope :closed, -> { with_state(:closed) } scope :for_projects, -> { where(group: nil).includes(:project) } - scope :for_projects_and_groups, -> (project_ids, group_ids) do - conditions = [] - conditions << arel_table[:project_id].in(project_ids) if project_ids&.compact&.any? - conditions << arel_table[:group_id].in(group_ids) if group_ids&.compact&.any? + scope :for_projects_and_groups, -> (projects, groups) do + projects = projects.compact if projects.is_a? Array + projects = [] if projects.nil? - where(conditions.reduce(:or)) + groups = groups.compact if groups.is_a? Array + groups = [] if groups.nil? + + where(project: projects).or(where(group: groups)) end scope :order_by_name_asc, -> { order(Arel::Nodes::Ascending.new(arel_table[:title].lower)) } @@ -133,18 +135,29 @@ class Milestone < ActiveRecord::Base @link_reference_pattern ||= super("milestones", /(?<milestone>\d+)/) end - def self.upcoming_ids_by_projects(projects) - rel = unscoped.of_projects(projects).active.where('due_date > ?', Time.now) + def self.upcoming_ids(projects, groups) + rel = unscoped + .for_projects_and_groups(projects, groups) + .active.where('milestones.due_date > NOW()') if Gitlab::Database.postgresql? - rel.order(:project_id, :due_date).select('DISTINCT ON (project_id) id') + rel.order(:project_id, :group_id, :due_date).select('DISTINCT ON (project_id, group_id) id') else + # We need to use MySQL's NULL-safe comparison operator `<=>` here + # because one of `project_id` or `group_id` is always NULL + join_clause = <<~HEREDOC + LEFT OUTER JOIN milestones earlier_milestones + ON milestones.project_id <=> earlier_milestones.project_id + AND milestones.group_id <=> earlier_milestones.group_id + AND milestones.due_date > earlier_milestones.due_date + AND earlier_milestones.due_date > NOW() + AND earlier_milestones.state = 'active' + HEREDOC + rel - .group(:project_id, :due_date, :id) - .having('due_date = MIN(due_date)') - .pluck(:id, :project_id, :due_date) - .uniq(&:second) - .map(&:first) + .joins(join_clause) + .where('earlier_milestones.id IS NULL') + .select(:id) end end |