Replace Paris models with Doctrine entities in BatchIterator

[MAILPOET-4357]
This commit is contained in:
Rodrigo Primo
2022-08-02 08:57:56 -03:00
committed by Veljko V
parent ea1bbf7b70
commit d8770675a4
2 changed files with 50 additions and 14 deletions

View File

@@ -7,6 +7,7 @@ use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\ScheduledTaskSubscriberEntity; use MailPoet\Entities\ScheduledTaskSubscriberEntity;
use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberEntity;
use MailPoet\InvalidStateException; use MailPoet\InvalidStateException;
use MailPoetVendor\Doctrine\ORM\QueryBuilder;
/** /**
* @extends Repository<ScheduledTaskSubscriberEntity> * @extends Repository<ScheduledTaskSubscriberEntity>
@@ -53,4 +54,45 @@ class ScheduledTaskSubscribersRepository extends Repository {
$this->flush(); $this->flush();
return $taskSubscriber; return $taskSubscriber;
} }
public function countSubscriberIdsBatchForTask(int $taskId, int $lastProcessedSubscriberId): int {
$queryBuilder = $this->entityManager
->createQueryBuilder()
->select('count(sts.subscriber)');
$queryBuilder = $this->prepareSubscriberIdsBatchForTaskQuery($queryBuilder, $taskId, $lastProcessedSubscriberId);
$countSubscribers = $queryBuilder
->getQuery()
->getSingleScalarResult();
if (is_numeric($countSubscribers)) {
return (int)$countSubscribers;
} else {
return 0;
}
}
public function getSubscriberIdsBatchForTask(int $taskId, int $lastProcessedSubscriberId, int $limit): array {
$queryBuilder = $this->entityManager
->createQueryBuilder()
->select('IDENTITY(sts.subscriber) AS subscriber_id');
$queryBuilder = $this->prepareSubscriberIdsBatchForTaskQuery($queryBuilder, $taskId, $lastProcessedSubscriberId);
$subscribersIds = $queryBuilder
->orderBy('sts.subscriber', 'asc')
->setMaxResults($limit)
->getQuery()
->getSingleColumnResult();
return $subscribersIds;
}
private function prepareSubscriberIdsBatchForTaskQuery(QueryBuilder $queryBuilder, int $taskId, int $lastProcessedSubscriberId): QueryBuilder {
return $queryBuilder
->from(ScheduledTaskSubscriberEntity::class, 'sts')
->andWhere('sts.task = :taskId')
->andWhere('sts.subscriber > :lastProcessedSubscriberId')
->andWhere('sts.processed = :status')
->setParameter('taskId', $taskId)
->setParameter('lastProcessedSubscriberId', $lastProcessedSubscriberId)
->setParameter('status', ScheduledTaskSubscriberEntity::STATUS_UNPROCESSED);
}
} }

View File

@@ -2,7 +2,8 @@
namespace MailPoet\Tasks\Subscribers; namespace MailPoet\Tasks\Subscribers;
use MailPoet\Models\ScheduledTaskSubscriber; use MailPoet\DI\ContainerWrapper;
use MailPoet\Newsletter\Sending\ScheduledTaskSubscribersRepository;
/** /**
* @implements \Iterator<null, array> * @implements \Iterator<null, array>
@@ -13,6 +14,9 @@ class BatchIterator implements \Iterator, \Countable {
private $lastProcessedId = 0; private $lastProcessedId = 0;
private $batchLastId; private $batchLastId;
/** @var ScheduledTaskSubscribersRepository */
private $scheduledTaskSubscribersRepository;
public function __construct( public function __construct(
$taskId, $taskId,
$batchSize $batchSize
@@ -24,6 +28,7 @@ class BatchIterator implements \Iterator, \Countable {
} }
$this->taskId = (int)$taskId; $this->taskId = (int)$taskId;
$this->batchSize = (int)$batchSize; $this->batchSize = (int)$batchSize;
$this->scheduledTaskSubscribersRepository = ContainerWrapper::getInstance()->get(ScheduledTaskSubscribersRepository::class);
} }
public function rewind(): void { public function rewind(): void {
@@ -35,11 +40,7 @@ class BatchIterator implements \Iterator, \Countable {
*/ */
#[\ReturnTypeWillChange] #[\ReturnTypeWillChange]
public function current() { public function current() {
$subscribers = $this->getSubscribers() $subscribers = $this->scheduledTaskSubscribersRepository->getSubscriberIdsBatchForTask($this->taskId, $this->lastProcessedId, $this->batchSize);
->orderByAsc('subscriber_id')
->limit($this->batchSize)
->findArray();
$subscribers = array_column($subscribers, 'subscriber_id');
$this->batchLastId = end($subscribers); $this->batchLastId = end($subscribers);
return $subscribers; return $subscribers;
} }
@@ -61,13 +62,6 @@ class BatchIterator implements \Iterator, \Countable {
} }
public function count(): int { public function count(): int {
return $this->getSubscribers()->count(); return $this->scheduledTaskSubscribersRepository->countSubscriberIdsBatchForTask($this->taskId, $this->lastProcessedId);
}
private function getSubscribers() {
return ScheduledTaskSubscriber::select('subscriber_id')
->where('task_id', $this->taskId)
->whereGt('subscriber_id', $this->lastProcessedId)
->where('processed', ScheduledTaskSubscriber::STATUS_UNPROCESSED);
} }
} }