Unify counting dynamic subscribers
[MAILPOET-3219]
This commit is contained in:
@@ -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");
|
||||||
|
Reference in New Issue
Block a user