From 71a78a2dfa9cb02bac400ee5ef0303b4811df548 Mon Sep 17 00:00:00 2001 From: Maximilian Grundke Date: Tue, 10 Jul 2018 12:43:13 +0200 Subject: [PATCH 1/2] Fix average working time for nil values and empty filtered collections --- lib/tasks/detect_exercise_anomalies.rake | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/tasks/detect_exercise_anomalies.rake b/lib/tasks/detect_exercise_anomalies.rake index 3436b87a..9ea6f706 100644 --- a/lib/tasks/detect_exercise_anomalies.rake +++ b/lib/tasks/detect_exercise_anomalies.rake @@ -61,16 +61,25 @@ namespace :detect_exercise_anomalies do .having('count(exercises_with_submissions.id) > ?', number_of_exercises) end - def find_anomalies(collection) + def collect_working_times(collection) working_times = {} collection.exercises.each do |exercise| puts "\t\t> #{exercise.title}" working_times[exercise.id] = get_average_working_time(exercise) end - average = working_times.values.reduce(:+) / working_times.size - working_times.select do |exercise_id, working_time| - working_time > average * MAX_TIME_FACTOR or working_time < average * MIN_TIME_FACTOR + working_times + end + + def find_anomalies(collection) + working_times = collect_working_times(collection) + values = working_times.values.reject {|value| value.nil?} + if working_times.size > 0 + average = values.reduce(:+) / working_times.size + return working_times.select do |_, working_time| + working_time > average * MAX_TIME_FACTOR or working_time < average * MIN_TIME_FACTOR + end end + {} end def get_average_working_time(exercise) From 36cbbb70538ca6aa34cf8f7f57cb3cb1a5a75f37 Mon Sep 17 00:00:00 2001 From: Maximilian Grundke Date: Tue, 10 Jul 2018 12:52:21 +0200 Subject: [PATCH 2/2] Fix calculation of average --- lib/tasks/detect_exercise_anomalies.rake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/tasks/detect_exercise_anomalies.rake b/lib/tasks/detect_exercise_anomalies.rake index 9ea6f706..384b6066 100644 --- a/lib/tasks/detect_exercise_anomalies.rake +++ b/lib/tasks/detect_exercise_anomalies.rake @@ -73,8 +73,8 @@ namespace :detect_exercise_anomalies do def find_anomalies(collection) working_times = collect_working_times(collection) values = working_times.values.reject {|value| value.nil?} - if working_times.size > 0 - average = values.reduce(:+) / working_times.size + if values.size > 0 + average = values.reduce(:+) / values.size return working_times.select do |_, working_time| working_time > average * MAX_TIME_FACTOR or working_time < average * MIN_TIME_FACTOR end