Allow fetching count of subscribers with status
[MAILPOET-3077]
This commit is contained in:
committed by
Veljko V
parent
694d1fae10
commit
cd295c7aec
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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]);
|
||||||
|
Reference in New Issue
Block a user