Use same query logic for counting and exporting subs w/o lists

[MAILPOET-3462]
This commit is contained in:
wxa
2021-03-10 10:44:21 +03:00
committed by Veljko V
parent 10bf0d006d
commit e71e063ef0
2 changed files with 24 additions and 2 deletions

View File

@ -160,6 +160,7 @@ class ImportExportRepository {
public function getSubscribersBatchBySegment(?SegmentEntity $segment, int $limit, int $offset = 0): array {
$subscriberSegmentTable = $this->getTableName(SubscriberSegmentEntity::class);
$subscriberTable = $this->getTableName(SubscriberEntity::class);
$segmentTable = $this->getTableName(SegmentEntity::class);
$qb = $this->createSubscribersQueryBuilder($limit, $offset);
@ -169,7 +170,12 @@ class ImportExportRepository {
// if there are subscribers who do not belong to any segment, use
// a CASE function to group them under "Not In Segment"
$qb->addSelect("'" . WPFunctions::get()->__('Not In Segment', 'mailpoet') . "' AS segment_name")
->andWhere("{$subscriberSegmentTable}.segment_id IS NULL");
->leftJoin($subscriberTable, $subscriberTable, 's2', "{$subscriberTable}.id = s2.id")
->leftJoin('s2', $subscriberSegmentTable, 'ssg2', "s2.id = ssg2.subscriber_id AND ssg2.status = :statusSubscribed AND {$segmentTable}.id <> ssg2.segment_id")
->leftJoin('ssg2', $segmentTable, 'sg2', 'ssg2.segment_id = sg2.id AND sg2.deleted_at IS NULL')
->andWhere("({$subscriberSegmentTable}.status != :statusSubscribed OR {$subscriberSegmentTable}.id IS NULL OR {$segmentTable}.deleted_at IS NOT NULL)")
->andWhere('sg2.id IS NULL')
->setParameter('statusSubscribed', SubscriberEntity::STATUS_SUBSCRIBED);
} elseif ($segment->isStatic()) {
$qb->addSelect("{$segmentTable}.name AS segment_name")
->andWhere("{$subscriberSegmentTable}.segment_id = :segmentId")

View File

@ -247,13 +247,25 @@ class ImportExportRepositoryTest extends \MailPoetTest {
$user2 = $this->createSubscriber('user2@export-test.com', 'Two', 'User');
$user3 = $this->createSubscriber('user3@export-test.com', 'Three', 'User');
$user4 = $this->createSubscriber('user4@export-test.com', 'Four', 'User');
$user5 = $this->createSubscriber('user5@export-test.com', 'Five', 'User');
$segment1 = $this->createSegment('First', SegmentEntity::TYPE_DEFAULT);
$segment2 = $this->createSegment('Two', SegmentEntity::TYPE_DEFAULT);
$segment3 = $this->createSegment('Three', SegmentEntity::TYPE_DEFAULT);
$segment3->setDeletedAt(new \DateTime());
$this->entityManager->persist($segment3);
// Subscribed to segment, shouldn't be exported
$this->createSubscriberSegment($user1, $segment1, SubscriberEntity::STATUS_SUBSCRIBED);
// A mix of subscribed and unsubscribed, shouldn't be exported
$this->createSubscriberSegment($user3, $segment2, SubscriberEntity::STATUS_SUBSCRIBED);
$this->createSubscriberSegment($user3, $segment1, SubscriberEntity::STATUS_UNSUBSCRIBED);
// Unsubscribed from segment, should be exported
$this->createSubscriberSegment($user2, $segment2, SubscriberEntity::STATUS_UNSUBSCRIBED);
// Subscribed to trashed segment, should be exported
$this->createSubscriberSegment($user4, $segment3, SubscriberEntity::STATUS_SUBSCRIBED);
// User5 is not subscribed to any segment, should be exported
$exported = $this->repository->getSubscribersBatchBySegment(null, 100);
expect($exported)->count(2);
expect($exported)->count(3);
expect($exported[0]['first_name'])->equals('Two');
expect($exported[0]['last_name'])->equals('User');
expect($exported[0]['email'])->equals('user2@export-test.com');
@ -262,6 +274,10 @@ class ImportExportRepositoryTest extends \MailPoetTest {
expect($exported[1]['last_name'])->equals('User');
expect($exported[1]['email'])->equals('user4@export-test.com');
expect($exported[1]['segment_name'])->equals('Not In Segment');
expect($exported[2]['first_name'])->equals('Five');
expect($exported[2]['last_name'])->equals('User');
expect($exported[2]['email'])->equals('user5@export-test.com');
expect($exported[2]['segment_name'])->equals('Not In Segment');
}
public function testItGetSubscribersByDynamicSegment(): void {