diff --git a/app/models/issue_query.rb b/app/models/issue_query.rb index 3431750f6..ecd925716 100644 --- a/app/models/issue_query.rb +++ b/app/models/issue_query.rb @@ -589,9 +589,7 @@ class IssueQuery < Query end groups ||= [] - members_of_groups = groups.inject([]) do |user_ids, group| - user_ids + group.user_ids + [group.id] - end.uniq.compact.sort.collect(&:to_s) + members_of_groups = group_and_member_ids(groups) '(' + sql_for_field("assigned_to_id", operator, members_of_groups, Issue.table_name, "assigned_to_id", false) + ')' end @@ -627,13 +625,27 @@ class IssueQuery < Query def sql_for_author_group_field(field, operator, value) groups = value.empty? ? Group.givable : Group.where(:id => value).to_a - author_groups = groups.inject([]) do |user_ids, group| - user_ids + group.user_ids + [group.id] - end.uniq.compact.sort.collect(&:to_s) + author_groups = group_and_member_ids(groups) '(' + sql_for_field("author_id", operator, author_groups, Issue.table_name, "author_id", false) + ')' end + # Returns the ids of the given groups and of their members as strings, + # fetching the members of all the groups with a single query + def group_and_member_ids(groups) + group_ids = groups.map(&:id) + return [] if group_ids.empty? + + user_ids = User.where( + "#{User.table_name}.id IN (SELECT gu.user_id" \ + " FROM #{User.table_name_prefix}groups_users#{User.table_name_suffix} gu" \ + " WHERE gu.group_id IN (?))", + group_ids + ).pluck(:id) + (group_ids + user_ids).uniq.compact.sort.collect(&:to_s) + end + private :group_and_member_ids + def sql_for_author_role_field(field, operator, value) role_cond = if value.any?