Unify counting dynamic subscribers

[MAILPOET-3219]
This commit is contained in:
Jan Lysý
2021-03-13 16:55:29 +01:00
committed by Veljko V
parent 6b55cf08e0
commit c7eb9df3da

View File

@@ -41,12 +41,7 @@ class SegmentSubscribersRepository {
public function getSubscribersCount(int $segmentId, string $status = null): 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(); $queryBuilder = $this->createCountQueryBuilder();
$queryBuilder = $this->entityManager
->getConnection()
->createQueryBuilder()
->select("count(DISTINCT $subscribersTable.id)")
->from($subscribersTable);
if ($segment->isStatic()) { if ($segment->isStatic()) {
$queryBuilder = $this->filterSubscribersInStaticSegment($queryBuilder, $segment, $status); $queryBuilder = $this->filterSubscribersInStaticSegment($queryBuilder, $segment, $status);
@@ -62,11 +57,7 @@ class SegmentSubscribersRepository {
$subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName(); $subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
$subscribersSegmentsTable = $this->entityManager->getClassMetadata(SubscriberSegmentEntity::class)->getTableName(); $subscribersSegmentsTable = $this->entityManager->getClassMetadata(SubscriberSegmentEntity::class)->getTableName();
$queryBuilder = $this->entityManager $queryBuilder = $this->createCountQueryBuilder()
->getConnection()
->createQueryBuilder()
->select("count(DISTINCT $subscribersTable.id)")
->from($subscribersTable)
->join( ->join(
$subscribersTable, $subscribersTable,
$subscribersSegmentsTable, $subscribersSegmentsTable,
@@ -86,18 +77,23 @@ class SegmentSubscribersRepository {
return (int)$result; return (int)$result;
} }
public function getDynamicSubscribersCount(DynamicSegmentFilterData $data): int { public function getDynamicSubscribersCount(DynamicSegmentFilterData $filter): int {
$subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName(); $queryBuilder = $this->createCountQueryBuilder();
$queryBuilder = $this->entityManager->getConnection()->createQueryBuilder(); $queryBuilder = $this->filterSubscribersInDynamicSegment($queryBuilder, null, null, [$filter]);
$queryBuilder
->select("COUNT(DISTINCT {$subscribersTable}.id) AS count")
->from($subscribersTable, $subscribersTable);
$queryBuilder = $this->filterHandler->apply($queryBuilder, $data);
$statement = $this->executeQuery($queryBuilder); $statement = $this->executeQuery($queryBuilder);
$result = $statement->fetchColumn(); $result = $statement->fetchColumn();
return (int)$result; return (int)$result;
} }
private function createCountQueryBuilder(): QueryBuilder {
$subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
return $this->entityManager
->getConnection()
->createQueryBuilder()
->select("count(DISTINCT $subscribersTable.id)")
->from($subscribersTable);
}
public function getSubscribersWithoutSegmentCount(): int { public function getSubscribersWithoutSegmentCount(): int {
$queryBuilder = $this->getSubscribersWithoutSegmentCountQuery(); $queryBuilder = $this->getSubscribersWithoutSegmentCountQuery();
return (int)$queryBuilder->getQuery()->getSingleScalarResult(); return (int)$queryBuilder->getQuery()->getSingleScalarResult();
@@ -172,19 +168,30 @@ class SegmentSubscribersRepository {
return $queryBuilder; return $queryBuilder;
} }
/**
* @param DynamicSegmentFilterData[] $filters
*/
private function filterSubscribersInDynamicSegment( private function filterSubscribersInDynamicSegment(
QueryBuilder $queryBuilder, QueryBuilder $queryBuilder,
SegmentEntity $segment, ?SegmentEntity $segment,
string $status = null string $status = null,
array $filters = []
): QueryBuilder { ): QueryBuilder {
$filters = $segment->getDynamicFilters(); if ($segment) {
$filters = [];
$dynamicFilters = $segment->getDynamicFilters();
foreach ($dynamicFilters as $dynamicFilter) {
$filters[] = $dynamicFilter->getFilterData();
}
}
// 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) {
return $queryBuilder->andWhere('0 = 1'); return $queryBuilder->andWhere('0 = 1');
} }
foreach ($filters as $filter) { foreach ($filters as $filter) {
$queryBuilder = $this->filterHandler->apply($queryBuilder, $filter->getFilterData()); $queryBuilder = $this->filterHandler->apply($queryBuilder, $filter);
} }
$subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName(); $subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
$queryBuilder = $queryBuilder->andWhere("$subscribersTable.deleted_at IS NULL"); $queryBuilder = $queryBuilder->andWhere("$subscribersTable.deleted_at IS NULL");