diff --git a/ruby/lib/jam_ruby/models/email_batch_scheduled_sessions.rb b/ruby/lib/jam_ruby/models/email_batch_scheduled_sessions.rb index c44dc0ff4..0f61af83b 100644 --- a/ruby/lib/jam_ruby/models/email_batch_scheduled_sessions.rb +++ b/ruby/lib/jam_ruby/models/email_batch_scheduled_sessions.rb @@ -106,62 +106,6 @@ module JamRuby self.update_attribute(:test_emails, @counters.inspect) end - def query - ActiveRecord::Base.connection.execute(< '#{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) diff --git a/ruby/lib/jam_ruby/models/music_session_user_history.rb b/ruby/lib/jam_ruby/models/music_session_user_history.rb index f287604ae..f5ffebd98 100644 --- a/ruby/lib/jam_ruby/models/music_session_user_history.rb +++ b/ruby/lib/jam_ruby/models/music_session_user_history.rb @@ -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 diff --git a/ruby/spec/jam_ruby/models/email_batch_spec_scheduled_session.rb b/ruby/spec/jam_ruby/models/email_batch_spec_scheduled_session.rb index 0d69c0619..e593f5cbd 100644 --- a/ruby/spec/jam_ruby/models/email_batch_spec_scheduled_session.rb +++ b/ruby/spec/jam_ruby/models/email_batch_spec_scheduled_session.rb @@ -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]}