Refactor average worktime and add it to exercise statistics per user

This commit is contained in:
Maximilian Grundke
2015-11-05 11:17:45 +01:00
parent d4031c363f
commit f3acc426ac
2 changed files with 27 additions and 15 deletions

View File

@ -42,26 +42,39 @@ class Exercise < ActiveRecord::Base
return user_count == 0 ? 0 : submissions.count() / user_count.to_f()
end
def user_working_time_query
"""
SELECT user_id,
sum(working_time_new) AS working_time
FROM
(SELECT user_id,
CASE WHEN working_time >= '0:30:00' THEN '0' ELSE working_time END AS working_time_new
FROM
(SELECT user_id,
id,
(created_at - lag(created_at) over (PARTITION BY user_id
ORDER BY id)) AS working_time
FROM submissions
WHERE exercise_id=#{id}) AS foo) AS bar
GROUP BY user_id
"""
end
def average_working_time
self.class.connection.execute("""
SELECT avg(working_time) as average_time
FROM
(SELECT user_id,
sum(working_time_new) AS working_time
FROM
(SELECT user_id,
CASE WHEN working_time >= '0:30:00' THEN '0' ELSE working_time END AS working_time_new
FROM
(SELECT user_id,
id,
(created_at - lag(created_at) over (PARTITION BY user_id
ORDER BY id)) AS working_time
FROM submissions
WHERE exercise_id=#{id}) AS foo) AS bar
GROUP BY user_id) AS baz;
(#{user_working_time_query}) AS baz;
""").first['average_time']
end
def average_working_time_for(user_id)
self.class.connection.execute("""
#{user_working_time_query}
HAVING user_id = #{user_id}
""").first['working_time']
end
def duplicate(attributes = {})
exercise = dup
exercise.attributes = attributes

View File

@ -23,5 +23,4 @@ h1 = @exercise
td = "#{user.name} (#{user.email})"
td = submissions.maximum('score')
td = submissions.count('id')
- seconds = submissions.maximum('created_at') - submissions.minimum('created_at')
td = "#{distance_of_time_in_words(seconds)} (#{seconds})"
td = @exercise.average_working_time_for(user.id) or 0