diff --git a/lib/Segments/SegmentSubscribersRepository.php b/lib/Segments/SegmentSubscribersRepository.php index 2d73592cb1..32f1098550 100644 --- a/lib/Segments/SegmentSubscribersRepository.php +++ b/lib/Segments/SegmentSubscribersRepository.php @@ -12,6 +12,7 @@ use MailPoetVendor\Doctrine\DBAL\Connection; use MailPoetVendor\Doctrine\DBAL\Driver\Statement; use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder; use MailPoetVendor\Doctrine\ORM\EntityManager; +use MailPoetVendor\Doctrine\ORM\Query\Expr\Join; class SegmentSubscribersRepository { /** @var EntityManager */ @@ -55,6 +56,23 @@ class SegmentSubscribersRepository { return (int)$result; } + public function getSubscribersWithoutSegmentCount(): int { + $queryBuilder = $this->entityManager->createQueryBuilder(); + return (int)$queryBuilder + ->select('COUNT(DISTINCT s) AS subscribersCount') + ->from(SubscriberEntity::class, 's') + ->leftJoin('s.subscriberSegments', 'ssg') + ->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) + ->getQuery()->getSingleScalarResult(); + } + /** * This method is fetches list of all segments basic data and count of subscribed subscribers. * @return array diff --git a/lib/Subscribers/SubscriberListingRepository.php b/lib/Subscribers/SubscriberListingRepository.php index 2d511295fa..0607968103 100644 --- a/lib/Subscribers/SubscriberListingRepository.php +++ b/lib/Subscribers/SubscriberListingRepository.php @@ -238,20 +238,7 @@ class SubscriberListingRepository extends ListingRepository { $this->applyGroup($queryBuilder, $group); } - $queryBuilderNoSegment = clone $queryBuilder; - $subscribersWithoutSegment = $queryBuilderNoSegment - ->select('COUNT(DISTINCT s) AS subscribersCount') - ->leftJoin('s.subscriberSegments', 'ssg') - ->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) - ->getQuery()->getSingleScalarResult(); - + $subscribersWithoutSegment = $this->segmentSubscribersRepository->getSubscribersWithoutSegmentCount(); $subscribersWithoutSegmentLabel = sprintf( WPFunctions::get()->__('Subscribers without a list (%s)', 'mailpoet'), number_format((float)$subscribersWithoutSegment)