From 6442674c91fe5e8a656a7cbb5f3377bda521a20b Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Sun, 28 Sep 2014 22:37:52 -0400 Subject: [PATCH] VRFS-2216 fix tests; include pending RSVPs and invites for session details screen --- db/manifest | 4 +- db/up/fix_find_session_sorting_2216b.sql | 95 +++++++++++++++++++ db/up/fix_find_session_sorting_2216c.sql | 95 +++++++++++++++++++ ruby/lib/jam_ruby/models/music_session.rb | 8 +- .../javascripts/accounts_session_detail.js | 2 +- web/app/assets/javascripts/jam_rest.js | 9 +- .../api_music_sessions_controller.rb | 2 +- 7 files changed, 206 insertions(+), 9 deletions(-) create mode 100644 db/up/fix_find_session_sorting_2216b.sql create mode 100644 db/up/fix_find_session_sorting_2216c.sql diff --git a/db/manifest b/db/manifest index 07b7595e5..5b1591a61 100755 --- a/db/manifest +++ b/db/manifest @@ -210,4 +210,6 @@ new_genres.sql get_work_faster.sql fix_find_session_sorting_2216.sql multiple_gateways.sql -fix_find_session_sorting_2216a.sql \ No newline at end of file +fix_find_session_sorting_2216a.sql +fix_find_session_sorting_2216b.sql +fix_find_session_sorting_2216c.sql \ No newline at end of file diff --git a/db/up/fix_find_session_sorting_2216b.sql b/db/up/fix_find_session_sorting_2216b.sql new file mode 100644 index 000000000..60ede1d53 --- /dev/null +++ b/db/up/fix_find_session_sorting_2216b.sql @@ -0,0 +1,95 @@ +-- check that the music_sessions does not currently have an active_music_sessions +CREATE OR REPLACE FUNCTION sms_index (my_user_id VARCHAR, my_locidispid BIGINT, my_audio_latency INTEGER, session_id VARCHAR, include_pending BOOLEAN) RETURNS VOID STRICT VOLATILE AS $$ + BEGIN + -- output table to hold tagged music sessions with latency + CREATE TEMPORARY TABLE sms_music_session_tmp (music_session_id VARCHAR(64) NOT NULL, tag INTEGER, latency INTEGER) ON COMMIT DROP; + + IF session_id = 'any' THEN + -- populate sms_music_session_tmp as all music sessions + -- XXX: we should pass in enough info to match pagination/query to reduce the impact of this step + INSERT INTO sms_music_session_tmp SELECT DISTINCT id, NULL::INTEGER AS tag, NULL::INTEGER AS latency + FROM music_sessions + WHERE (scheduled_start IS NULL OR scheduled_start > (NOW() - (interval '15 minute'))) + AND canceled = FALSE + AND id NOT IN (SELECT id FROM active_music_sessions); + + -- tag accepted rsvp as 1 + UPDATE sms_music_session_tmp q SET tag = 1 FROM rsvp_slots s, rsvp_requests_rsvp_slots rrs, rsvp_requests r WHERE + q.music_session_id = s.music_session_id AND + s.id = rrs.rsvp_slot_id AND + rrs.rsvp_request_id = r.id AND + r.user_id = my_user_id AND + rrs.chosen = TRUE AND + q.tag is NULL; + + -- tag invitation as 2 + UPDATE sms_music_session_tmp q SET tag = 2 FROM invitations i WHERE + q.music_session_id = i.music_session_id AND + i.receiver_id = my_user_id AND + q.tag IS NULL; + + -- musician access as 3 + UPDATE sms_music_session_tmp q SET tag = 3 FROM music_sessions m WHERE + q.music_session_id = m.id AND + m.open_rsvps = TRUE AND + q.tag IS NULL; + + -- delete anything not tagged + DELETE FROM sms_music_session_tmp WHERE tag IS NULL; + + ELSE + INSERT INTO sms_music_session_tmp SELECT DISTINCT id, NULL::INTEGER AS tag, NULL::INTEGER AS latency + FROM music_sessions + WHERE music_sessions.id = session_id; + END IF; + + -- output table to hold users involved in the sms_music_session_tmp sessions and their latency + CREATE TEMPORARY TABLE sms_users_tmp (music_session_id VARCHAR(64), user_id VARCHAR(64) NOT NULL, full_score INTEGER, audio_latency INTEGER, internet_score INTEGER) ON COMMIT DROP; + + IF my_audio_latency > -1 THEN + + IF include_pending THEN + -- populate sms_users_tmp with users that have an approved RSVP for sessions in the sms_music_session_tmp table, accompanied with full latency and music session + INSERT INTO sms_users_tmp SELECT DISTINCT q.music_session_id, users.id, s.full_score AS full_score, s.a_audio_latency, s.score + FROM sms_music_session_tmp q + INNER JOIN rsvp_slots ON rsvp_slots.music_session_id = q.music_session_id + INNER JOIN rsvp_requests_rsvp_slots ON rsvp_requests_rsvp_slots.rsvp_slot_id = rsvp_slots.id + INNER JOIN rsvp_requests ON rsvp_requests.id = rsvp_requests_rsvp_slots.rsvp_request_id + INNER JOIN users ON rsvp_requests.user_id = users.id + LEFT OUTER JOIN current_scores s ON s.a_userid = users.id + WHERE + s.b_userid = my_user_id; + + -- populate sms_users_tmp with invited users for session in the sms_music_session_tmp table, accompanied with full latency and music session + -- specify NULL for music_session_id, because we don't want RSVP users to affect the AVG computed for each session later + INSERT INTO sms_users_tmp SELECT NULL, users.id, s.full_score AS full_score, s.a_audio_latency, s.score + FROM sms_music_session_tmp q + INNER JOIN invitations ON invitations.music_session_id = q.music_session_id + INNER JOIN users ON invitations.receiver_id = users.id + LEFT OUTER JOIN current_scores s ON s.a_userid = users.id + WHERE + s.b_userid = my_user_id AND + users.id NOT IN (SELECT user_id FROM sms_users_tmp); + ELSE + -- populate sms_users_tmp with users that have an approved RSVP for sessions in the sms_music_session_tmp table, accompanied with full latency and music session + INSERT INTO sms_users_tmp SELECT DISTINCT q.music_session_id, users.id, s.full_score AS full_score, s.a_audio_latency, s.score + FROM sms_music_session_tmp q + INNER JOIN rsvp_slots ON rsvp_slots.music_session_id = q.music_session_id + INNER JOIN rsvp_requests_rsvp_slots ON rsvp_requests_rsvp_slots.rsvp_slot_id = rsvp_slots.id + INNER JOIN rsvp_requests ON rsvp_requests.id = rsvp_requests_rsvp_slots.rsvp_request_id + INNER JOIN users ON rsvp_requests.user_id = users.id + LEFT OUTER JOIN current_scores s ON s.a_userid = users.id + WHERE + s.b_userid = my_user_id AND + rsvp_requests_rsvp_slots.chosen = TRUE AND + rsvp_requests.canceled != TRUE; + END IF; + END IF; + + -- calculate the average latency + UPDATE sms_music_session_tmp q SET latency = (select AVG(u.full_score) FROM sms_users_tmp u WHERE + q.music_session_id = u.music_session_id); + + RETURN; + END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/db/up/fix_find_session_sorting_2216c.sql b/db/up/fix_find_session_sorting_2216c.sql new file mode 100644 index 000000000..5e733d8aa --- /dev/null +++ b/db/up/fix_find_session_sorting_2216c.sql @@ -0,0 +1,95 @@ +-- check that the music_sessions does not currently have an active_music_sessions +CREATE OR REPLACE FUNCTION sms_index (my_user_id VARCHAR, my_locidispid BIGINT, my_audio_latency INTEGER, session_id VARCHAR, include_pending BOOLEAN DEFAULT FALSE) RETURNS VOID STRICT VOLATILE AS $$ + BEGIN + -- output table to hold tagged music sessions with latency + CREATE TEMPORARY TABLE sms_music_session_tmp (music_session_id VARCHAR(64) NOT NULL, tag INTEGER, latency INTEGER) ON COMMIT DROP; + + IF session_id = 'any' THEN + -- populate sms_music_session_tmp as all music sessions + -- XXX: we should pass in enough info to match pagination/query to reduce the impact of this step + INSERT INTO sms_music_session_tmp SELECT DISTINCT id, NULL::INTEGER AS tag, NULL::INTEGER AS latency + FROM music_sessions + WHERE (scheduled_start IS NULL OR scheduled_start > (NOW() - (interval '15 minute'))) + AND canceled = FALSE + AND id NOT IN (SELECT id FROM active_music_sessions); + + -- tag accepted rsvp as 1 + UPDATE sms_music_session_tmp q SET tag = 1 FROM rsvp_slots s, rsvp_requests_rsvp_slots rrs, rsvp_requests r WHERE + q.music_session_id = s.music_session_id AND + s.id = rrs.rsvp_slot_id AND + rrs.rsvp_request_id = r.id AND + r.user_id = my_user_id AND + rrs.chosen = TRUE AND + q.tag is NULL; + + -- tag invitation as 2 + UPDATE sms_music_session_tmp q SET tag = 2 FROM invitations i WHERE + q.music_session_id = i.music_session_id AND + i.receiver_id = my_user_id AND + q.tag IS NULL; + + -- musician access as 3 + UPDATE sms_music_session_tmp q SET tag = 3 FROM music_sessions m WHERE + q.music_session_id = m.id AND + m.open_rsvps = TRUE AND + q.tag IS NULL; + + -- delete anything not tagged + DELETE FROM sms_music_session_tmp WHERE tag IS NULL; + + ELSE + INSERT INTO sms_music_session_tmp SELECT DISTINCT id, NULL::INTEGER AS tag, NULL::INTEGER AS latency + FROM music_sessions + WHERE music_sessions.id = session_id; + END IF; + + -- output table to hold users involved in the sms_music_session_tmp sessions and their latency + CREATE TEMPORARY TABLE sms_users_tmp (music_session_id VARCHAR(64), user_id VARCHAR(64) NOT NULL, full_score INTEGER, audio_latency INTEGER, internet_score INTEGER) ON COMMIT DROP; + + IF my_audio_latency > -1 THEN + + IF include_pending THEN + -- populate sms_users_tmp with users that have an approved RSVP for sessions in the sms_music_session_tmp table, accompanied with full latency and music session + INSERT INTO sms_users_tmp SELECT DISTINCT q.music_session_id, users.id, s.full_score AS full_score, s.a_audio_latency, s.score + FROM sms_music_session_tmp q + INNER JOIN rsvp_slots ON rsvp_slots.music_session_id = q.music_session_id + INNER JOIN rsvp_requests_rsvp_slots ON rsvp_requests_rsvp_slots.rsvp_slot_id = rsvp_slots.id + INNER JOIN rsvp_requests ON rsvp_requests.id = rsvp_requests_rsvp_slots.rsvp_request_id + INNER JOIN users ON rsvp_requests.user_id = users.id + LEFT OUTER JOIN current_scores s ON s.a_userid = users.id + WHERE + s.b_userid = my_user_id; + + -- populate sms_users_tmp with invited users for session in the sms_music_session_tmp table, accompanied with full latency and music session + -- specify NULL for music_session_id, because we don't want RSVP users to affect the AVG computed for each session later + INSERT INTO sms_users_tmp SELECT NULL, users.id, s.full_score AS full_score, s.a_audio_latency, s.score + FROM sms_music_session_tmp q + INNER JOIN invitations ON invitations.music_session_id = q.music_session_id + INNER JOIN users ON invitations.receiver_id = users.id + LEFT OUTER JOIN current_scores s ON s.a_userid = users.id + WHERE + s.b_userid = my_user_id AND + users.id NOT IN (SELECT user_id FROM sms_users_tmp); + ELSE + -- populate sms_users_tmp with users that have an approved RSVP for sessions in the sms_music_session_tmp table, accompanied with full latency and music session + INSERT INTO sms_users_tmp SELECT DISTINCT q.music_session_id, users.id, s.full_score AS full_score, s.a_audio_latency, s.score + FROM sms_music_session_tmp q + INNER JOIN rsvp_slots ON rsvp_slots.music_session_id = q.music_session_id + INNER JOIN rsvp_requests_rsvp_slots ON rsvp_requests_rsvp_slots.rsvp_slot_id = rsvp_slots.id + INNER JOIN rsvp_requests ON rsvp_requests.id = rsvp_requests_rsvp_slots.rsvp_request_id + INNER JOIN users ON rsvp_requests.user_id = users.id + LEFT OUTER JOIN current_scores s ON s.a_userid = users.id + WHERE + s.b_userid = my_user_id AND + rsvp_requests_rsvp_slots.chosen = TRUE AND + rsvp_requests.canceled != TRUE; + END IF; + END IF; + + -- calculate the average latency + UPDATE sms_music_session_tmp q SET latency = (select AVG(u.full_score) FROM sms_users_tmp u WHERE + q.music_session_id = u.music_session_id); + + RETURN; + END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/music_session.rb b/ruby/lib/jam_ruby/models/music_session.rb index c04c58514..67e3eebe2 100644 --- a/ruby/lib/jam_ruby/models/music_session.rb +++ b/ruby/lib/jam_ruby/models/music_session.rb @@ -625,7 +625,7 @@ module JamRuby # initialize the two temporary tables we use to drive sms_index and sms_users - def self.sms_init(current_user, options = {}) + def self.sms_init(current_user, options = {}, include_pending=false) session_id = options[:session_id] || 'any' my_locidispid = current_user.last_jam_locidispid @@ -633,7 +633,7 @@ module JamRuby my_audio_latency = current_user.last_jam_audio_latency || 13 locidispid_expr = my_locidispid ? "#{my_locidispid}::bigint" : '0::bigint' # Have to pass in zero; NULL fails silently in the stored proc - self.connection.execute("SELECT sms_index('#{current_user.id}'::varchar, #{locidispid_expr}, #{my_audio_latency}::integer, #{ActiveRecord::Base.connection.quote(session_id)}::varchar)").check + self.connection.execute("SELECT sms_index('#{current_user.id}'::varchar, #{locidispid_expr}, #{my_audio_latency}::integer, #{ActiveRecord::Base.connection.quote(session_id)}::varchar, #{include_pending}::boolean)").check end # Generate a list of music sessions (that are active) filtered by genre, language, keyword, and sorted @@ -758,8 +758,8 @@ module JamRuby end # returns a single session, but populates any other user info with latency scores, so that show_history.rabl can do it's business - def self.session_with_scores(current_user, music_session_id) - MusicSession.sms_init(current_user, {session_id: music_session_id}) + def self.session_with_scores(current_user, music_session_id, include_pending=false) + MusicSession.sms_init(current_user, {session_id: music_session_id}, include_pending) music_session = MusicSession.find(music_session_id) diff --git a/web/app/assets/javascripts/accounts_session_detail.js b/web/app/assets/javascripts/accounts_session_detail.js index 94fd73386..65ec07db8 100644 --- a/web/app/assets/javascripts/accounts_session_detail.js +++ b/web/app/assets/javascripts/accounts_session_detail.js @@ -133,7 +133,7 @@ } function loadSessionData() { - rest.getSessionHistory(sessionId) + rest.getSessionHistory(sessionId, true) .done(function(response) { sessionData = response; diff --git a/web/app/assets/javascripts/jam_rest.js b/web/app/assets/javascripts/jam_rest.js index 08c153eb8..3c1e95027 100644 --- a/web/app/assets/javascripts/jam_rest.js +++ b/web/app/assets/javascripts/jam_rest.js @@ -156,11 +156,16 @@ }); } - function getSessionHistory(id) { + function getSessionHistory(id, includePending) { + var includeFlag = 'false'; + if (includePending) { + includeFlag = 'true'; + } + return $.ajax({ type: "GET", dataType: "json", - url: '/api/sessions/' + id + '/history', + url: '/api/sessions/' + id + '/history?includePending=' + includeFlag, contentType: 'application/json', processData: false }); diff --git a/web/app/controllers/api_music_sessions_controller.rb b/web/app/controllers/api_music_sessions_controller.rb index b51e7dd5a..c10e79020 100644 --- a/web/app/controllers/api_music_sessions_controller.rb +++ b/web/app/controllers/api_music_sessions_controller.rb @@ -534,7 +534,7 @@ class ApiMusicSessionsController < ApiController def show_history if current_user ActiveRecord::Base.transaction do - @history, @user_scores = MusicSession.session_with_scores(current_user, params[:id]) + @history, @user_scores = MusicSession.session_with_scores(current_user, params[:id], params[:includePending]) end else @history = MusicSession.find(params[:id])