Unify subscribers without segment queries for listing & export counting
[MAILPOET-3462]
This commit is contained in:
@@ -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'))
|
||||||
|
@@ -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']);
|
||||||
|
Reference in New Issue
Block a user