From 08f16447f3553f1e7a9e9a1156b2d5f75173148c Mon Sep 17 00:00:00 2001 From: Maximilian Grundke Date: Sun, 4 Feb 2018 15:41:40 +0100 Subject: [PATCH] Cache working time query results --- lib/tasks/detect_exercise_anomalies.rake | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/tasks/detect_exercise_anomalies.rake b/lib/tasks/detect_exercise_anomalies.rake index f2ca9a8f..f8e5bc2a 100644 --- a/lib/tasks/detect_exercise_anomalies.rake +++ b/lib/tasks/detect_exercise_anomalies.rake @@ -5,6 +5,9 @@ namespace :detect_exercise_anomalies do MIN_TIME_FACTOR = 0.1 MAX_TIME_FACTOR = 2 + # Cache exercise working times, because queries are expensive and values do not change between collections + WORKING_TIME_CACHE = {} + task :with_at_least, [:number_of_exercises, :number_of_solutions] => :environment do |task, args| number_of_exercises = args[:number_of_exercises] number_of_solutions = args[:number_of_solutions] @@ -48,9 +51,7 @@ namespace :detect_exercise_anomalies do working_times = {} collection.exercises.each do |exercise| puts "\t\t> #{exercise.title}" - avgwt = exercise.average_working_time.split(':') - seconds = avgwt[0].to_i * 60 * 60 + avgwt[1].to_i * 60 + avgwt[2].to_f - working_times[exercise.id] = seconds + working_times[exercise.id] = get_working_time(exercise) end average = working_times.values.reduce(:+) / working_times.size working_times.select do |exercise_id, working_time| @@ -58,6 +59,15 @@ namespace :detect_exercise_anomalies do end end + def get_working_time(exercise) + unless WORKING_TIME_CACHE.key?(exercise.id) + avgwt = exercise.average_working_time.split(':') + seconds = avgwt[0].to_i * 60 * 60 + avgwt[1].to_i * 60 + avgwt[2].to_f + WORKING_TIME_CACHE[exercise.id] = seconds + end + WORKING_TIME_CACHE[exercise.id] + end + def notify_collection_author(collection, anomalies) puts "\t\tSending E-Mail to author (#{collection.user.displayname} <#{collection.user.email}>)..." UserMailer.exercise_anomaly_detected(collection, anomalies).deliver_now