Merge branch 'develop' of bitbucket.org:jamkazam/jam-cloud into develop

This commit is contained in:
Brian Smith 2014-09-10 01:03:27 -04:00
commit 14960eb8ae
3 changed files with 32 additions and 62 deletions

View File

@ -106,62 +106,6 @@ module JamRuby
self.update_attribute(:test_emails, @counters.inspect)
end
def query
ActiveRecord::Base.connection.execute(<<SQL
SELECT DISTINCT
users.id AS receiver_id,
music_sessions.id AS session_id,
current_scores.full_score AS latency
FROM current_scores
INNER JOIN
(SELECT
msess.id AS session_id,
msess.user_id AS creator_id,
users.last_jam_locidispid AS creator_score_idx,
rs.instrument_id,
invitations.receiver_id AS invited_user_id,
msess.is_unstructured_rsvp
FROM music_sessions msess
INNER JOIN users ON users.id = msess.user_id
INNER JOIN rsvp_slots AS rs ON rs.music_session_id = msess.id
LEFT JOIN rsvp_requests_rsvp_slots AS rrrs ON rrrs.rsvp_slot_id = rs.id
LEFT JOIN invitations ON invitations.music_session_id = msess.id
WHERE
open_rsvps = TRUE OR invitations.id IS NOT NULL AND
users.last_jam_locidispid IS NOT NULL AND
msess.created_at > '#{earliest_session_create_time}' AND
msess.created_at < '#{latest_session_create_time}' AND
scheduled_start >= '#{earliest_session_start_time}' AND
(rrrs.rsvp_slot_id IS NULL OR rrrs.chosen != TRUE)) AS tmp_candidate_sessions
INNER JOIN
(SELECT
users.id AS receiver_id,
users.last_jam_locidispid AS receiver_score_idx,
mi.instrument_id
INTO TEMP TABLE tmp_candidate_recipients
FROM users
INNER JOIN musicians_instruments AS mi ON mi.user_id = users.id
INNER JOIN tmp_candidate_sessions ON tmp_candidate_sessions.instrument_id = mi.instrument_id OR
tmp_candidate_sessions.is_unstructured_rsvp = TRUE OR
tmp_candidate_sessions.invited_user_id = users.id
WHERE
users.last_jam_locidispid IS NOT NULL AND
users.musician = TRUE AND
users.subscribe_email = TRUE) AS tmp_candidate_recipients
INNER JOIN tmp_candidate_sessions ON tmp_candidate_sessions.creator_id = current_scores.a_userid
INNER JOIN tmp_candidate_recipients ON tmp_candidate_recipients.receiver_id = current_scores.b_userid
WHERE
current_scores.full_score < #{max_score} AND
tmp_candidate_recipients.receiver_id != tmp_candidate_sessions.creator_id
GROUP BY
tmp_candidate_recipients.receiver_id,
tmp_candidate_sessions.session_id,
latency
SQL
)
end
def fetch_recipients(per_page=BATCH_SIZE)
objs = []
@ -280,14 +224,14 @@ SQL
SELECT DISTINCT
tmp_candidate_recipients.receiver_id,
tmp_candidate_recipients.session_id,
current_scores.full_score AS latency
nondirected_scores.full_score AS latency
INTO TEMP TABLE tmp_matches
FROM current_scores
FROM nondirected_scores
INNER JOIN tmp_candidate_recipients ON
tmp_candidate_recipients.creator_id = current_scores.a_userid AND
tmp_candidate_recipients.receiver_id = current_scores.b_userid
tmp_candidate_recipients.creator_id = nondirected_scores.a_userid AND
tmp_candidate_recipients.receiver_id = nondirected_scores.b_userid
WHERE
current_scores.full_score < #{max_score}
nondirected_scores.full_score < #{max_score}
GROUP BY
tmp_candidate_recipients.receiver_id,
tmp_candidate_recipients.session_id,
@ -324,6 +268,7 @@ SQL
# load mail recipients with minimum score into tmp table
_collect_scored_recipients
end
def _count_recipients(load_tmp_tables = false)

View File

@ -87,7 +87,7 @@ module JamRuby
end
def count_concurrent(in_out_times)
in_out_times.sort!
in_out_times.sort! { |a,b| a[0] <=> b[0] }
max_concurrent = 0
concurrent = 0

View File

@ -88,6 +88,8 @@ describe EmailBatchScheduledSessions do
expect(drummer.instruments.include?(drums)).to eq(true)
expect(drummer.instruments.include?(guitar)).to eq(true)
loser.touch
end
describe "everyone but loser has good enough scores" do
@ -105,6 +107,29 @@ describe EmailBatchScheduledSessions do
session1.save!
end
it "no duplicate user matches" do
def ensure_no_dups(obj)
found_sessions = obj.map{ |user_and_sessions| user_and_sessions[1] }
found_sessions.uniq.length.should == found_sessions.length
end
Score.connection.execute('delete from scores').check
1.times { JamRuby::Score.createx(1, 'a', 1, 2, 'a', 2, 10) }
2.times { JamRuby::Score.createx(2, 'a', 2, 1, 'a', 1, 20) }
3.times { JamRuby::Score.createx(1, 'a', 1, 2, 'a', 2, 15) }
4.times { JamRuby::Score.createx(2, 'a', 2, 1, 'a', 1, 35) }
obj = scheduled_batch.fetch_recipients
ensure_no_dups(obj)
obj.length.should == 1
obj[0][1].length.should == 1
found_users = obj.map{ |user_and_sessions| user_and_sessions[0] }
found_users.should == [loser]
end
it 'finds anyone with good enough scores' do
obj = scheduled_batch.fetch_recipients
found_users = obj.map{ |user_and_sessions| user_and_sessions[0]}