Speed up external user statistics

This commit is contained in:
Maximilian Grundke
2016-01-28 14:46:25 +01:00
parent 2a1862f39a
commit 4ee474a7d2
4 changed files with 50 additions and 6 deletions

View File

@ -14,9 +14,53 @@ class ExternalUsersController < ApplicationController
authorize!
end
def working_time_query
"""
SELECT user_id,
exercise_id,
max(score) as maximum_score,
count(id) as runs,
sum(working_time_new) AS working_time
FROM
(SELECT user_id,
exercise_id,
score,
id,
CASE
WHEN working_time >= '0:30:00' THEN '0'
ELSE working_time
END AS working_time_new
FROM
(SELECT user_id,
exercise_id,
max(score) AS score,
id,
(created_at - lag(created_at) over (PARTITION BY user_id, exercise_id
ORDER BY created_at)) AS working_time
FROM submissions
WHERE user_id = #{@user.id}
AND user_type = 'ExternalUser'
GROUP BY exercise_id,
user_id,
id) AS foo) AS bar
GROUP BY user_id,
exercise_id;
"""
end
def statistics
@user = ExternalUser.find(params[:id])
authorize!
statistics = {}
ActiveRecord::Base.connection.execute(working_time_query).each do |tuple|
statistics[tuple["exercise_id"].to_i] = tuple
end
render locals: {
statistics: statistics
}
end
end

View File

@ -10,9 +10,9 @@ h1 = t('.title')
th.header = t(title)
tbody
- exercises.each do |exercise|
- submissions = @user.submissions.where(:exercise_id => exercise.id, :cause => ['submit', 'run'])
- if statistics[exercise.id] then stats = statistics[exercise.id] else stats = {"working_time" => 0, "runs" => 0, "score" => 0}
tr
td = link_to exercise, controller: "exercises", action: "statistics", external_user_id: @user.id, id: exercise.id
td = submissions.maximum(:score) or 0
td = submissions.count
td = exercise.average_working_time_for_only(@user.id) or 0
td = stats["maximum_score"] or 0
td = stats["runs"] or 0
td = stats["working_time"] or 0

View File

@ -269,7 +269,7 @@ de:
title: Statistiken für Externe Benutzer
exercise: Übung
score: Bewertung
runs: Versuche
runs: Abgaben
worktime: Arbeitszeit
files:
roles:

View File

@ -269,7 +269,7 @@ en:
title: External User Statistics
exercise: Exercise
score: Score
runs: Runs
runs: Submissions
worktime: Working Time
files:
roles: