From 5d88f022168d332f72ea38e51430ce2bc22d4b98 Mon Sep 17 00:00:00 2001 From: alex-mailpoet Date: Thu, 29 Jun 2023 23:19:25 +0300 Subject: [PATCH] Replace multiple subscriber update queries with one in sending loop [MAILPOET-5178] --- mailpoet/lib/Tasks/Subscribers.php | 12 +++++++----- mailpoet/tests/integration/Tasks/SendingTest.php | 13 ++++++++++++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/mailpoet/lib/Tasks/Subscribers.php b/mailpoet/lib/Tasks/Subscribers.php index 9215dd4994..9554da888d 100644 --- a/mailpoet/lib/Tasks/Subscribers.php +++ b/mailpoet/lib/Tasks/Subscribers.php @@ -37,11 +37,13 @@ class Subscribers { public function updateProcessedSubscribers(array $processedSubscribers) { if (!empty($processedSubscribers)) { - $this->getSubscribers() - ->whereIn('subscriber_id', $processedSubscribers) - ->findResultSet() - ->set('processed', ScheduledTaskSubscriber::STATUS_PROCESSED) - ->save(); + ScheduledTaskSubscriber::rawExecute(sprintf( + 'UPDATE %1$s SET processed = %2$s WHERE task_id = %3$s AND subscriber_id IN (%4$s)', + ScheduledTaskSubscriber::$_table, + ScheduledTaskSubscriber::STATUS_PROCESSED, + $this->task->id, + join(', ', array_map('intval', $processedSubscribers)) + )); } $this->checkCompleted(); } diff --git a/mailpoet/tests/integration/Tasks/SendingTest.php b/mailpoet/tests/integration/Tasks/SendingTest.php index 4fbe9d4e7c..39729d9815 100644 --- a/mailpoet/tests/integration/Tasks/SendingTest.php +++ b/mailpoet/tests/integration/Tasks/SendingTest.php @@ -143,12 +143,19 @@ class SendingTest extends \MailPoetTest { } public function testItUpdatesProcessedSubscribers() { + $subscriberId = 456; + $taskSubscriber = $this->getTaskSubscriber($this->task->id, $subscriberId); + expect($taskSubscriber->processed)->equals(ScheduledTaskSubscriber::STATUS_UNPROCESSED); + expect($this->sending->count_to_process)->equals(2); expect($this->sending->count_processed)->equals(0); - $subscriberIds = [456]; + $subscriberIds = [$subscriberId]; $this->sending->updateProcessedSubscribers($subscriberIds); expect($this->sending->count_to_process)->equals(1); expect($this->sending->count_processed)->equals(1); + + $taskSubscriber = $this->getTaskSubscriber($this->task->id, $subscriberId); + expect($taskSubscriber->processed)->equals(ScheduledTaskSubscriber::STATUS_PROCESSED); } public function testItGetsScheduledQueues() { @@ -271,4 +278,8 @@ class SendingTest extends \MailPoetTest { $sending->scheduledAt = Carbon::createFromTimestamp(WPFunctions::get()->currentTime('timestamp'))->subHours(1); return $sending->save(); } + + private function getTaskSubscriber($taskId, $subscriberId) { + return ScheduledTaskSubscriber::where(['task_id' => $taskId, 'subscriber_id' => $subscriberId])->findOne(); + } }