Allow fetching count of subscribers with status

[MAILPOET-3077]
This commit is contained in:
Rostislav Wolny
2020-09-24 10:59:37 +02:00
committed by Veljko V
parent 694d1fae10
commit cd295c7aec
2 changed files with 39 additions and 14 deletions

View File

@ -38,7 +38,7 @@ class SegmentSubscribersRepository {
return $this->loadSubscriberIdsInSegment($segmentId); return $this->loadSubscriberIdsInSegment($segmentId);
} }
public function getSubscribersCount(int $segmentId): int { public function getSubscribersCount(int $segmentId, string $status = null): int {
$segment = $this->getSegment($segmentId); $segment = $this->getSegment($segmentId);
$subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName(); $subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
$queryBuilder = $this->entityManager $queryBuilder = $this->entityManager
@ -48,9 +48,9 @@ class SegmentSubscribersRepository {
->from($subscribersTable); ->from($subscribersTable);
if ($segment->isStatic()) { if ($segment->isStatic()) {
$queryBuilder = $this->filterSubscribersInStaticSegment($queryBuilder, $segment); $queryBuilder = $this->filterSubscribersInStaticSegment($queryBuilder, $segment, $status);
} else { } else {
$queryBuilder = $this->filterSubscribersInDynamicSegment($queryBuilder, $segment); $queryBuilder = $this->filterSubscribersInDynamicSegment($queryBuilder, $segment, $status);
} }
$statement = $this->executeQuery($queryBuilder); $statement = $this->executeQuery($queryBuilder);
$result = $statement->fetchColumn(); $result = $statement->fetchColumn();
@ -67,9 +67,9 @@ class SegmentSubscribersRepository {
->from($subscribersTable); ->from($subscribersTable);
if ($segment->isStatic()) { if ($segment->isStatic()) {
$queryBuilder = $this->filterSubscribersInStaticSegment($queryBuilder, $segment); $queryBuilder = $this->filterSubscribersInStaticSegment($queryBuilder, $segment, SubscriberEntity::STATUS_SUBSCRIBED);
} else { } else {
$queryBuilder = $this->filterSubscribersInDynamicSegment($queryBuilder, $segment); $queryBuilder = $this->filterSubscribersInDynamicSegment($queryBuilder, $segment, SubscriberEntity::STATUS_SUBSCRIBED);
} }
if ($candidateIds) { if ($candidateIds) {
@ -82,32 +82,49 @@ class SegmentSubscribersRepository {
return array_column($result, 'id'); return array_column($result, 'id');
} }
private function filterSubscribersInStaticSegment(QueryBuilder $queryBuilder, SegmentEntity $segment): QueryBuilder { private function filterSubscribersInStaticSegment(
QueryBuilder $queryBuilder,
SegmentEntity $segment,
string $status = null
): QueryBuilder {
$subscribersSegmentsTable = $this->entityManager->getClassMetadata(SubscriberSegmentEntity::class)->getTableName(); $subscribersSegmentsTable = $this->entityManager->getClassMetadata(SubscriberSegmentEntity::class)->getTableName();
$subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName(); $subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
return $queryBuilder->join( $queryBuilder = $queryBuilder->join(
$subscribersTable, $subscribersTable,
$subscribersSegmentsTable, $subscribersSegmentsTable,
'subsegment', 'subsegment',
"subsegment.subscriber_id = $subscribersTable.id AND subsegment.segment_id = :segment" "subsegment.subscriber_id = $subscribersTable.id AND subsegment.segment_id = :segment"
)->andWhere("$subscribersTable.deleted_at IS NULL") )->andWhere("$subscribersTable.deleted_at IS NULL")
->andWhere("$subscribersTable.status = :status") ->setParameter('segment', $segment->getId());
->andWhere("subsegment.status = :status") if ($status) {
->setParameter('segment', $segment->getId()) $queryBuilder = $queryBuilder->andWhere("$subscribersTable.status = :status")
->setParameter('status', SubscriberEntity::STATUS_SUBSCRIBED); ->andWhere("subsegment.status = :status")
->setParameter('status', $status);
}
return $queryBuilder;
} }
private function filterSubscribersInDynamicSegment(QueryBuilder $queryBuilder, SegmentEntity $segment): QueryBuilder { private function filterSubscribersInDynamicSegment(
QueryBuilder $queryBuilder,
SegmentEntity $segment,
string $status = null
): QueryBuilder {
$filters = $segment->getDynamicFilters(); $filters = $segment->getDynamicFilters();
// We don't allow dynamic segment without filers since it would return all subscribers // We don't allow dynamic segment without filers since it would return all subscribers
// For BC compatibility fetching an empty result // For BC compatibility fetching an empty result
if (count($filters) === 0) { if (count($filters) === 0) {
$queryBuilder->andWhere('0 = 1'); return $queryBuilder->andWhere('0 = 1');
return $queryBuilder;
} }
foreach ($filters as $filter) { foreach ($filters as $filter) {
$queryBuilder = $this->filterHandler->apply($queryBuilder, $filter); $queryBuilder = $this->filterHandler->apply($queryBuilder, $filter);
} }
$subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
$queryBuilder = $queryBuilder->andWhere("$subscribersTable.deleted_at IS NULL");
if ($status) {
$queryBuilder = $queryBuilder->andWhere("$subscribersTable.status = :status")
->andWhere("$subscribersTable.deleted_at IS NULL")
->setParameter('status', $status);
}
return $queryBuilder; return $queryBuilder;
} }

View File

@ -46,6 +46,8 @@ class SegmentSubscribersRepositoryTest extends \MailPoetTest {
$this->entityManager->flush(); $this->entityManager->flush();
$count = $this->repository->getSubscribersCount((int)$segment->getId()); $count = $this->repository->getSubscribersCount((int)$segment->getId());
expect($count)->equals(3);
$count = $this->repository->getSubscribersCount((int)$segment->getId(), SubscriberEntity::STATUS_SUBSCRIBED);
expect($count)->equals(1); expect($count)->equals(1);
$ids = $this->repository->getSubscriberIdsInSegment((int)$segment->getId()); $ids = $this->repository->getSubscriberIdsInSegment((int)$segment->getId());
expect($ids)->equals([$subscriberInSegment->getId()]); expect($ids)->equals([$subscriberInSegment->getId()]);
@ -70,11 +72,17 @@ class SegmentSubscribersRepositoryTest extends \MailPoetTest {
->getRepository(SubscriberEntity::class) ->getRepository(SubscriberEntity::class)
->findOneBy(['email' => $wpUserEmail]); ->findOneBy(['email' => $wpUserEmail]);
assert($wpUserSubscriber instanceof SubscriberEntity); assert($wpUserSubscriber instanceof SubscriberEntity);
$wpUserSubscriber->setStatus(SubscriberEntity::STATUS_SUBSCRIBED);
assert($wpUserSubscriber instanceof SubscriberEntity);
$subscriberNoList = $this->createSubscriberEntity(); // Subscriber without segment $subscriberNoList = $this->createSubscriberEntity(); // Subscriber without segment
$this->entityManager->flush(); $this->entityManager->flush();
$count = $this->repository->getSubscribersCount((int)$segment->getId()); $count = $this->repository->getSubscribersCount((int)$segment->getId());
expect($count)->equals(1); expect($count)->equals(1);
$count = $this->repository->getSubscribersCount((int)$segment->getId(), SubscriberEntity::STATUS_UNSUBSCRIBED);
expect($count)->equals(0);
$count = $this->repository->getSubscribersCount((int)$segment->getId(), SubscriberEntity::STATUS_SUBSCRIBED);
expect($count)->equals(1);
$ids = $this->repository->getSubscriberIdsInSegment((int)$segment->getId()); $ids = $this->repository->getSubscriberIdsInSegment((int)$segment->getId());
expect($ids)->equals([$wpUserSubscriber->getId()]); expect($ids)->equals([$wpUserSubscriber->getId()]);
$filteredIds = $this->repository->findSubscribersIdsInSegment((int)$segment->getId(), [$wpUserSubscriber->getId(), 20, 30]); $filteredIds = $this->repository->findSubscribersIdsInSegment((int)$segment->getId(), [$wpUserSubscriber->getId(), 20, 30]);