From 13005bcd8427e5b410d9bd79de629f093d765fb9 Mon Sep 17 00:00:00 2001 From: Jacob Fugal Date: Fri, 6 Dec 2013 10:39:58 -0700 Subject: [PATCH] optimize due date cacher trivial case Change-Id: I238bd25f5083832abb5656580855ba8a64b1a54b Reviewed-on: https://gerrit.instructure.com/27092 Reviewed-by: Cody Cutrer Tested-by: Jenkins Product-Review: Jacob Fugal QA-Review: Jacob Fugal --- lib/due_date_cacher.rb | 70 +++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/lib/due_date_cacher.rb b/lib/due_date_cacher.rb index 585aade4b69..5de1a7c16db 100644 --- a/lib/due_date_cacher.rb +++ b/lib/due_date_cacher.rb @@ -68,40 +68,48 @@ class DueDateCacher Assignment.transaction do # Create overridden due date submissions create_overridden_submissions + overrides = AssignmentOverride.active.overriding_due_at.where(:assignment_id => @assignments) + if overrides.exists? + # create temporary table + cast = Submission.connection.adapter_name == 'Mysql2' ? 'UNSIGNED INTEGER' : 'BOOL' + Assignment.connection.execute("CREATE TEMPORARY TABLE calculated_due_ats AS (#{submissions.select([ + "submissions.id AS submission_id", + "submissions.user_id", + "submissions.assignment_id", + "assignments.due_at", + "CAST(#{Submission.sanitize(false)} AS #{cast}) AS overridden" + ]).joins(:assignment).where(assignments: { id: @assignments }).to_sql})") - # create temporary table - cast = Submission.connection.adapter_name == 'Mysql2' ? 'UNSIGNED INTEGER' : 'BOOL' - Assignment.connection.execute("CREATE TEMPORARY TABLE calculated_due_ats AS (#{submissions.select([ - "submissions.id AS submission_id", - "submissions.user_id", - "submissions.assignment_id", - "assignments.due_at", - "CAST(#{Submission.sanitize(false)} AS #{cast}) AS overridden" - ]).joins(:assignment).where(assignments: { id: @assignments }).to_sql})") + # create an ActiveRecord class around that temp table for the update_all + scope = Class.new(ActiveRecord::Base) do + self.table_name = :calculated_due_ats + self.primary_key = :submission_id + end - # create an ActiveRecord class around that temp table for the update_all - scope = Class.new(ActiveRecord::Base) do - self.table_name = :calculated_due_ats - self.primary_key = :submission_id + # for each override, narrow to the affected subset of the table, and + # apply + overrides.each do |override| + override_scope(scope, override).update_all( + :due_at => override.due_at, + :overridden => true) + end + + # copy the results back to the submission table + submissions. + joins("INNER JOIN calculated_due_ats ON calculated_due_ats.submission_id=submissions.id"). + where("cached_due_date<>calculated_due_ats.due_at OR (cached_due_date IS NULL)<>(calculated_due_ats.due_at IS NULL)"). + update_all("cached_due_date=calculated_due_ats.due_at") + + # clean up + temporary = "TEMPORARY " if Assignment.connection.adapter_name == 'Mysql2' + Assignment.connection.execute("DROP #{temporary}TABLE calculated_due_ats") + else + # just copy the assignment due dates to the submissions + submissions. + joins("INNER JOIN assignments ON assignments.id=submissions.assignment_id"). + where("cached_due_date<>assignments.due_at OR (cached_due_date IS NULL)<>(assignments.due_at IS NULL)"). + update_all("cached_due_date=assignments.due_at") end - - # for each override, narrow to the affected subset of the table, and - # apply - AssignmentOverride.active.overriding_due_at.where(:assignment_id => @assignments).each do |override| - override_scope(scope, override).update_all( - :due_at => override.due_at, - :overridden => true) - end - - # copy the results back to the submission table - submissions. - joins("INNER JOIN calculated_due_ats ON calculated_due_ats.submission_id=submissions.id"). - where("cached_due_date<>calculated_due_ats.due_at OR (cached_due_date IS NULL)<>(calculated_due_ats.due_at IS NULL)"). - update_all("cached_due_date=calculated_due_ats.due_at") - - # clean up - temporary = "TEMPORARY " if Assignment.connection.adapter_name == 'Mysql2' - Assignment.connection.execute("DROP #{temporary}TABLE calculated_due_ats") end end end