Fixes in selection of subscribers
This commit is contained in:
		
							parent
							
								
									01d1a903a2
								
							
						
					
					
						commit
						89eabea0de
					
				
					 3 changed files with 24 additions and 20 deletions
				
			
		| 
						 | 
				
			
			@ -318,7 +318,7 @@ export default class Status extends Component {
 | 
			
		|||
        // The periodic task runs all the time, so that we don't have to worry about starting/stopping it as a reaction to the buttons.
 | 
			
		||||
        await this.refreshEntity();
 | 
			
		||||
        if (this.refreshTimeoutHandler) { // For some reason the task gets rescheduled if server is restarted while the page is shown. That why we have this check here.
 | 
			
		||||
            this.refreshTimeoutId = setTimeout(this.refreshTimeoutHandler, 2000);
 | 
			
		||||
            this.refreshTimeoutId = setTimeout(this.refreshTimeoutHandler, 10000);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -101,11 +101,9 @@ async function listTestUsersDTAjax(context, campaignId, params) {
 | 
			
		|||
        This is supposed to produce queries like this:
 | 
			
		||||
 | 
			
		||||
        select * from (
 | 
			
		||||
          (select `subscription__1`.`email`, 2 AS campaign_list_id, 1 AS list, NULL AS segment from `subscription__1` left join `campaign_messages` on
 | 
			
		||||
            `campaign_messages`.`subscription` = `subscription__1`.`id` where `subscription__1`.`status` = 1 and `subscription__1`.`is_test` = true)
 | 
			
		||||
          (select `subscription__1`.`email`, 2 AS campaign_list_id, 1 AS list, NULL AS segment from `subscription__1` where `subscription__1`.`status` = 1 and `subscription__1`.`is_test` = true)
 | 
			
		||||
        UNION ALL
 | 
			
		||||
          (select `subscription__2`.`email`, 4 AS campaign_list_id, 2 AS list, NULL AS segment from `subscription__2` left join `campaign_messages` on
 | 
			
		||||
          `campaign_messages`.`subscription` = `subscription__2`.`id` where `subscription__2`.`status` = 1 and `subscription__2`.`is_test` = true)
 | 
			
		||||
          (select `subscription__2`.`email`, 4 AS campaign_list_id, 2 AS list, NULL AS segment from `subscription__2` where `subscription__2`.`status` = 1 and `subscription__2`.`is_test` = true)
 | 
			
		||||
        ) as `test_subscriptions` inner join `lists` on `test_subscriptions`.`list` = `lists`.`id` inner join `segments` on `test_subscriptions`.`segment` = `segments`.`id`
 | 
			
		||||
          inner join `namespaces` on `lists`.`namespace` = `namespaces`.`id`
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -573,16 +571,17 @@ async function getSubscribersQueryGeneratorTx(tx, campaignId, onlyUnsent, batchS
 | 
			
		|||
    /*
 | 
			
		||||
    This is supposed to produce queries like this:
 | 
			
		||||
 | 
			
		||||
    select count(*) as `subscriptionsToSend` from `campaign_lists` inner join (
 | 
			
		||||
    select ... from `campaign_lists` inner join (
 | 
			
		||||
        select `email`, min(`campaign_list_id`) as `campaign_list_id`, max(`sent`) as `sent` from (
 | 
			
		||||
            (select `subscription__1`.`email`, 2 AS campaign_list_id, campaign_messages.id IS NOT NULL AS sent from `subscription__1` left join `campaign_messages` on
 | 
			
		||||
            `campaign_messages`.`subscription` = `subscription__1`.`id` where `campaign_messages`.`campaign` = 1 and `campaign_messages`.`list` = 1 and `subscription__1`.`status` = 1)
 | 
			
		||||
         UNION ALL
 | 
			
		||||
            (select `subscription__2`.`email`, 4 AS campaign_list_id, campaign_messages.id IS NOT NULL AS sent from `subscription__2` left join `campaign_messages` on
 | 
			
		||||
            `campaign_messages`.`subscription` = `subscription__2`.`id` where `campaign_messages`.`campaign` = 1 and `campaign_messages`.`list` = 2 and `subscription__2`.`status` = 1)
 | 
			
		||||
         )
 | 
			
		||||
         as `pending_subscriptions_all` where `sent` = false group by `email`
 | 
			
		||||
     ) as `pending_subscriptions` on `campaign_lists`.`id` = `pending_subscriptions`.`campaign_list_id` where `campaign_lists`.`campaign` = 1 limit 1
 | 
			
		||||
            (select `subscription__2`.`email`, 8 AS campaign_list_id, related_campaign_messages.id IS NOT NULL AS sent from `subscription__2` left join
 | 
			
		||||
                (select * from `campaign_messages` where `campaign_messages`.`campaign` = 1 and `campaign_messages`.`list` = 2)
 | 
			
		||||
                    as `related_campaign_messages` on `related_campaign_messages`.`subscription` = `subscription__2`.`id` where `subscription__2`.`status` = 1)
 | 
			
		||||
            UNION ALL
 | 
			
		||||
            (select `subscription__1`.`email`, 9 AS campaign_list_id, related_campaign_messages.id IS NOT NULL AS sent from `subscription__1` left join
 | 
			
		||||
                (select * from `campaign_messages` where `campaign_messages`.`campaign` = 1 and `campaign_messages`.`list` = 1)
 | 
			
		||||
                    as `related_campaign_messages` on `related_campaign_messages`.`subscription` = `subscription__1`.`id` where `subscription__1`.`status` = 1)
 | 
			
		||||
        ) as `pending_subscriptions_all` where `sent` = false group by `email`)
 | 
			
		||||
            as `pending_subscriptions` on `campaign_lists`.`id` = `pending_subscriptions`.`campaign_list_id` where `campaign_lists`.`campaign` = '1'
 | 
			
		||||
 | 
			
		||||
     This was too much for Knex, so we partially construct these queries directly as strings;
 | 
			
		||||
     */
 | 
			
		||||
| 
						 | 
				
			
			@ -595,14 +594,19 @@ async function getSubscribersQueryGeneratorTx(tx, campaignId, onlyUnsent, batchS
 | 
			
		|||
        const subsTable = subscriptions.getSubscriptionTableName(cpgList.list);
 | 
			
		||||
 | 
			
		||||
        const sqlQry = knex.from(subsTable)
 | 
			
		||||
            .leftJoin('campaign_messages', 'campaign_messages.subscription', subsTable + '.id')
 | 
			
		||||
            .where('campaign_messages.campaign', cpgList.campaign)
 | 
			
		||||
            .where('campaign_messages.list', cpgList.list)
 | 
			
		||||
            .leftJoin(
 | 
			
		||||
                function () {
 | 
			
		||||
                    return this.from('campaign_messages')
 | 
			
		||||
                        .where('campaign_messages.campaign', cpgList.campaign)
 | 
			
		||||
                        .where('campaign_messages.list', cpgList.list)
 | 
			
		||||
                        .as('related_campaign_messages');
 | 
			
		||||
                },
 | 
			
		||||
                'related_campaign_messages.subscription', subsTable + '.id')
 | 
			
		||||
            .where(subsTable + '.status', SubscriptionStatus.SUBSCRIBED)
 | 
			
		||||
            .where(function() {
 | 
			
		||||
                addSegmentQuery(this);
 | 
			
		||||
            })
 | 
			
		||||
            .select([subsTable + '.email', knex.raw('? AS campaign_list_id', [cpgList.id]), knex.raw('campaign_messages.id IS NOT NULL AS sent')])
 | 
			
		||||
            .select([subsTable + '.email', knex.raw('? AS campaign_list_id', [cpgList.id]), knex.raw('related_campaign_messages.id IS NOT NULL AS sent')])
 | 
			
		||||
            .toSQL().toNative();
 | 
			
		||||
 | 
			
		||||
        subsQrys.push(sqlQry);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ const workerBatchSize = 100;
 | 
			
		|||
const messageQueue = new Map(); // campaignId -> [{listId, email}]
 | 
			
		||||
const messageQueueCont = new Map(); // campaignId -> next batch callback
 | 
			
		||||
 | 
			
		||||
const workerSchedulerCont = null;
 | 
			
		||||
let workerSchedulerCont = null;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function messagesProcessed(workerId) {
 | 
			
		||||
| 
						 | 
				
			
			@ -202,7 +202,7 @@ async function spawnWorker(workerId) {
 | 
			
		|||
                    return resolve();
 | 
			
		||||
 | 
			
		||||
                } else if (msg.type === 'messages-processed') {
 | 
			
		||||
                    messageProcessed(workerId);
 | 
			
		||||
                    messagesProcessed(workerId);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue