Fix getting subscribers without a list
[MAILPOET-3285]
This commit is contained in:
@ -30,7 +30,7 @@ abstract class ListingRepository {
|
|||||||
$this->applyFromClause($queryBuilder);
|
$this->applyFromClause($queryBuilder);
|
||||||
$this->applyConstraints($queryBuilder, $definition);
|
$this->applyConstraints($queryBuilder, $definition);
|
||||||
$alias = $queryBuilder->getRootAliases()[0];
|
$alias = $queryBuilder->getRootAliases()[0];
|
||||||
$queryBuilder->select("COUNT($alias)");
|
$queryBuilder->select("COUNT(DISTINCT $alias)");
|
||||||
return (int)$queryBuilder->getQuery()->getSingleScalarResult();
|
return (int)$queryBuilder->getQuery()->getSingleScalarResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,10 +130,14 @@ 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', Join::WITH, (string)$queryBuilder->expr()->eq('ssg.status', ':statusSubscribed'))
|
$queryBuilder->leftJoin('s.subscriberSegments', 'ssg')
|
||||||
->leftJoin('ssg.segment', 'sg', Join::WITH, (string)$queryBuilder->expr()->isNull('sg.deletedAt'))
|
->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('s.deletedAt IS NULL')
|
||||||
->andWhere('sg.id 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);
|
->setParameter('statusSubscribed', SubscriberEntity::STATUS_SUBSCRIBED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -236,11 +240,15 @@ class SubscriberListingRepository extends ListingRepository {
|
|||||||
|
|
||||||
$queryBuilderNoSegment = clone $queryBuilder;
|
$queryBuilderNoSegment = clone $queryBuilder;
|
||||||
$subscribersWithoutSegment = $queryBuilderNoSegment
|
$subscribersWithoutSegment = $queryBuilderNoSegment
|
||||||
->select('COUNT(s) AS subscribersCount')
|
->select('COUNT(DISTINCT s) AS subscribersCount')
|
||||||
->leftJoin('s.subscriberSegments', 'ssg', Join::WITH, (string)$queryBuilderNoSegment->expr()->eq('ssg.status', ':statusSubscribed'))
|
->leftJoin('s.subscriberSegments', 'ssg')
|
||||||
->leftJoin('ssg.segment', 'sg', Join::WITH, (string)$queryBuilderNoSegment->expr()->isNull('sg.deletedAt'))
|
->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('s.deletedAt IS NULL')
|
||||||
->andWhere('sg.id 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)
|
->setParameter('statusSubscribed', SubscriberEntity::STATUS_SUBSCRIBED)
|
||||||
->getQuery()->getSingleScalarResult();
|
->getQuery()->getSingleScalarResult();
|
||||||
|
|
||||||
|
@ -257,6 +257,11 @@ class SubscriberListingRepositoryTest extends \MailPoetTest {
|
|||||||
$subscriberOnDeletedList->setStatus(SubscriberEntity::STATUS_SUBSCRIBED);
|
$subscriberOnDeletedList->setStatus(SubscriberEntity::STATUS_SUBSCRIBED);
|
||||||
$this->createSubscriberSegmentEntity($deletedList, $subscriberOnDeletedList);
|
$this->createSubscriberSegmentEntity($deletedList, $subscriberOnDeletedList);
|
||||||
|
|
||||||
|
$subscriberInBothLists = $this->createSubscriberEntity();
|
||||||
|
$subscriberInBothLists->setStatus(SubscriberEntity::STATUS_SUBSCRIBED);
|
||||||
|
$this->createSubscriberSegmentEntity($list, $subscriberInBothLists);
|
||||||
|
$this->createSubscriberSegmentEntity($deletedList, $subscriberInBothLists);
|
||||||
|
|
||||||
$subscriberWithoutList = $this->createSubscriberEntity();
|
$subscriberWithoutList = $this->createSubscriberEntity();
|
||||||
|
|
||||||
$this->entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
Reference in New Issue
Block a user