Unify subscribers without segment queries for listing & export counting

[MAILPOET-3462]
This commit is contained in:
wxa
2021-03-09 18:00:30 +03:00
committed by Veljko V
parent 19dd9180bd
commit 10bf0d006d
2 changed files with 11 additions and 12 deletions

View File

@@ -13,6 +13,7 @@ use MailPoetVendor\Doctrine\DBAL\Driver\Statement;
use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder; use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder;
use MailPoetVendor\Doctrine\ORM\EntityManager; use MailPoetVendor\Doctrine\ORM\EntityManager;
use MailPoetVendor\Doctrine\ORM\Query\Expr\Join; use MailPoetVendor\Doctrine\ORM\Query\Expr\Join;
use MailPoetVendor\Doctrine\ORM\QueryBuilder as ORMQueryBuilder;
class SegmentSubscribersRepository { class SegmentSubscribersRepository {
/** @var EntityManager */ /** @var EntityManager */
@@ -89,11 +90,17 @@ class SegmentSubscribersRepository {
return (int)$queryBuilder->getQuery()->getSingleScalarResult(); return (int)$queryBuilder->getQuery()->getSingleScalarResult();
} }
public function getSubscribersWithoutSegmentCountQuery(): \MailPoetVendor\Doctrine\ORM\QueryBuilder { public function getSubscribersWithoutSegmentCountQuery(): ORMQueryBuilder {
$queryBuilder = $this->entityManager->createQueryBuilder(); $queryBuilder = $this->entityManager->createQueryBuilder();
return $queryBuilder $queryBuilder
->select('COUNT(DISTINCT s) AS subscribersCount') ->select('COUNT(DISTINCT s) AS subscribersCount')
->from(SubscriberEntity::class, 's') ->from(SubscriberEntity::class, 's');
$this->addConstraintsForSubscribersWithoutSegment($queryBuilder);
return $queryBuilder;
}
public function addConstraintsForSubscribersWithoutSegment(ORMQueryBuilder $queryBuilder): void {
$queryBuilder
->leftJoin('s.subscriberSegments', 'ssg') ->leftJoin('s.subscriberSegments', 'ssg')
->leftJoin('ssg.segment', 'sg') ->leftJoin('ssg.segment', 'sg')
->leftJoin(SubscriberEntity::class, 's2', Join::WITH, (string)$queryBuilder->expr()->eq('s.id', 's2.id')) ->leftJoin(SubscriberEntity::class, 's2', Join::WITH, (string)$queryBuilder->expr()->eq('s.id', 's2.id'))

View File

@@ -130,15 +130,7 @@ class SubscriberListingRepository extends ListingRepository {
return; return;
} }
if ($filters['segment'] === self::FILTER_WITHOUT_LIST) { if ($filters['segment'] === self::FILTER_WITHOUT_LIST) {
$queryBuilder->leftJoin('s.subscriberSegments', 'ssg') $this->segmentSubscribersRepository->addConstraintsForSubscribersWithoutSegment($queryBuilder);
->leftJoin('ssg.segment', 'sg')
->leftJoin(SubscriberEntity::class, 's2', Join::WITH, (string)$queryBuilder->expr()->eq('s.id', 's2.id'))
->leftJoin('s2.subscriberSegments', 'ssg2', Join::WITH, 'ssg2.status = :statusSubscribed AND sg.id <> ssg2.segment')
->leftJoin('ssg2.segment', 'sg2', Join::WITH, (string)$queryBuilder->expr()->isNull('sg2.deletedAt'))
->andWhere('s.deletedAt IS NULL')
->andWhere('(ssg.status != :statusSubscribed OR ssg.id IS NULL OR sg.deletedAt IS NOT NULL)')
->andWhere('sg2.id IS NULL')
->setParameter('statusSubscribed', SubscriberEntity::STATUS_SUBSCRIBED);
return; return;
} }
$segment = $this->entityManager->find(SegmentEntity::class, (int)$filters['segment']); $segment = $this->entityManager->find(SegmentEntity::class, (int)$filters['segment']);