Skip to content

Instantly share code, notes, and snippets.

@rklancer
Last active August 29, 2015 14:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rklancer/fc33fb89ef8dc8e8c804 to your computer and use it in GitHub Desktop.
Save rklancer/fc33fb89ef8dc8e8c804 to your computer and use it in GitHub Desktop.
Queries for Arg Block report
# Start with a list of endpoints; here we just use all of them
endpoints = Run.where("remote_endpoint IS NOT NULL").map &:remote_endpoint
select_params = [
{
:embeddable_type => "Embeddable::OpenResponse",
:embeddable_table => "embeddable_open_responses",
:answer_table => "embeddable_open_response_answers",
:question_foreign_key => "open_response_id",
:feedback_table => "c_rater_feedback_items",
:usefulness_score_column => "c_rater_feedback_submissions.usefulness_score",
:usefulness_score_join => "LEFT OUTER JOIN c_rater_feedback_submissions ON c_rater_feedback_submissions.id = c_rater_feedback_items.feedback_submission_id"
},
{
:embeddable_type => "Embeddable::MultipleChoice",
:embeddable_table => "embeddable_multiple_choices",
:answer_table => "embeddable_multiple_choice_answers",
:question_foreign_key => "multiple_choice_id",
:feedback_table => "embeddable_feedback_items",
:usefulness_score_column => "NULL",
:usefulness_score_join => ""
}
]
selects = select_params.map do |s|
select = <<SQL
SELECT DISTINCT
runs.remote_endpoint AS remote_endpoint,
lightweight_activities.id AS activity_id,
interactive_pages.id AS page_id,
interactive_pages.position AS page_index,
page_items.position AS question_index,
#{s[:embeddable_table]}.id AS question_id,
#{s[:embeddable_table]}.prompt AS prompt,
#{s[:feedback_table]}.answer_text AS answer,
#{s[:feedback_table]}.score AS score,
#{s[:feedback_table]}.created_at AS submit_time,
#{s[:feedback_table]}.feedback_text AS feedback,
#{s[:usefulness_score_column]} AS usefulness_score
FROM runs
INNER JOIN lightweight_activities
ON lightweight_activities.id = runs.activity_id
INNER JOIN interactive_pages
ON interactive_pages.lightweight_activity_id = lightweight_activities.id
INNER JOIN page_items
ON page_items.interactive_page_id = interactive_pages.id
INNER JOIN #{s[:embeddable_table]}
ON #{s[:embeddable_table]}.id = page_items.embeddable_id
LEFT OUTER JOIN #{s[:answer_table]}
ON #{s[:answer_table]}.run_id = runs.id AND #{s[:answer_table]}.#{s[:question_foreign_key]} = #{s[:embeddable_table]}.id
LEFT OUTER JOIN #{s[:feedback_table]}
ON #{s[:feedback_table]}.answer_id = #{s[:answer_table]}.id
#{s[:usefulness_score_join]}
WHERE
page_items.section = "arg_block"
AND
embeddable_type = "#{s[:embeddable_type]}"
AND
remote_endpoint in ("#{endpoints.join('","')}")
SQL
end
order_by = <<SQL
ORDER BY
activity_id,
page_index,
question_index
SQL
sql = selects.join("\n UNION\n") + order_by + ";"
results = ActiveRecord::Base.connection.execute(sql)
exp = ActiveRecord::Base.connection.explain(sql)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment