Compare commits

...

2 Commits

Author SHA1 Message Date
fb94413256 Release 3.73.2 2021-11-08 10:26:17 -06:00
7b23f86445 Fix fetching count of segments with multiple filters
We needed to get number of rows which meet the condition.
I couldn't use DQL since it doesn't allow a subquery in FROM
so I rewrote the query using DBAL level query builder.
[MAILPOET-3922]
2021-11-08 09:51:15 -06:00
4 changed files with 56 additions and 12 deletions

View File

@ -15,7 +15,6 @@ use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Carbon\Carbon;
use MailPoetVendor\Doctrine\DBAL\Connection;
use MailPoetVendor\Doctrine\ORM\EntityManager;
use MailPoetVendor\Doctrine\ORM\Query;
/**
* @extends Repository<SegmentEntity>
@ -227,13 +226,17 @@ class SegmentsRepository extends Repository {
* Returns count of segments that have more than one dynamic filter
*/
public function getSegmentCountWithMultipleFilters(): int {
$qb = $this->entityManager->createQueryBuilder()
->select('COUNT(DISTINCT s.id) AS segmentCount')
->from(SegmentEntity::class, 's')
->join('s.dynamicFilters', 'ds')
->groupBy('ds.segment')
->having('COUNT(ds.id) > 1');
$result = $qb->getQuery()->getOneOrNullResult(Query::HYDRATE_ARRAY);
return (int)($result['segmentCount'] ?? 0);
$segmentFiltersTable = $this->entityManager->getClassMetadata(DynamicSegmentFilterEntity::class)->getTableName();
$qbInner = $this->entityManager->getConnection()->createQueryBuilder()
->select('COUNT(DISTINCT sf.id) AS segmentCount')
->from($segmentFiltersTable, 'sf')
->groupBy('sf.segment_id')
->having('COUNT(sf.id) > 1');
$result = $this->entityManager->getConnection()->createQueryBuilder()
->select('count(*)')
->from(sprintf('(%s) as subCounts', $qbInner->getSQL()))
->execute()
->fetchOne();
return (int)$result;
}
}

View File

@ -2,7 +2,7 @@
/*
* Plugin Name: MailPoet 3 (New)
* Version: 3.73.1
* Version: 3.73.2
* Plugin URI: http://www.mailpoet.com
* Description: Create and send newsletters, post notifications and welcome emails from your WordPress.
* Author: MailPoet
@ -15,7 +15,7 @@
*/
$mailpoetPlugin = [
'version' => '3.73.1',
'version' => '3.73.2',
'filename' => __FILE__,
'path' => dirname(__FILE__),
'autoloader' => dirname(__FILE__) . '/vendor/autoload.php',

View File

@ -3,7 +3,7 @@ Contributors: mailpoet
Tags: email, email marketing, post notification, woocommerce emails, email automation, newsletter, newsletter builder, newsletter subscribers
Requires at least: 5.3
Tested up to: 5.8
Stable tag: 3.73.1
Stable tag: 3.73.2
Requires PHP: 7.1
License: GPLv3
License URI: https://www.gnu.org/licenses/gpl-3.0.html
@ -184,6 +184,9 @@ Check our [Knowledge Base](https://kb.mailpoet.com) or contact us through our [s
== Changelog ==
= 3.73.2 - 2021-11-08 =
* Fixed: error on dynamic segments filter query.
= 3.73.1 - 2021-11-04 =
* Fixed: segments are not loading.

View File

@ -69,6 +69,44 @@ class SegmentsRepositoryTest extends \MailPoetTest {
expect($segment2->getDeletedAt())->null();
}
public function testItReturnsCountsOfSegmentsWithMultipleFilters() {
// No Segments
$count = $this->segmentsRepository->getSegmentCountWithMultipleFilters();
expect($count)->equals(0);
// Two segments with one filter each
$segment1 = $this->createDynamicSegmentEntityForEditorUsers();
$segment2 = $this->createDynamicSegmentEntityForEditorUsers();
$count = $this->segmentsRepository->getSegmentCountWithMultipleFilters();
expect($count)->equals(0);
// One segment with multiple filters
$filterData = new DynamicSegmentFilterData(
DynamicSegmentFilterData::TYPE_USER_ROLE,
UserRole::TYPE,
['wordpressRole' => 'editor']
);
$dynamicFilter = new DynamicSegmentFilterEntity($segment1, $filterData);
$this->entityManager->persist($dynamicFilter);
$segment1->addDynamicFilter($dynamicFilter);
$this->segmentsRepository->flush();
$count = $this->segmentsRepository->getSegmentCountWithMultipleFilters();
expect($count)->equals(1);
// Both segments with multiple filters
$filterData = new DynamicSegmentFilterData(
DynamicSegmentFilterData::TYPE_USER_ROLE,
UserRole::TYPE,
['wordpressRole' => 'editor']
);
$dynamicFilter = new DynamicSegmentFilterEntity($segment2, $filterData);
$this->entityManager->persist($dynamicFilter);
$segment1->addDynamicFilter($dynamicFilter);
$this->segmentsRepository->flush();
$count = $this->segmentsRepository->getSegmentCountWithMultipleFilters();
expect($count)->equals(2);
}
private function createDefaultSegment(string $name): SegmentEntity {
$segment = new SegmentEntity($name, SegmentEntity::TYPE_DEFAULT, 'description');
$this->entityManager->persist($segment);