157 lines
8.3 KiB
MySQL
157 lines
8.3 KiB
MySQL
|
|
-- changelog:
|
||
|
|
-- * allow session_id to be passed to sms_index, which skips all the access questions, and just makes sure you'll get back that session, with user scores
|
||
|
|
-- * in both sms_index and ams_index, in the user tmp table, return also internet score and the other user's audio latency
|
||
|
|
|
||
|
|
-- 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) 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
|
||
|
|
-- 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 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.alocidispid = users.last_jam_locidispid
|
||
|
|
WHERE
|
||
|
|
s.blocidispid = my_locidispid;
|
||
|
|
|
||
|
|
-- 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.alocidispid = users.last_jam_locidispid
|
||
|
|
WHERE
|
||
|
|
s.blocidispid = my_locidispid AND
|
||
|
|
users.id NOT IN (SELECT user_id FROM sms_users_tmp);
|
||
|
|
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;
|
||
|
|
|
||
|
|
|
||
|
|
-- my_audio_latency can have a special value of -1, which means 'unknown'.
|
||
|
|
CREATE OR REPLACE FUNCTION ams_index (my_user_id VARCHAR, my_locidispid BIGINT, my_audio_latency INTEGER) RETURNS VOID STRICT VOLATILE AS $$
|
||
|
|
BEGIN
|
||
|
|
-- output table to hold tagged music sessions with latency
|
||
|
|
CREATE TEMPORARY TABLE ams_music_session_tmp (music_session_id VARCHAR(64) NOT NULL, tag INTEGER, latency INTEGER) ON COMMIT DROP;
|
||
|
|
|
||
|
|
-- populate ams_music_session_tmp as all music sessions
|
||
|
|
INSERT INTO ams_music_session_tmp SELECT DISTINCT id, NULL::INTEGER AS tag, NULL::INTEGER AS latency
|
||
|
|
FROM active_music_sessions;
|
||
|
|
|
||
|
|
-- TODO worry about active music session where my_user_id is the creator?
|
||
|
|
-- eh, maybe, but if the music session is active and you're the creator wouldn't you already be in it?
|
||
|
|
-- so maybe you're on another computer, so why care? plus seth is talking about auto rsvp'ing the session
|
||
|
|
-- for you, so maybe not a problem.
|
||
|
|
|
||
|
|
-- tag accepted rsvp as 1
|
||
|
|
UPDATE ams_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 ams_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 ams_music_session_tmp q SET tag = 3 FROM music_sessions m WHERE
|
||
|
|
q.music_session_id = m.id AND
|
||
|
|
m.musician_access = TRUE AND
|
||
|
|
q.tag IS NULL;
|
||
|
|
|
||
|
|
-- delete anything not tagged
|
||
|
|
DELETE FROM ams_music_session_tmp WHERE tag IS NULL;
|
||
|
|
|
||
|
|
-- output table to hold users involved in the ams_music_session_tmp sessions and their latency
|
||
|
|
CREATE TEMPORARY TABLE ams_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
|
||
|
|
-- populate ams_users_tmp with users that have a connection for sessions in the ams_music_session_tmp table, accompanied with full latency and music session
|
||
|
|
INSERT INTO ams_users_tmp SELECT c.music_session_id, c.user_id, s.full_score AS full_score, s.a_audio_latency, s.score
|
||
|
|
FROM ams_music_session_tmp q
|
||
|
|
INNER JOIN connections c ON c.music_session_id = q.music_session_id
|
||
|
|
LEFT OUTER JOIN current_scores s ON s.alocidispid = c.locidispid
|
||
|
|
WHERE s.blocidispid = my_locidispid;
|
||
|
|
|
||
|
|
-- populate ams_users_tmp with users that have an approved RSVP for sessions inthe ams_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 ams_users_tmp SELECT NULL, users.id, s.full_score AS full_score, s.a_audio_latency, s.score
|
||
|
|
FROM ams_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.alocidispid = users.last_jam_locidispid
|
||
|
|
WHERE
|
||
|
|
s.blocidispid = my_locidispid AND
|
||
|
|
rsvp_requests_rsvp_slots.chosen = TRUE AND
|
||
|
|
users.id NOT IN (SELECT user_id FROM ams_users_tmp);
|
||
|
|
END IF;
|
||
|
|
|
||
|
|
-- calculate the average latency
|
||
|
|
UPDATE ams_music_session_tmp q SET latency = (select AVG(u.full_score) FROM ams_users_tmp u WHERE
|
||
|
|
q.music_session_id = u.music_session_id);
|
||
|
|
|
||
|
|
RETURN;
|
||
|
|
END;
|
||
|
|
$$ LANGUAGE plpgsql;
|