Move prefetch newsletter methods to repository

[MAILPOET-2946]
This commit is contained in:
Jan Lysý
2020-10-19 16:01:09 +02:00
committed by Veljko V
parent a4dcec49c7
commit 4843c124ef
2 changed files with 32 additions and 26 deletions

View File

@ -6,6 +6,7 @@ use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Models\SendingQueue; use MailPoet\Models\SendingQueue;
use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Newsletter\Statistics\NewsletterStatistics; use MailPoet\Newsletter\Statistics\NewsletterStatistics;
use MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository; use MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository;
use MailPoet\Newsletter\Url as NewsletterUrl; use MailPoet\Newsletter\Url as NewsletterUrl;
@ -25,14 +26,19 @@ class NewslettersResponseBuilder {
/** @var NewsletterStatisticsRepository */ /** @var NewsletterStatisticsRepository */
private $newslettersStatsRepository; private $newslettersStatsRepository;
/** @var NewslettersRepository */
private $newslettersRepository;
/** @var EntityManager */ /** @var EntityManager */
private $entityManager; private $entityManager;
public function __construct( public function __construct(
EntityManager $entityManager, EntityManager $entityManager,
NewslettersRepository $newslettersRepository,
NewsletterStatisticsRepository $newslettersStatsRepository NewsletterStatisticsRepository $newslettersStatsRepository
) { ) {
$this->newslettersStatsRepository = $newslettersStatsRepository; $this->newslettersStatsRepository = $newslettersStatsRepository;
$this->newslettersRepository = $newslettersRepository;
$this->entityManager = $entityManager; $this->entityManager = $entityManager;
} }
@ -93,8 +99,8 @@ class NewslettersResponseBuilder {
public function buildForListing(array $newsletters): array { public function buildForListing(array $newsletters): array {
$statistics = $this->newslettersStatsRepository->getBatchStatistics($newsletters); $statistics = $this->newslettersStatsRepository->getBatchStatistics($newsletters);
$latestQueues = $this->getBatchLatestQueuesWithTasks($newsletters); $latestQueues = $this->getBatchLatestQueuesWithTasks($newsletters);
$this->prefetchOptions($newsletters); $this->newslettersRepository->prefetchOptions($newsletters);
$this->prefetchSegments($newsletters); $this->newslettersRepository->prefetchSegments($newsletters);
$data = []; $data = [];
foreach ($newsletters as $newsletter) { foreach ($newsletters as $newsletter) {
@ -255,28 +261,4 @@ class NewslettersResponseBuilder {
} }
return $latestQueues; return $latestQueues;
} }
private function prefetchOptions(array $newsletters) {
$this->entityManager->createQueryBuilder()
->select('PARTIAL n.{id}, o, opf')
->from(NewsletterEntity::class, 'n')
->join('n.options', 'o')
->join('o.optionField', 'opf')
->where('n.id IN (:newsletters)')
->setParameter('newsletters', $newsletters)
->getQuery()
->getResult();
}
private function prefetchSegments(array $newsletters) {
$this->entityManager->createQueryBuilder()
->select('PARTIAL n.{id}, ns, s')
->from(NewsletterEntity::class, 'n')
->join('n.newsletterSegments', 'ns')
->join('ns.segment', 's')
->where('n.id IN (:newsletters)')
->setParameter('newsletters', $newsletters)
->getQuery()
->getResult();
}
} }

View File

@ -322,6 +322,30 @@ class NewslettersRepository extends Repository {
return count($ids); return count($ids);
} }
public function prefetchOptions(array $newsletters) {
$this->entityManager->createQueryBuilder()
->select('PARTIAL n.{id}, o, opf')
->from(NewsletterEntity::class, 'n')
->join('n.options', 'o')
->join('o.optionField', 'opf')
->where('n.id IN (:newsletters)')
->setParameter('newsletters', $newsletters)
->getQuery()
->getResult();
}
public function prefetchSegments(array $newsletters) {
$this->entityManager->createQueryBuilder()
->select('PARTIAL n.{id}, ns, s')
->from(NewsletterEntity::class, 'n')
->join('n.newsletterSegments', 'ns')
->join('ns.segment', 's')
->where('n.id IN (:newsletters)')
->setParameter('newsletters', $newsletters)
->getQuery()
->getResult();
}
private function fetchChildrenIds(array $parentIds) { private function fetchChildrenIds(array $parentIds) {
$ids = $this->entityManager->createQueryBuilder()->select('n.id') $ids = $this->entityManager->createQueryBuilder()->select('n.id')
->from(NewsletterEntity::class, 'n') ->from(NewsletterEntity::class, 'n')