Project

General

Profile

Feature #44382 ยป improve-group-filters-performance.patch

Go MAEDA, 2026-08-27 09:41

View differences:

app/models/issue_query.rb
589 589
    end
590 590
    groups ||= []
591 591

  
592
    members_of_groups = groups.inject([]) do |user_ids, group|
593
      user_ids + group.user_ids + [group.id]
594
    end.uniq.compact.sort.collect(&:to_s)
592
    members_of_groups = group_and_member_ids(groups)
595 593

  
596 594
    '(' + sql_for_field("assigned_to_id", operator, members_of_groups, Issue.table_name, "assigned_to_id", false) + ')'
597 595
  end
......
627 625
  def sql_for_author_group_field(field, operator, value)
628 626
    groups = value.empty? ? Group.givable : Group.where(:id => value).to_a
629 627

  
630
    author_groups = groups.inject([]) do |user_ids, group|
631
      user_ids + group.user_ids + [group.id]
632
    end.uniq.compact.sort.collect(&:to_s)
628
    author_groups = group_and_member_ids(groups)
633 629

  
634 630
    '(' + sql_for_field("author_id", operator, author_groups, Issue.table_name, "author_id", false) + ')'
635 631
  end
636 632

  
633
  # Returns the ids of the given groups and of their members as strings,
634
  # fetching the members of all the groups with a single query
635
  def group_and_member_ids(groups)
636
    group_ids = groups.map(&:id)
637
    return [] if group_ids.empty?
638

  
639
    user_ids = User.where(
640
      "#{User.table_name}.id IN (SELECT gu.user_id" \
641
        " FROM #{User.table_name_prefix}groups_users#{User.table_name_suffix} gu" \
642
        " WHERE gu.group_id IN (?))",
643
      group_ids
644
    ).pluck(:id)
645
    (group_ids + user_ids).uniq.compact.sort.collect(&:to_s)
646
  end
647
  private :group_and_member_ids
648

  
637 649
  def sql_for_author_role_field(field, operator, value)
638 650
    role_cond =
639 651
      if value.any?
    (1-1/1)