Use exec_query
for custom SQL execution
Also align how we use query Postgres from controllers. The change is mainly due to regular (but not reproducible) issues with the `intervalstyle` defaulting to `postgres` (instead of `iso8601`) and thereby causing issues. We're just experimenting to see whether this change resolves the issue.
This commit is contained in:
@ -60,7 +60,7 @@ class CommunitySolutionsController < ApplicationController
|
|||||||
|
|
||||||
# Acquire lock here! This is expensive but required for synchronization
|
# Acquire lock here! This is expensive but required for synchronization
|
||||||
@community_solution_lock = ActiveRecord::Base.transaction do
|
@community_solution_lock = ActiveRecord::Base.transaction do
|
||||||
ActiveRecord::Base.connection.execute("LOCK #{CommunitySolutionLock.table_name} IN ACCESS EXCLUSIVE MODE")
|
ApplicationRecord.connection.exec_query("LOCK #{CommunitySolutionLock.table_name} IN ACCESS EXCLUSIVE MODE")
|
||||||
|
|
||||||
lock = CommunitySolutionLock.where(user: current_user, community_solution: @community_solution).order(locked_until: :asc).last
|
lock = CommunitySolutionLock.where(user: current_user, community_solution: @community_solution).order(locked_until: :asc).last
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ module RedirectBehavior
|
|||||||
|
|
||||||
# Acquire lock here! This is expensive but required for synchronization
|
# Acquire lock here! This is expensive but required for synchronization
|
||||||
@community_solution_lock = ActiveRecord::Base.transaction do
|
@community_solution_lock = ActiveRecord::Base.transaction do
|
||||||
ActiveRecord::Base.connection.execute("LOCK #{CommunitySolutionLock.table_name} IN ACCESS EXCLUSIVE MODE")
|
ApplicationRecord.connection.exec_query("LOCK #{CommunitySolutionLock.table_name} IN ACCESS EXCLUSIVE MODE")
|
||||||
|
|
||||||
# This is returned
|
# This is returned
|
||||||
CommunitySolutionLock.find_or_create_by(community_solution: @community_solution, locked_until: Time.zone.now...) do |lock|
|
CommunitySolutionLock.find_or_create_by(community_solution: @community_solution, locked_until: Time.zone.now...) do |lock|
|
||||||
|
@ -107,7 +107,7 @@ class ExecutionEnvironmentsController < ApplicationController
|
|||||||
working_time_statistics = {}
|
working_time_statistics = {}
|
||||||
user_statistics = {}
|
user_statistics = {}
|
||||||
|
|
||||||
ApplicationRecord.connection.execute(working_time_query).each do |tuple|
|
ApplicationRecord.connection.exec_query(working_time_query).each do |tuple|
|
||||||
tuple = tuple.merge({
|
tuple = tuple.merge({
|
||||||
'average_time' => format_time_difference(tuple['average_time']),
|
'average_time' => format_time_difference(tuple['average_time']),
|
||||||
'stddev_time' => format_time_difference(tuple['stddev_time']),
|
'stddev_time' => format_time_difference(tuple['stddev_time']),
|
||||||
@ -115,7 +115,7 @@ class ExecutionEnvironmentsController < ApplicationController
|
|||||||
working_time_statistics[tuple['exercise_id'].to_i] = tuple
|
working_time_statistics[tuple['exercise_id'].to_i] = tuple
|
||||||
end
|
end
|
||||||
|
|
||||||
ApplicationRecord.connection.execute(user_query).each do |tuple|
|
ApplicationRecord.connection.exec_query(user_query).each do |tuple|
|
||||||
user_statistics[tuple['exercise_id'].to_i] = tuple
|
user_statistics[tuple['exercise_id'].to_i] = tuple
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ class ExternalUsersController < ApplicationController
|
|||||||
|
|
||||||
statistics = {}
|
statistics = {}
|
||||||
|
|
||||||
ApplicationRecord.connection.execute(working_time_query(tag&.id)).each do |tuple|
|
ApplicationRecord.connection.exec_query(working_time_query(tag&.id)).each do |tuple|
|
||||||
tuple = tuple.merge('working_time' => format_time_difference(tuple['working_time']))
|
tuple = tuple.merge('working_time' => format_time_difference(tuple['working_time']))
|
||||||
statistics[tuple['exercise_id'].to_i] = tuple
|
statistics[tuple['exercise_id'].to_i] = tuple
|
||||||
end
|
end
|
||||||
|
@ -16,7 +16,7 @@ class PingController < ApplicationController
|
|||||||
|
|
||||||
def postgres_connected!
|
def postgres_connected!
|
||||||
# any unhandled exception leads to a HTTP 500 response.
|
# any unhandled exception leads to a HTTP 500 response.
|
||||||
return if ApplicationRecord.connection.execute('SELECT 1 as result').first['result'] == 1
|
return if ApplicationRecord.connection.exec_query('SELECT 1 as result').first['result'] == 1
|
||||||
|
|
||||||
raise ActiveRecord::ConnectionNotEstablished
|
raise ActiveRecord::ConnectionNotEstablished
|
||||||
end
|
end
|
||||||
|
@ -68,7 +68,7 @@ class Exercise < ApplicationRecord
|
|||||||
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').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.exec_query("SELECT AVG(maximum_score) AS average_score FROM (#{maximum_scores_query}) AS maximum_scores").first['average_score'].to_f
|
||||||
else
|
else
|
||||||
0
|
0
|
||||||
end
|
end
|
||||||
@ -222,7 +222,7 @@ class Exercise < ApplicationRecord
|
|||||||
"AND user_id = #{user.id} AND user_type = '#{user.class.name}'"
|
"AND user_id = #{user.id} AND user_type = '#{user.class.name}'"
|
||||||
end
|
end
|
||||||
|
|
||||||
results = self.class.connection.execute(study_group_working_time_query(id, study_group_id,
|
results = self.class.connection.exec_query(study_group_working_time_query(id, study_group_id,
|
||||||
additional_filter)).each do |tuple|
|
additional_filter)).each do |tuple|
|
||||||
bucket = if maximum_score > 0.0 && tuple['score'] <= maximum_score
|
bucket = if maximum_score > 0.0 && tuple['score'] <= maximum_score
|
||||||
(tuple['score'] / maximum_score * max_bucket).round
|
(tuple['score'] / maximum_score * max_bucket).round
|
||||||
@ -253,7 +253,7 @@ class Exercise < ApplicationRecord
|
|||||||
end
|
end
|
||||||
|
|
||||||
def get_quantiles(quantiles)
|
def get_quantiles(quantiles)
|
||||||
result = self.class.connection.execute("
|
result = self.class.connection.exec_query("
|
||||||
WITH working_time AS
|
WITH working_time AS
|
||||||
(
|
(
|
||||||
SELECT user_id,
|
SELECT user_id,
|
||||||
@ -369,14 +369,14 @@ class Exercise < ApplicationRecord
|
|||||||
|
|
||||||
def retrieve_working_time_statistics
|
def retrieve_working_time_statistics
|
||||||
@working_time_statistics = {'InternalUser' => {}, 'ExternalUser' => {}}
|
@working_time_statistics = {'InternalUser' => {}, 'ExternalUser' => {}}
|
||||||
self.class.connection.execute(user_working_time_query).each do |tuple|
|
self.class.connection.exec_query(user_working_time_query).each do |tuple|
|
||||||
tuple = tuple.merge('working_time' => format_time_difference(tuple['working_time']))
|
tuple = tuple.merge('working_time' => format_time_difference(tuple['working_time']))
|
||||||
@working_time_statistics[tuple['user_type']][tuple['user_id'].to_i] = tuple
|
@working_time_statistics[tuple['user_type']][tuple['user_id'].to_i] = tuple
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def average_working_time
|
def average_working_time
|
||||||
result = self.class.connection.execute("
|
result = self.class.connection.exec_query("
|
||||||
SELECT avg(working_time) as average_time
|
SELECT avg(working_time) as average_time
|
||||||
FROM
|
FROM
|
||||||
(#{self.class.sanitize_sql(user_working_time_query)}) AS baz;
|
(#{self.class.sanitize_sql(user_working_time_query)}) AS baz;
|
||||||
@ -392,7 +392,7 @@ class Exercise < ApplicationRecord
|
|||||||
def accumulated_working_time_for_only(user)
|
def accumulated_working_time_for_only(user)
|
||||||
user_type = user.external_user? ? 'ExternalUser' : 'InternalUser'
|
user_type = user.external_user? ? 'ExternalUser' : 'InternalUser'
|
||||||
begin
|
begin
|
||||||
result = self.class.connection.execute("
|
result = self.class.connection.exec_query("
|
||||||
WITH WORKING_TIME AS
|
WITH WORKING_TIME AS
|
||||||
(SELECT user_id,
|
(SELECT user_id,
|
||||||
id,
|
id,
|
||||||
|
Reference in New Issue
Block a user