Replace join query with a simple query

[MAILPOET-6148]
This commit is contained in:
Pavel Dohnal
2024-07-19 11:37:12 +02:00
committed by Jan Jakeš
parent a9b7e5210c
commit dec9a02ca4
5 changed files with 22 additions and 23 deletions

View File

@@ -101,9 +101,8 @@ class NewslettersResponseBuilder {
$data['children_count'] = $this->newslettersStatsRepository->getChildrenCount($newsletter); $data['children_count'] = $this->newslettersStatsRepository->getChildrenCount($newsletter);
} }
if ($relation === self::RELATION_SCHEDULED) { if ($relation === self::RELATION_SCHEDULED) {
$data['total_scheduled'] = $this->sendingQueuesRepository->countAllByNewsletterAndTaskStatus( $data['total_scheduled'] = $this->sendingQueuesRepository->countAllToProcessByNewsletter(
$newsletter, $newsletter
SendingQueueEntity::STATUS_SCHEDULED
); );
} }
@@ -170,9 +169,8 @@ class NewslettersResponseBuilder {
$data['segments'] = []; $data['segments'] = [];
$data['options'] = $this->buildOptions($newsletter); $data['options'] = $this->buildOptions($newsletter);
$data['total_sent'] = $statistics ? $statistics->getTotalSentCount() : 0; $data['total_sent'] = $statistics ? $statistics->getTotalSentCount() : 0;
$data['total_scheduled'] = $this->sendingQueuesRepository->countAllByNewsletterAndTaskStatus( $data['total_scheduled'] = $this->sendingQueuesRepository->countAllToProcessByNewsletter(
$newsletter, $newsletter
SendingQueueEntity::STATUS_SCHEDULED
); );
} elseif ($newsletter->getType() === NewsletterEntity::TYPE_NOTIFICATION) { } elseif ($newsletter->getType() === NewsletterEntity::TYPE_NOTIFICATION) {
$data['segments'] = $this->buildSegments($newsletter); $data['segments'] = $this->buildSegments($newsletter);

View File

@@ -73,14 +73,11 @@ class SendingQueuesRepository extends Repository {
return $queryBuilder->getQuery()->getOneOrNullResult(); return $queryBuilder->getQuery()->getOneOrNullResult();
} }
public function countAllByNewsletterAndTaskStatus(NewsletterEntity $newsletter, string $status): int { public function countAllToProcessByNewsletter(NewsletterEntity $newsletter): int {
return intval($this->entityManager->createQueryBuilder() return intval($this->entityManager->createQueryBuilder()
->select('count(s.task)') ->select('sum(s.countToProcess)')
->from(SendingQueueEntity::class, 's') ->from(SendingQueueEntity::class, 's')
->join('s.task', 't')
->where('t.status = :status')
->andWhere('s.newsletter = :newsletter') ->andWhere('s.newsletter = :newsletter')
->setParameter('status', $status)
->setParameter('newsletter', $newsletter) ->setParameter('newsletter', $newsletter)
->getQuery() ->getQuery()
->getSingleScalarResult()); ->getSingleScalarResult());

View File

@@ -506,9 +506,12 @@ class Newsletter {
if ($queue['processed_at'] ?? null) { if ($queue['processed_at'] ?? null) {
$scheduledTask->setProcessedAt($queue['processed_at']); $scheduledTask->setProcessedAt($queue['processed_at']);
} }
if ($queue['meta']) { if (isset($queue['meta'])) {
$sendingQueue->setMeta($queue['meta']); $sendingQueue->setMeta($queue['meta']);
} }
if (isset($queue['count_to_process'])) {
$sendingQueue->setCountToProcess($queue['count_to_process']);
}
$entityManager->persist($sendingQueue); $entityManager->persist($sendingQueue);
$sendingQueue->setNewsletter($newsletter); $sendingQueue->setNewsletter($newsletter);
$scheduledTask->setStatus($queue['status']); $scheduledTask->setStatus($queue['status']);

View File

@@ -89,7 +89,7 @@ class AutomationListingCest {
->withWelcomeTypeForSegment() ->withWelcomeTypeForSegment()
->withCreatedAt('2020-01-20 12:00:00') ->withCreatedAt('2020-01-20 12:00:00')
->withActiveStatus() ->withActiveStatus()
->withScheduledQueue() ->withScheduledQueue(['count_to_process' => 2])
->withScheduledQueue() ->withScheduledQueue()
->withScheduledQueue(['status' => ScheduledTaskEntity::STATUS_COMPLETED, 'count_processed' => 1]) ->withScheduledQueue(['status' => ScheduledTaskEntity::STATUS_COMPLETED, 'count_processed' => 1])
->create(); ->create();

View File

@@ -91,7 +91,7 @@ class SendingQueuesRepositoryTest extends \MailPoetTest {
verify($newsletter->getStatus())->equals(NewsletterEntity::STATUS_SENDING); verify($newsletter->getStatus())->equals(NewsletterEntity::STATUS_SENDING);
} }
public function testItReturnsCountOfQueuesByNewsletterAndTaskStatus() { public function testItReturnsCountOfQueuesByNewsletter() {
$taskStatus = ScheduledTaskEntity::STATUS_PAUSED; $taskStatus = ScheduledTaskEntity::STATUS_PAUSED;
$task1 = $this->createTask(); $task1 = $this->createTask();
@@ -105,13 +105,13 @@ class SendingQueuesRepositoryTest extends \MailPoetTest {
$task3 = $this->createTask(); $task3 = $this->createTask();
$task3->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED); $task3->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED);
$this->createQueue($task3, $newsletter); $queue3 = $this->createQueue($task3, $newsletter);
$queue3->setCountToProcess(5);
$this->entityManager->flush(); $this->entityManager->flush();
$this->assertInstanceOf(NewsletterEntity::class, $newsletter); $this->assertInstanceOf(NewsletterEntity::class, $newsletter);
// should return the two queues with tasks of the type STATUS_PAUSED and exclude the queue with task of the type STATUS_SCHEDULED $this->assertSame(7, $this->repository->countAllToProcessByNewsletter($newsletter));
$this->assertSame(2, $this->repository->countAllByNewsletterAndTaskStatus($newsletter, $taskStatus));
} }
private function createTaskSubscriber(ScheduledTaskEntity $task, SubscriberEntity $subscriber, int $processed) { private function createTaskSubscriber(ScheduledTaskEntity $task, SubscriberEntity $subscriber, int $processed) {
@@ -140,6 +140,7 @@ class SendingQueuesRepositoryTest extends \MailPoetTest {
$queue = new SendingQueueEntity(); $queue = new SendingQueueEntity();
$queue->setNewsletter($newsletter); $queue->setNewsletter($newsletter);
$queue->setTask($task); $queue->setTask($task);
$queue->setCountToProcess(1);
$this->entityManager->persist($queue); $this->entityManager->persist($queue);
return $queue; return $queue;