use multi-column plucks for preload_conversation_context_codes

faster than using hashes

Change-Id: I1f6006a650ae69d1f83293548d2571562212351f
Reviewed-on: https://gerrit.instructure.com/87883
Tested-by: Jenkins
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
Product-Review: James Williams  <jamesw@instructure.com>
QA-Review: James Williams  <jamesw@instructure.com>
This commit is contained in:
James Williams 2016-08-16 08:11:49 -06:00
parent a18227c2cb
commit 26263b2d82
1 changed files with 19 additions and 25 deletions

View File

@ -2142,15 +2142,12 @@ class User < ActiveRecord::Base
end
end
# don't instantiate a buttload of objects if we can help it
def self.pluck_global_id_rows(relation)
rows = ActiveRecord::Base.connection.select_all(relation.to_sql)
rows.each do |row|
row.each do |k, id|
row[k] = Shard.relative_id_for(id, Shard.current, Shard.birth)
def self.convert_global_id_rows(rows)
rows.map do |row|
row.map do |id|
Shard.relative_id_for(id, Shard.current, Shard.birth)
end
end
rows
end
def self.preload_conversation_context_codes(users)
@ -2166,37 +2163,34 @@ class User < ActiveRecord::Base
concluded_contexts = {}
Shard.with_each_shard(shards.to_a) do
course_rows = pluck_global_id_rows(
course_rows = convert_global_id_rows(
Enrollment.joins(:course).
where(User.enrollment_conditions(:active)).
where(user_id: users).
select([:user_id, :course_id]).
uniq)
course_rows.each do |r|
active_contexts[r['user_id']] ||= []
active_contexts[r['user_id']] << "course_#{r['course_id']}"
distinct.pluck(:user_id, :course_id))
course_rows.each do |user_id, course_id|
active_contexts[user_id] ||= []
active_contexts[user_id] << "course_#{course_id}"
end
cc_rows = pluck_global_id_rows(
cc_rows = convert_global_id_rows(
Enrollment.joins(:course).
where(User.enrollment_conditions(:completed)).
where(user_id: users).
select([:user_id, :course_id]).
uniq)
cc_rows.each do |r|
concluded_contexts[r['user_id']] ||= []
concluded_contexts[r['user_id']] << "course_#{r['course_id']}"
distinct.pluck(:user_id, :course_id))
cc_rows.each do |user_id, course_id|
concluded_contexts[user_id] ||= []
concluded_contexts[user_id] << "course_#{course_id}"
end
group_rows = pluck_global_id_rows(
group_rows = convert_global_id_rows(
GroupMembership.joins(:group).
merge(User.instance_exec(&User.reflections[CANVAS_RAILS4_0 ? :current_group_memberships : 'current_group_memberships'].scope).only(:where)).
where(user_id: users).
select([:user_id, :group_id]).
uniq)
group_rows.each do |r|
active_contexts[r['user_id']] ||= []
active_contexts[r['user_id']] << "group_#{r['group_id']}"
distinct.pluck(:user_id, :group_id))
group_rows.each do |user_id, group_id|
active_contexts[user_id] ||= []
active_contexts[user_id] << "group_#{group_id}"
end
end
Shard.birth.activate do