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

View File

@@ -73,14 +73,11 @@ class SendingQueuesRepository extends Repository {
return $queryBuilder->getQuery()->getOneOrNullResult();
}
public function countAllByNewsletterAndTaskStatus(NewsletterEntity $newsletter, string $status): int {
public function countAllToProcessByNewsletter(NewsletterEntity $newsletter): int {
return intval($this->entityManager->createQueryBuilder()
->select('count(s.task)')
->select('sum(s.countToProcess)')
->from(SendingQueueEntity::class, 's')
->join('s.task', 't')
->where('t.status = :status')
->andWhere('s.newsletter = :newsletter')
->setParameter('status', $status)
->setParameter('newsletter', $newsletter)
->getQuery()
->getSingleScalarResult());
@@ -141,21 +138,21 @@ class SendingQueuesRepository extends Repository {
return $this->doctrineRepository->createQueryBuilder('q')
->select('
n.type as newsletterType,
q.meta as sendingQueueMeta,
CASE
n.type as newsletterType,
q.meta as sendingQueueMeta,
CASE
WHEN COUNT(s.id) > 0 THEN true
ELSE false
END as sentToSegment,
CASE
CASE
WHEN t.processedAt >= :sevenDaysAgo THEN true
ELSE false
END as sentLast7Days,
CASE
CASE
WHEN t.processedAt >= :thirtyDaysAgo THEN true
ELSE false
END as sentLast30Days,
CASE
CASE
WHEN t.processedAt >= :threeMonthsAgo THEN true
ELSE false
END as sentLast3Months')

View File

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

View File

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

View File

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