Move the query to calculate the max subscriber ID to SubscribersRepository

[MAILPOET-4344]
This commit is contained in:
Rodrigo Primo
2022-07-28 15:42:11 -03:00
committed by Veljko V
parent 0f7a3c3e00
commit af396021db
3 changed files with 27 additions and 17 deletions

View File

@ -3,11 +3,10 @@
namespace MailPoet\Cron\Workers; namespace MailPoet\Cron\Workers;
use MailPoet\Entities\ScheduledTaskEntity; use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Settings\TrackingConfig; use MailPoet\Settings\TrackingConfig;
use MailPoet\Subscribers\InactiveSubscribersController; use MailPoet\Subscribers\InactiveSubscribersController;
use MailPoetVendor\Doctrine\ORM\EntityManager; use MailPoet\Subscribers\SubscribersRepository;
class InactiveSubscribers extends SimpleWorker { class InactiveSubscribers extends SimpleWorker {
const TASK_TYPE = 'inactive_subscribers'; const TASK_TYPE = 'inactive_subscribers';
@ -23,19 +22,19 @@ class InactiveSubscribers extends SimpleWorker {
/** @var TrackingConfig */ /** @var TrackingConfig */
private $trackingConfig; private $trackingConfig;
/** @var EntityManager */ /** @var SubscribersRepository */
private $entityManager; private $subscribersRepository;
public function __construct( public function __construct(
InactiveSubscribersController $inactiveSubscribersController, InactiveSubscribersController $inactiveSubscribersController,
SettingsController $settings, SettingsController $settings,
TrackingConfig $trackingConfig, TrackingConfig $trackingConfig,
EntityManager $entityManager SubscribersRepository $subscribersRepository
) { ) {
$this->inactiveSubscribersController = $inactiveSubscribersController; $this->inactiveSubscribersController = $inactiveSubscribersController;
$this->settings = $settings; $this->settings = $settings;
$this->trackingConfig = $trackingConfig; $this->trackingConfig = $trackingConfig;
$this->entityManager = $entityManager; $this->subscribersRepository = $subscribersRepository;
parent::__construct(); parent::__construct();
} }
@ -58,11 +57,7 @@ class InactiveSubscribers extends SimpleWorker {
if (isset($meta['max_subscriber_id'])) { if (isset($meta['max_subscriber_id'])) {
$maxSubscriberId = $meta['max_subscriber_id']; $maxSubscriberId = $meta['max_subscriber_id'];
} else { } else {
$maxSubscriberId = $this->entityManager->createQueryBuilder() $maxSubscriberId = $this->subscribersRepository->getMaxSubscriberId();
->select('MAX(s.id)')
->from(SubscriberEntity::class, 's')
->getQuery()
->getSingleScalarResult();
} }
while ($lastSubscriberId <= $maxSubscriberId) { while ($lastSubscriberId <= $maxSubscriberId) {

View File

@ -362,4 +362,14 @@ class SubscribersRepository extends Repository {
->getQuery() ->getQuery()
->getArrayResult(); ->getArrayResult();
} }
public function getMaxSubscriberId(): int {
$maxSubscriberId = $this->entityManager->createQueryBuilder()
->select('MAX(s.id)')
->from(SubscriberEntity::class, 's')
->getQuery()
->getSingleScalarResult();
return is_int($maxSubscriberId) ? $maxSubscriberId : 0;
}
} }

View File

@ -11,6 +11,7 @@ use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Settings\TrackingConfig; use MailPoet\Settings\TrackingConfig;
use MailPoet\Subscribers\InactiveSubscribersController; use MailPoet\Subscribers\InactiveSubscribersController;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Carbon\Carbon;
class InactiveSubscribersTest extends \MailPoetTest { class InactiveSubscribersTest extends \MailPoetTest {
@ -22,12 +23,16 @@ class InactiveSubscribersTest extends \MailPoetTest {
/** @var ScheduledTasksRepository */ /** @var ScheduledTasksRepository */
private $scheduledTasksRepository; private $scheduledTasksRepository;
/** @var SubscribersRepository */
private $subscribersRepository;
public function _before() { public function _before() {
$this->settings = SettingsController::getInstance(); $this->settings = SettingsController::getInstance();
$this->scheduledTasksRepository = $this->diContainer->get(ScheduledTasksRepository::class); $this->scheduledTasksRepository = $this->diContainer->get(ScheduledTasksRepository::class);
$this->truncateEntity(ScheduledTaskEntity::class); $this->truncateEntity(ScheduledTaskEntity::class);
$this->settings->set('tracking.level', TrackingConfig::LEVEL_PARTIAL); $this->settings->set('tracking.level', TrackingConfig::LEVEL_PARTIAL);
$this->cronHelper = ContainerWrapper::getInstance()->get(CronHelper::class); $this->cronHelper = ContainerWrapper::getInstance()->get(CronHelper::class);
$this->subscribersRepository = ContainerWrapper::getInstance()->get(SubscribersRepository::class);
parent::_before(); parent::_before();
} }
@ -39,7 +44,7 @@ class InactiveSubscribersTest extends \MailPoetTest {
'reactivateInactiveSubscribers' => Stub\Expected::once(), 'reactivateInactiveSubscribers' => Stub\Expected::once(),
], $this); ], $this);
$worker = new InactiveSubscribers($controllerMock, $this->settings, $this->diContainer->get(TrackingConfig::class), $this->entityManager); $worker = new InactiveSubscribers($controllerMock, $this->settings, $this->diContainer->get(TrackingConfig::class), $this->subscribersRepository);
$worker->processTaskStrategy(new ScheduledTaskEntity(), microtime(true)); $worker->processTaskStrategy(new ScheduledTaskEntity(), microtime(true));
$task = $this->scheduledTasksRepository->findOneBy( $task = $this->scheduledTasksRepository->findOneBy(
@ -60,7 +65,7 @@ class InactiveSubscribersTest extends \MailPoetTest {
'reactivateInactiveSubscribers' => Stub\Expected::never(), 'reactivateInactiveSubscribers' => Stub\Expected::never(),
], $this); ], $this);
$worker = new InactiveSubscribers($controllerMock, $this->settings, $this->diContainer->get(TrackingConfig::class), $this->entityManager); $worker = new InactiveSubscribers($controllerMock, $this->settings, $this->diContainer->get(TrackingConfig::class), $this->subscribersRepository);
$worker->processTaskStrategy(new ScheduledTaskEntity(), microtime(true)); $worker->processTaskStrategy(new ScheduledTaskEntity(), microtime(true));
} }
@ -72,7 +77,7 @@ class InactiveSubscribersTest extends \MailPoetTest {
'reactivateInactiveSubscribers' => Stub\Expected::never(), 'reactivateInactiveSubscribers' => Stub\Expected::never(),
], $this); ], $this);
$worker = new InactiveSubscribers($controllerMock, $this->settings, $this->diContainer->get(TrackingConfig::class), $this->entityManager); $worker = new InactiveSubscribers($controllerMock, $this->settings, $this->diContainer->get(TrackingConfig::class), $this->subscribersRepository);
$worker->processTaskStrategy(new ScheduledTaskEntity(), microtime(true)); $worker->processTaskStrategy(new ScheduledTaskEntity(), microtime(true));
$task = $this->scheduledTasksRepository->findOneBy( $task = $this->scheduledTasksRepository->findOneBy(
@ -92,7 +97,7 @@ class InactiveSubscribersTest extends \MailPoetTest {
'reactivateInactiveSubscribers' => Stub\Expected::never(), 'reactivateInactiveSubscribers' => Stub\Expected::never(),
], $this); ], $this);
$worker = new InactiveSubscribers($controllerMock, $this->settings, $this->diContainer->get(TrackingConfig::class), $this->entityManager); $worker = new InactiveSubscribers($controllerMock, $this->settings, $this->diContainer->get(TrackingConfig::class), $this->subscribersRepository);
$task = new ScheduledTaskEntity(); $task = new ScheduledTaskEntity();
$task->setMeta(['max_subscriber_id' => 2001 /* 3 iterations of BATCH_SIZE in markInactiveSubscribers */]); $task->setMeta(['max_subscriber_id' => 2001 /* 3 iterations of BATCH_SIZE in markInactiveSubscribers */]);
$this->entityManager->persist($task); $this->entityManager->persist($task);
@ -113,7 +118,7 @@ class InactiveSubscribersTest extends \MailPoetTest {
$task = new ScheduledTaskEntity(); $task = new ScheduledTaskEntity();
$worker = new InactiveSubscribers($controllerMock, $this->settings, $this->diContainer->get(TrackingConfig::class), $this->entityManager); $worker = new InactiveSubscribers($controllerMock, $this->settings, $this->diContainer->get(TrackingConfig::class), $this->subscribersRepository);
$worker->processTaskStrategy($task, microtime(true)); $worker->processTaskStrategy($task, microtime(true));
$meta = $task->getMeta(); $meta = $task->getMeta();
@ -128,7 +133,7 @@ class InactiveSubscribersTest extends \MailPoetTest {
'reactivateInactiveSubscribers' => Stub\Expected::never(), 'reactivateInactiveSubscribers' => Stub\Expected::never(),
], $this); ], $this);
$worker = new InactiveSubscribers($controllerMock, $this->settings, $this->diContainer->get(TrackingConfig::class), $this->entityManager); $worker = new InactiveSubscribers($controllerMock, $this->settings, $this->diContainer->get(TrackingConfig::class), $this->subscribersRepository);
$this->expectException(\Exception::class); $this->expectException(\Exception::class);
$this->expectExceptionMessage('Maximum execution time has been reached.'); $this->expectExceptionMessage('Maximum execution time has been reached.');
$worker->processTaskStrategy(new ScheduledTaskEntity(), microtime(true) - $this->cronHelper->getDaemonExecutionLimit()); $worker->processTaskStrategy(new ScheduledTaskEntity(), microtime(true) - $this->cronHelper->getDaemonExecutionLimit());