Retrieve user statistics in an execution environment for all exercises at once
This commit is contained in:
@ -55,14 +55,47 @@ class ExecutionEnvironmentsController < ApplicationController
|
|||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def user_query
|
||||||
|
"""
|
||||||
|
SELECT
|
||||||
|
id AS exercise_id,
|
||||||
|
COUNT(DISTINCT user_id) AS users,
|
||||||
|
AVG(score) AS average_score,
|
||||||
|
MAX(score) AS maximum_score,
|
||||||
|
CASE
|
||||||
|
WHEN MAX(score)=0 THEN 0
|
||||||
|
ELSE 100 / MAX(score) * AVG(score)
|
||||||
|
END AS percent_correct,
|
||||||
|
SUM(submission_count) / COUNT(DISTINCT user_id) AS average_submission_count
|
||||||
|
FROM
|
||||||
|
(SELECT e.id,
|
||||||
|
s.user_id,
|
||||||
|
MAX(s.score) AS score,
|
||||||
|
COUNT(s.id) AS submission_count
|
||||||
|
FROM submissions s
|
||||||
|
JOIN exercises e ON e.id = s.exercise_id
|
||||||
|
WHERE e.execution_environment_id = #{@execution_environment.id}
|
||||||
|
GROUP BY e.id,
|
||||||
|
s.user_id) AS inner_query
|
||||||
|
GROUP BY id;
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
def statistics
|
def statistics
|
||||||
working_time_statistics = {}
|
working_time_statistics = {}
|
||||||
|
user_statistics = {}
|
||||||
|
|
||||||
ActiveRecord::Base.connection.execute(working_time_query).each do |tuple|
|
ActiveRecord::Base.connection.execute(working_time_query).each do |tuple|
|
||||||
working_time_statistics[tuple["exercise_id"].to_i] = tuple
|
working_time_statistics[tuple["exercise_id"].to_i] = tuple
|
||||||
end
|
end
|
||||||
|
|
||||||
|
ActiveRecord::Base.connection.execute(user_query).each do |tuple|
|
||||||
|
user_statistics[tuple["exercise_id"].to_i] = tuple
|
||||||
|
end
|
||||||
|
|
||||||
render locals: {
|
render locals: {
|
||||||
working_time_statistics: working_time_statistics
|
working_time_statistics: working_time_statistics,
|
||||||
|
user_statistics: user_statistics
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ class Exercise < ActiveRecord::Base
|
|||||||
|
|
||||||
def average_score
|
def average_score
|
||||||
if submissions.exists?(cause: 'submit')
|
if submissions.exists?(cause: 'submit')
|
||||||
maximum_scores_query = submissions.select('MAX(score) AS maximum_score').where(cause: 'submit').group(:user_id).to_sql.sub('$1', id.to_s)
|
maximum_scores_query = submissions.select('MAX(score) AS maximum_score').group(:user_id).to_sql.sub('$1', id.to_s)
|
||||||
self.class.connection.execute("SELECT AVG(maximum_score) AS average_score FROM (#{maximum_scores_query}) AS maximum_scores").first['average_score'].to_f
|
self.class.connection.execute("SELECT AVG(maximum_score) AS average_score FROM (#{maximum_scores_query}) AS maximum_scores").first['average_score'].to_f
|
||||||
else 0 end
|
else 0 end
|
||||||
end
|
end
|
||||||
|
@ -8,14 +8,15 @@ h1 = @execution_environment
|
|||||||
th.header = t(title)
|
th.header = t(title)
|
||||||
tbody
|
tbody
|
||||||
- @execution_environment.exercises.each do |exercise|
|
- @execution_environment.exercises.each do |exercise|
|
||||||
- average_score = exercise.average_score
|
- us = user_statistics[exercise.id]
|
||||||
|
- if not us then us = {"users" => 0, "average_score" => 0.0, "maximum_score" => 0, "percent_correct" => nil, "average_submission_count" => 0}
|
||||||
- wts = working_time_statistics[exercise.id]
|
- wts = working_time_statistics[exercise.id]
|
||||||
- if wts then average_time = wts["average_time"] else 0
|
- if wts then average_time = wts["average_time"] else 0
|
||||||
tr
|
tr
|
||||||
td = link_to exercise.title, controller: "exercises", action: "statistics", id: exercise.id
|
td = link_to exercise.title, controller: "exercises", action: "statistics", id: exercise.id
|
||||||
td = exercise.users.distinct.count
|
td = us["users"]
|
||||||
td = average_score
|
td = us["average_score"]
|
||||||
td = exercise.maximum_score
|
td = us["maximum_score"]
|
||||||
td = 100 / exercise.maximum_score * average_score
|
td = us["percent_correct"]
|
||||||
td = exercise.average_number_of_submissions
|
td = us["average_submission_count"]
|
||||||
td = average_time
|
td = average_time
|
||||||
|
Reference in New Issue
Block a user