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

View File

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