Merge branch 'master' of https://github.com/openHPI/codeocean
This commit is contained in:
@@ -28,7 +28,76 @@ class ExecutionEnvironmentsController < ApplicationController
|
||||
render(json: @docker_client.execute_arbitrary_command(params[:command]))
|
||||
end
|
||||
|
||||
|
||||
def working_time_query
|
||||
"""
|
||||
SELECT exercise_id, avg(working_time) as average_time, stddev_samp(extract('epoch' from working_time)) * interval '1 second' as stddev_time
|
||||
FROM
|
||||
(
|
||||
SELECT user_id,
|
||||
exercise_id,
|
||||
sum(working_time_new) AS working_time
|
||||
FROM
|
||||
(SELECT user_id,
|
||||
exercise_id,
|
||||
CASE WHEN working_time >= '0:30:00' THEN '0' ELSE working_time END AS working_time_new
|
||||
FROM
|
||||
(SELECT user_id,
|
||||
exercise_id,
|
||||
id,
|
||||
(created_at - lag(created_at) over (PARTITION BY user_id, exercise_id
|
||||
ORDER BY created_at)) AS working_time
|
||||
FROM submissions
|
||||
WHERE exercise_id IN (SELECT ID FROM exercises WHERE execution_environment_id = #{@execution_environment.id})
|
||||
GROUP BY exercise_id, user_id, id) AS foo) AS bar
|
||||
GROUP BY user_id, exercise_id
|
||||
) AS baz GROUP BY exercise_id;
|
||||
"""
|
||||
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,
|
||||
stddev_samp(score) as stddev_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
|
||||
working_time_statistics = {}
|
||||
user_statistics = {}
|
||||
|
||||
ActiveRecord::Base.connection.execute(working_time_query).each do |tuple|
|
||||
working_time_statistics[tuple["exercise_id"].to_i] = tuple
|
||||
end
|
||||
|
||||
ActiveRecord::Base.connection.execute(user_query).each do |tuple|
|
||||
user_statistics[tuple["exercise_id"].to_i] = tuple
|
||||
end
|
||||
|
||||
render locals: {
|
||||
working_time_statistics: working_time_statistics,
|
||||
user_statistics: user_statistics
|
||||
}
|
||||
end
|
||||
|
||||
def execution_environment_params
|
||||
|
@@ -155,7 +155,16 @@ class ExercisesController < ApplicationController
|
||||
if(@external_user)
|
||||
render 'exercises/external_users/statistics'
|
||||
else
|
||||
render 'exercises/statistics'
|
||||
user_statistics = {}
|
||||
query = "SELECT user_id, MAX(score) AS maximum_score, COUNT(id) AS runs
|
||||
FROM submissions WHERE exercise_id = #{@exercise.id} GROUP BY
|
||||
user_id;"
|
||||
ActiveRecord::Base.connection.execute(query).each do |tuple|
|
||||
user_statistics[tuple["user_id"].to_i] = tuple
|
||||
end
|
||||
render locals: {
|
||||
user_statistics: user_statistics
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -176,7 +176,24 @@ class SubmissionsController < ApplicationController
|
||||
for part in message.split("\n")
|
||||
self.parse_message(part,output_stream,socket,false)
|
||||
end
|
||||
elsif(message.include? "<img")
|
||||
#Rails.logger.info('img foung')
|
||||
@buffering = true
|
||||
@buffer = ""
|
||||
@buffer += message
|
||||
#Rails.logger.info('Starting to buffer')
|
||||
elsif(@buffering && (message.include? "/>"))
|
||||
@buffer += message
|
||||
parsed = {'cmd'=>'write','stream'=>output_stream,'data'=>@buffer}
|
||||
socket.send_data JSON.dump(parsed)
|
||||
#socket.send_data @buffer
|
||||
@buffering = false
|
||||
#Rails.logger.info('Sent complete buffer')
|
||||
elsif(@buffering)
|
||||
@buffer += message
|
||||
#Rails.logger.info('Appending to buffer')
|
||||
else
|
||||
#Rails.logger.info('else')
|
||||
parsed = {'cmd'=>'write','stream'=>output_stream,'data'=>message}
|
||||
socket.send_data JSON.dump(parsed)
|
||||
Rails.logger.info('parse_message sent: ' + JSON.dump(parsed))
|
||||
|
Reference in New Issue
Block a user