VRFS-1664 fixed large batch test

This commit is contained in:
Jonathan Kolyer 2014-06-05 16:29:01 +00:00
parent e669205c64
commit a657236814
2 changed files with 42 additions and 31 deletions

View File

@ -9,6 +9,7 @@ module JamRuby
VAR_MUSICIAN_TABLE = "@MUSICIAN_TABLE"
TMP_NEW = 'tmp_new_musicians'
TMP_RECEIVE = 'tmp_receivers'
TMP_PAIRS = 'tmp_receivers_new_musicians'
def self.subject
@ -26,14 +27,33 @@ SELECT
INTO TEMP TABLE #{TMP_NEW}
FROM users
WHERE
musician = 't' AND
last_jam_locidispid IS NOT NULL AND
users.musician = 't' AND
users.last_jam_locidispid IS NOT NULL AND
users.created_at > '#{time_since_last_batch(SINCE_DAYS)}'
SQL
ActiveRecord::Base.connection.execute(sql)
end
# inserts eligible sessions to temp table
def _fetch_eligible_receivers
ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS #{TMP_RECEIVE}")
sql =<<SQL
SELECT
rr.id AS receiver_id,
rr.created_at AS receiver_created_at
INTO TEMP TABLE #{TMP_RECEIVE}
FROM users rr
FULL OUTER JOIN #{TMP_NEW} ON #{TMP_NEW}.new_user_id = rr.id
WHERE
rr.musician = 't' AND
rr.subscribe_email = 't' AND
rr.last_jam_locidispid IS NOT NULL AND
(#{TMP_NEW}.new_user_id IS NULL OR rr.id IS NULL)
SQL
ActiveRecord::Base.connection.execute(sql)
end
def _fetch_pairs
ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS #{TMP_PAIRS}")
# load eligible recipients into tmp table
sql =<<SQL
@ -48,15 +68,8 @@ INNER JOIN #{TMP_NEW} ON #{TMP_NEW}.last_jam_locidispid = scores.blocidispid
WHERE
scores.score < #{Score::MAX_YELLOW_LATENCY} AND
receivers.id IN (
SELECT
rr.id
FROM users rr
FULL OUTER JOIN #{TMP_NEW} ON rr.id = #{TMP_NEW}.new_user_id
WHERE
rr.musician = 't' AND
rr.subscribe_email = 't' AND
rr.last_jam_locidispid IS NOT NULL AND
(#{TMP_NEW}.new_user_id IS NULL OR rr.id IS NULL)
SELECT receiver_id
FROM #{TMP_RECEIVE}
)
SQL
ActiveRecord::Base.connection.execute(sql)
@ -70,10 +83,13 @@ SQL
# load email receivers into tmp table
self._fetch_eligible_receivers
# load receivers/musicians pairs into tmp table
self._fetch_pairs
countsql = "SELECT COUNT(DISTINCT receiver_id) AS num FROM #{TMP_PAIRS}"
rr = ActiveRecord::Base.connection.execute(countsql)
num_pair = 0 < rr.count ? rr[0]['num'].to_i : 0
loops = (num_pair / per_page) + (num_pair % per_page) - 1
0.upto(loops) do |nn|
offset = nn * per_page

View File

@ -15,16 +15,18 @@ describe EmailBatchNewMusician do
let (:new_musician_batch) { FactoryGirl.create(:email_batch_new_musician) }
let (:receiver_date) { Time.now - (EmailBatchNewMusician::SINCE_DAYS.days + 1.day) }
let (:receiver1) {
FactoryGirl.create(:user,
:created_at => Time.now - (EmailBatchNewMusician::SINCE_DAYS.days + 1.day),
:created_at => receiver_date,
:last_jam_locidispid => 1,
:last_jam_addr => 1
)
}
let (:receiver2) {
FactoryGirl.create(:user,
:created_at => Time.now - (EmailBatchNewMusician::SINCE_DAYS.days + 1.day),
:created_at => receiver_date,
:last_jam_locidispid => 3,
:last_jam_addr => 3
)
@ -68,7 +70,6 @@ describe EmailBatchNewMusician do
end
it 'sets up data properly' do
pending
results = new_musician_batch.fetch_recipients
expect(results.count).to eq(1)
user, new_musicians = results[0]
@ -77,14 +78,12 @@ describe EmailBatchNewMusician do
end
it 'sends email' do
pending
ebatch = new_musician_batch
ebatch.deliver_batch
expect(UserMailer.deliveries.length).to eq(1)
end
it 'handles multiple receivers' do
pending
JamRuby::Score.createx(1, 'a', 1, 3, 'a', 3, 10)
JamRuby::Score.createx(1, 'a', 1, 4, 'a', 4, 10)
JamRuby::Score.createx(2, 'a', 2, 4, 'a', 4, 10)
@ -97,30 +96,26 @@ describe EmailBatchNewMusician do
end
it 'handles large batches' do
dd = Time.now - (EmailBatchNewMusician::SINCE_DAYS.days + 14.day)
dd = receiver_date + 1.day
20.downto(1) do |nn|
FactoryGirl.create(:user, :last_jam_locidispid => 1, :last_jam_addr => 1,
FactoryGirl.create(:user, :last_jam_locidispid => 5, :last_jam_addr => 5,
:created_at => dd)
end
10.downto(1) do |nn|
FactoryGirl.create(:user, :last_jam_locidispid => 3, :last_jam_addr => 3)
FactoryGirl.create(:user, :last_jam_locidispid => 6, :last_jam_addr => 6)
end
JamRuby::Score.createx(1, 'a', 1, 3, 'a', 3, 10)
num = 0
# User.where(["created_at < ?",dd]).order('created_at DESC').all.each {|uu| puts "#{uu.id}; #{uu.created_at}"}
JamRuby::Score.delete_all
JamRuby::Score.createx(5, 'a', 5, 6, 'a', 6, 10)
JamRuby::Score.createx(5, 'a', 5, 7, 'a', 7, Score::MAX_YELLOW_LATENCY + 1)
FactoryGirl.create(:user, :last_jam_locidispid => 8, :last_jam_addr => 8, :created_at => dd)
FactoryGirl.create(:user, :last_jam_locidispid => 7, :last_jam_addr => 7)
receivers = []
new_musician_batch.fetch_recipients do |uu, newm|
num += 1
receivers << uu
# puts "#{uu.id}; #{uu.created_at}; "
# binding.pry
expect(newm.count).to eq(10)
end
dd += 1.day
# receivers.each_with_index {|rr,idx| puts "#{idx}; #{rr.created_at}; #{rr.id}"}
receivers.uniq!
expect(receivers.count).to eq(User.where(["created_at <= ?",dd]).count)
expect(num).to eq(User.where(["created_at <= ?",dd]).count)
expect(receivers.count).to eq(User.where(["created_at <= ? AND last_jam_addr = ?",dd,5]).count)
end
end