VRFS-736 looping through results

This commit is contained in:
Jonathan Kolyer 2014-05-20 05:58:06 +00:00
parent cd801d7852
commit f53ca0010d
2 changed files with 61 additions and 36 deletions

View File

@ -127,13 +127,44 @@ module JamRuby
''
end
def fetch_recipients(trigger_idx=0)
def fetch_recipients(trigger_idx=0, per_page=500)
fetched = []
per_page = 500
offset = 0
prev_date_sql = 0==trigger_idx ? 'tt.prev_trigger_date IS NULL' : "tt.prev_trigger_date + interval '#{self.days_diff(trigger_idx)} days' <= '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}'"
sql =<<SQL
SELECT tt.*, tt.prev_trigger_date
if 0==trigger_idx
prev_date_sql = 'tt.prev_trigger_date IS NULL'
else
prev_date_sql = "tt.prev_trigger_date + interval '#{self.days_diff(trigger_idx)} days' <= '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}'"
end
countsql =<<SQL
SELECT COUNT(*)
FROM (SELECT "users".*,
(SELECT COALESCE(MAX(ebs.trigger_index),-1)
FROM email_batch_sets ebs
WHERE
ebs.sub_type = '#{self.sub_type}' AND
ebs.user_id = users.id
) AS tidx,
(SELECT created_at
FROM email_batch_sets ebs
WHERE
ebs.sub_type = '#{self.sub_type}' AND
ebs.user_id = users.id AND trigger_index = #{trigger_idx - 1}
) AS prev_trigger_date
FROM users) tt
WHERE
tt."subscribe_email" = 't' AND
tt."musician" = 't' AND
(#{progress_column_constraint}) AND
(#{self.trigger_date_constraint(trigger_idx)}) AND
tt.tidx = #{trigger_idx - 1} AND
#{prev_date_sql}
SQL
num_users = User.count_by_sql(countsql)
loops = (num_users / per_page) + (num_users % per_page) - 1
0.upto(loops) do |nn|
offset = nn * per_page
sql =<<SQL
SELECT tt.*
FROM (SELECT "users".*,
(SELECT COALESCE(MAX(ebs.trigger_index),-1)
FROM email_batch_sets ebs
@ -159,32 +190,12 @@ ORDER BY tt.id
ASC LIMIT #{per_page}
OFFSET #{offset}
SQL
# binding.pry
users = User.find_by_sql(sql)
block_given? ? yield(users) : fetched.concat(users)
# rel = User
# .email_opt_in
# .musicians
# .where("(SELECT COALESCE(MAX(trigger_index),-1) FROM email_batch_sets ebs WHERE ebs.sub_type = '#{self.sub_type}' AND ebs.user_id = users.id) < #{trigger_idx}")
# .where(self.progress_column_constraint)
# .where(self.trigger_date_constraint(trigger_idx))
# .find_in_batches(batch_size: 500) do |users|
# block_given? ? yield(users) : fetched.concat(users)
# end
users = User.find_by_sql(sql)
block_given? ? yield(users) : fetched.concat(users)
end
fetched
end
=begin
SELECT tt.*
FROM (SELECT "users".*,
(SELECT COALESCE(MAX(trigger_index),-1) FROM email_batch_sets ebs WHERE ebs.sub_type = 'client_notdl' AND ebs.user_id = users.id) AS tidx,
(SELECT created_at FROM email_batch_sets ebs WHERE ebs.sub_type = 'client_notdl' AND ebs.user_id = users.id AND trigger_index = 1) AS prev_trigger_date
FROM users) tt
WHERE tt."subscribe_email" = 't' AND tt."musician" = 't' AND (tt.first_downloaded_client_at IS NULL) AND (tt.created_at < '2014-05-05 15:00:25.475491') AND tt.tidx = 2 AND tt.prev_trigger_date >= '2014-05-19 15:00:25.475491'
ORDER BY tt.id ASC LIMIT 500 OFFSET 0;
=end
def deliver_batch_sets!
self.opt_in_count = 0
sent = 0

View File

@ -8,7 +8,7 @@ describe EmailBatch do
describe 'all users' do
before { pending }
# before { pending }
let (:email_batch) { FactoryGirl.create(:email_batch) }
@ -58,9 +58,9 @@ describe EmailBatch do
context 'user progress' do
describe 'one at a time' do
before { pending }
before { pending }
describe 'one at a time' do
let(:batchp) {
FactoryGirl.create(:email_batch_progression, :sub_type => :client_notdl)
@ -79,9 +79,9 @@ describe EmailBatch do
expect(ProgressMailer.deliveries.length).to eq(1)
end
end
describe 'client not downloaded' do
# before { pending }
before { pending }
let(:batchp) {
FactoryGirl.create(:email_batch_progression, :sub_type => :client_notdl)
@ -100,13 +100,11 @@ describe EmailBatch do
end
it 'returns no users' do
pending
user_
expect(batchp.fetch_recipients.count).to eq(0)
end
it 'returns user first trigger' do
pending
user_
expect(batchp.fetch_recipients(0).count).to eq(0)
@ -145,7 +143,6 @@ describe EmailBatch do
end
it 'handles existing users' do
pending
user_existing
expect(batchp.fetch_recipients(0).count).to eq(1)
@ -206,5 +203,22 @@ describe EmailBatch do
end
end
describe 'loop bunch of users' do
let(:batchp) {
FactoryGirl.create(:email_batch_progression, :sub_type => :client_notdl)
}
it 'returns no users' do
users = []
20.times { |nn| users << FactoryGirl.create(:user) }
expect(batchp.fetch_recipients(0,5).count).to eq(0)
dd = users[0].created_at + batchp.days_past_for_trigger_index(0).days
Timecop.travel(dd)
expect(batchp.fetch_recipients(0,5).count).to eq(20)
users.each { |uu| batchp.make_set(uu, 0) }
expect(batchp.fetch_recipients(0,5).count).to eq(0)
end
end
end
end