summaryrefslogtreecommitdiff
path: root/app/models/milestone.rb
diff options
context:
space:
mode:
authorSean McGivern <sean@gitlab.com>2019-01-11 11:28:52 +0000
committerSean McGivern <sean@gitlab.com>2019-01-11 11:28:52 +0000
commit7a10ef6e751e643b482a171a305c4ce485b1b039 (patch)
treea45a0a8d84e0efa1a3278918c287ae836cefb296 /app/models/milestone.rb
parentb98f6e53f6fa97ef1166fb2da95909c79894fd28 (diff)
parent2490cfeeb2f8426b1a8f4e24bd0297e41a870ca2 (diff)
downloadgitlab-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.rb39
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