Skip to content

Commit 9822638

Browse files
committed
Optimize contributor membership retrieval
After the recent changes page rendering became significnatly slower, because we executed many different SQL queries just to determine the contributor status of a single participant. This commit optimizes this by retrieving all required contributor memberships in a single query.
1 parent 7441956 commit 9822638

2 files changed

Lines changed: 19 additions & 11 deletions

File tree

app/models/alias.rb

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,37 +38,45 @@ def contributor
3838
}.freeze
3939

4040
def contributor?
41-
person&.contributor_memberships&.exists?
41+
contributor_membership_types.any?
4242
end
4343

4444
def contributor_type
45-
return nil unless person
46-
types = person.contributor_memberships.pluck(:contributor_type)
45+
types = contributor_membership_types
46+
return nil if types.empty?
47+
4748
types.min_by { |t| CONTRIBUTOR_RANK[t] || 99 }
4849
end
4950

5051
def core_team?
51-
person&.contributor_memberships&.core_team&.exists?
52+
contributor_membership_types.include?('core_team')
5253
end
5354

5455
def committer?
55-
person&.contributor_memberships&.committer&.exists?
56+
contributor_membership_types.include?('committer')
5657
end
5758

5859
def past_contributor?
59-
person&.contributor_memberships&.where(contributor_type: %w[past_major_contributor past_significant_contributor])&.exists?
60+
types = contributor_membership_types
61+
types.include?('past_major_contributor') || types.include?('past_significant_contributor')
6062
end
6163

6264
def current_contributor?
6365
contributor? && !past_contributor?
6466
end
6567

6668
def major_contributor?
67-
person&.contributor_memberships&.major_contributor&.exists?
69+
contributor_membership_types.include?('major_contributor')
6870
end
6971

7072
def significant_contributor?
71-
person&.contributor_memberships&.significant_contributor&.exists?
73+
contributor_membership_types.include?('significant_contributor')
74+
end
75+
76+
def contributor_membership_types
77+
return [] unless person
78+
79+
@contributor_membership_types ||= person.contributor_memberships.load.map(&:contributor_type)
7280
end
7381

7482
def contributor_badge

app/models/topic.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def participant_aliases(limit: 10)
1919
.index_by(&:sender_id)
2020

2121
sender_ids = sender_counts.keys
22-
senders_by_id = Alias.where(id: sender_ids).index_by(&:id)
22+
senders_by_id = Alias.includes(person: :contributor_memberships).where(id: sender_ids).index_by(&:id)
2323

2424
first_sender = messages.order(:created_at).first.sender
2525
last_sender = messages.order(:created_at).last.sender
@@ -76,10 +76,10 @@ def contributor_participants
7676
.group(:sender_id)
7777
.select('sender_id, COUNT(*) AS message_count, MAX(messages.created_at) AS last_at')
7878

79-
alias_map = Alias.includes(:person).where(id: stats.map(&:sender_id)).index_by(&:id)
79+
alias_map = Alias.includes(person: :contributor_memberships).where(id: stats.map(&:sender_id)).index_by(&:id)
8080

8181
stats.map do |row|
82-
alias_record = alias_map[row.sender_id]
82+
alias_record = alias_map[row.sender_id]
8383
next unless alias_record
8484

8585
{

0 commit comments

Comments
 (0)