Cache working time query results
This commit is contained in:
@ -5,6 +5,9 @@ namespace :detect_exercise_anomalies do
|
|||||||
MIN_TIME_FACTOR = 0.1
|
MIN_TIME_FACTOR = 0.1
|
||||||
MAX_TIME_FACTOR = 2
|
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|
|
task :with_at_least, [:number_of_exercises, :number_of_solutions] => :environment do |task, args|
|
||||||
number_of_exercises = args[:number_of_exercises]
|
number_of_exercises = args[:number_of_exercises]
|
||||||
number_of_solutions = args[:number_of_solutions]
|
number_of_solutions = args[:number_of_solutions]
|
||||||
@ -48,9 +51,7 @@ namespace :detect_exercise_anomalies do
|
|||||||
working_times = {}
|
working_times = {}
|
||||||
collection.exercises.each do |exercise|
|
collection.exercises.each do |exercise|
|
||||||
puts "\t\t> #{exercise.title}"
|
puts "\t\t> #{exercise.title}"
|
||||||
avgwt = exercise.average_working_time.split(':')
|
working_times[exercise.id] = get_working_time(exercise)
|
||||||
seconds = avgwt[0].to_i * 60 * 60 + avgwt[1].to_i * 60 + avgwt[2].to_f
|
|
||||||
working_times[exercise.id] = seconds
|
|
||||||
end
|
end
|
||||||
average = working_times.values.reduce(:+) / working_times.size
|
average = working_times.values.reduce(:+) / working_times.size
|
||||||
working_times.select do |exercise_id, working_time|
|
working_times.select do |exercise_id, working_time|
|
||||||
@ -58,6 +59,15 @@ namespace :detect_exercise_anomalies do
|
|||||||
end
|
end
|
||||||
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)
|
def notify_collection_author(collection, anomalies)
|
||||||
puts "\t\tSending E-Mail to author (#{collection.user.displayname} <#{collection.user.email}>)..."
|
puts "\t\tSending E-Mail to author (#{collection.user.displayname} <#{collection.user.email}>)..."
|
||||||
UserMailer.exercise_anomaly_detected(collection, anomalies).deliver_now
|
UserMailer.exercise_anomaly_detected(collection, anomalies).deliver_now
|
||||||
|
Reference in New Issue
Block a user