Speed up external user statistics
This commit is contained in:
@ -14,9 +14,53 @@ class ExternalUsersController < ApplicationController
|
|||||||
authorize!
|
authorize!
|
||||||
end
|
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
|
def statistics
|
||||||
@user = ExternalUser.find(params[:id])
|
@user = ExternalUser.find(params[:id])
|
||||||
authorize!
|
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
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -10,9 +10,9 @@ h1 = t('.title')
|
|||||||
th.header = t(title)
|
th.header = t(title)
|
||||||
tbody
|
tbody
|
||||||
- exercises.each do |exercise|
|
- 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
|
tr
|
||||||
td = link_to exercise, controller: "exercises", action: "statistics", external_user_id: @user.id, id: exercise.id
|
td = link_to exercise, controller: "exercises", action: "statistics", external_user_id: @user.id, id: exercise.id
|
||||||
td = submissions.maximum(:score) or 0
|
td = stats["maximum_score"] or 0
|
||||||
td = submissions.count
|
td = stats["runs"] or 0
|
||||||
td = exercise.average_working_time_for_only(@user.id) or 0
|
td = stats["working_time"] or 0
|
||||||
|
@ -269,7 +269,7 @@ de:
|
|||||||
title: Statistiken für Externe Benutzer
|
title: Statistiken für Externe Benutzer
|
||||||
exercise: Übung
|
exercise: Übung
|
||||||
score: Bewertung
|
score: Bewertung
|
||||||
runs: Versuche
|
runs: Abgaben
|
||||||
worktime: Arbeitszeit
|
worktime: Arbeitszeit
|
||||||
files:
|
files:
|
||||||
roles:
|
roles:
|
||||||
|
@ -269,7 +269,7 @@ en:
|
|||||||
title: External User Statistics
|
title: External User Statistics
|
||||||
exercise: Exercise
|
exercise: Exercise
|
||||||
score: Score
|
score: Score
|
||||||
runs: Runs
|
runs: Submissions
|
||||||
worktime: Working Time
|
worktime: Working Time
|
||||||
files:
|
files:
|
||||||
roles:
|
roles:
|
||||||
|
Reference in New Issue
Block a user