Process multiple newsletters with operator ANY
[MAILPOET-3950]
This commit is contained in:
@@ -9,6 +9,7 @@ use MailPoet\Entities\StatisticsOpenEntity;
|
|||||||
use MailPoet\Entities\SubscriberEntity;
|
use MailPoet\Entities\SubscriberEntity;
|
||||||
use MailPoet\Entities\UserAgentEntity;
|
use MailPoet\Entities\UserAgentEntity;
|
||||||
use MailPoet\Util\Security;
|
use MailPoet\Util\Security;
|
||||||
|
use MailPoetVendor\Doctrine\DBAL\Connection;
|
||||||
use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder;
|
use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder;
|
||||||
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
||||||
|
|
||||||
@@ -47,7 +48,12 @@ class EmailAction implements Filter {
|
|||||||
public function apply(QueryBuilder $queryBuilder, DynamicSegmentFilterEntity $filter): QueryBuilder {
|
public function apply(QueryBuilder $queryBuilder, DynamicSegmentFilterEntity $filter): QueryBuilder {
|
||||||
$filterData = $filter->getFilterData();
|
$filterData = $filter->getFilterData();
|
||||||
$action = $filterData->getAction();
|
$action = $filterData->getAction();
|
||||||
$newsletterId = (int)$filterData->getParam('newsletter_id');
|
$newsletterId = $filterData->getParam('newsletter_id');
|
||||||
|
if ($newsletterId) {
|
||||||
|
$newsletters = [(int)$newsletterId];
|
||||||
|
} else {
|
||||||
|
$newsletters = $filterData->getParam('newsletters');
|
||||||
|
}
|
||||||
$linkId = $filterData->getParam('link_id') ? (int)$filterData->getParam('link_id') : null;
|
$linkId = $filterData->getParam('link_id') ? (int)$filterData->getParam('link_id') : null;
|
||||||
$parameterSuffix = (string)($filter->getId() ?? Security::generateRandomString());
|
$parameterSuffix = (string)($filter->getId() ?? Security::generateRandomString());
|
||||||
|
|
||||||
@@ -74,6 +80,13 @@ class EmailAction implements Filter {
|
|||||||
$this->createNotStatsJoinCondition($filter, $action, $linkId, $parameterSuffix)
|
$this->createNotStatsJoinCondition($filter, $action, $linkId, $parameterSuffix)
|
||||||
)->setParameter('newsletter' . $parameterSuffix, $newsletterId);
|
)->setParameter('newsletter' . $parameterSuffix, $newsletterId);
|
||||||
$where .= ' AND stats.id IS NULL';
|
$where .= ' AND stats.id IS NULL';
|
||||||
|
} elseif ($action === EmailAction::ACTION_OPENED) {
|
||||||
|
$queryBuilder = $queryBuilder->innerJoin(
|
||||||
|
$subscribersTable,
|
||||||
|
$statsTable,
|
||||||
|
'stats',
|
||||||
|
"stats.subscriber_id = $subscribersTable.id AND stats.newsletter_id IN (:newsletters" . $parameterSuffix . ')'
|
||||||
|
)->setParameter('newsletters' . $parameterSuffix, $newsletters, Connection::PARAM_INT_ARRAY);
|
||||||
} else {
|
} else {
|
||||||
$queryBuilder = $queryBuilder->innerJoin(
|
$queryBuilder = $queryBuilder->innerJoin(
|
||||||
$subscribersTable,
|
$subscribersTable,
|
||||||
|
@@ -77,8 +77,9 @@ class EmailActionTest extends \MailPoetTest {
|
|||||||
|
|
||||||
$this->subscriberOpenedClicked = $this->createSubscriber('opened_clicked@example.com');
|
$this->subscriberOpenedClicked = $this->createSubscriber('opened_clicked@example.com');
|
||||||
$this->subscriberOpenedNotClicked = $this->createSubscriber('opened_not_clicked@example.com');
|
$this->subscriberOpenedNotClicked = $this->createSubscriber('opened_not_clicked@example.com');
|
||||||
$subscriberOpenedNotClicked2 = $this->createSubscriber('opened_clicked2@example.com');
|
$subscriberOpenedNotClicked2 = $this->createSubscriber('opened_not_clicked2@example.com');
|
||||||
$subscriberOpenedNotClicked3 = $this->createSubscriber('opened_clicked3@example.com');
|
$subscriberOpenedNotClicked3 = $this->createSubscriber('opened_not_clicked3@example.com');
|
||||||
|
$subscriberOpenedNotClicked4 = $this->createSubscriber('opened_not_clicked4@example.com');
|
||||||
$this->subscriberNotOpened = $this->createSubscriber('not_opened@example.com');
|
$this->subscriberNotOpened = $this->createSubscriber('not_opened@example.com');
|
||||||
$this->subscriberNotSent = $this->createSubscriber('not_sent@example.com');
|
$this->subscriberNotSent = $this->createSubscriber('not_sent@example.com');
|
||||||
|
|
||||||
@@ -86,12 +87,16 @@ class EmailActionTest extends \MailPoetTest {
|
|||||||
$this->createStatsNewsletter($this->subscriberOpenedNotClicked, $this->newsletter);
|
$this->createStatsNewsletter($this->subscriberOpenedNotClicked, $this->newsletter);
|
||||||
$this->createStatsNewsletter($this->subscriberNotOpened, $this->newsletter);
|
$this->createStatsNewsletter($this->subscriberNotOpened, $this->newsletter);
|
||||||
$this->createStatsNewsletter($subscriberOpenedNotClicked2, $this->newsletter2);
|
$this->createStatsNewsletter($subscriberOpenedNotClicked2, $this->newsletter2);
|
||||||
|
$this->createStatsNewsletter($subscriberOpenedNotClicked4, $this->newsletter2);
|
||||||
$this->createStatsNewsletter($subscriberOpenedNotClicked3, $this->newsletter3);
|
$this->createStatsNewsletter($subscriberOpenedNotClicked3, $this->newsletter3);
|
||||||
|
$this->createStatsNewsletter($subscriberOpenedNotClicked4, $this->newsletter3);
|
||||||
|
|
||||||
$this->createStatisticsOpens($this->subscriberOpenedClicked, $this->newsletter);
|
$this->createStatisticsOpens($this->subscriberOpenedClicked, $this->newsletter);
|
||||||
$this->createStatisticsOpens($this->subscriberOpenedNotClicked, $this->newsletter);
|
$this->createStatisticsOpens($this->subscriberOpenedNotClicked, $this->newsletter);
|
||||||
$this->createStatisticsOpens($subscriberOpenedNotClicked2, $this->newsletter2);
|
$this->createStatisticsOpens($subscriberOpenedNotClicked2, $this->newsletter2);
|
||||||
|
$this->createStatisticsOpens($subscriberOpenedNotClicked4, $this->newsletter2);
|
||||||
$this->createStatisticsOpens($subscriberOpenedNotClicked3, $this->newsletter3);
|
$this->createStatisticsOpens($subscriberOpenedNotClicked3, $this->newsletter3);
|
||||||
|
$this->createStatisticsOpens($subscriberOpenedNotClicked4, $this->newsletter3);
|
||||||
|
|
||||||
$this->addClickedToLink('http://example.com', $this->newsletter, $this->subscriberOpenedClicked);
|
$this->addClickedToLink('http://example.com', $this->newsletter, $this->subscriberOpenedClicked);
|
||||||
}
|
}
|
||||||
@@ -125,6 +130,32 @@ class EmailActionTest extends \MailPoetTest {
|
|||||||
expect($subscriber1->getEmail())->equals('not_opened@example.com');
|
expect($subscriber1->getEmail())->equals('not_opened@example.com');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testGetOpenedOperatorAny() {
|
||||||
|
$segmentFilter = $this->getSegmentFilter(
|
||||||
|
EmailAction::ACTION_OPENED,
|
||||||
|
[
|
||||||
|
'newsletters' => [(int)$this->newsletter->getId(), (int)$this->newsletter2->getId()],
|
||||||
|
'operator' => DynamicSegmentFilterData::OPERATOR_ANY,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$statement = $this->emailAction->apply($this->getQueryBuilder(), $segmentFilter)->execute();
|
||||||
|
$this->assertInstanceOf(Statement::class, $statement);
|
||||||
|
$result = $statement->fetchAll();
|
||||||
|
expect(count($result))->equals(4);
|
||||||
|
$subscriber1 = $this->entityManager->find(SubscriberEntity::class, $result[0]['id']);
|
||||||
|
$this->assertInstanceOf(SubscriberEntity::class, $subscriber1);
|
||||||
|
$subscriber2 = $this->entityManager->find(SubscriberEntity::class, $result[1]['id']);
|
||||||
|
$this->assertInstanceOf(SubscriberEntity::class, $subscriber2);
|
||||||
|
$subscriber3 = $this->entityManager->find(SubscriberEntity::class, $result[2]['id']);
|
||||||
|
$this->assertInstanceOf(SubscriberEntity::class, $subscriber3);
|
||||||
|
$subscriber4 = $this->entityManager->find(SubscriberEntity::class, $result[3]['id']);
|
||||||
|
$this->assertInstanceOf(SubscriberEntity::class, $subscriber4);
|
||||||
|
expect($subscriber1->getEmail())->equals('opened_clicked@example.com');
|
||||||
|
expect($subscriber2->getEmail())->equals('opened_not_clicked@example.com');
|
||||||
|
expect($subscriber3->getEmail())->equals('opened_not_clicked2@example.com');
|
||||||
|
expect($subscriber4->getEmail())->equals('opened_not_clicked4@example.com');
|
||||||
|
}
|
||||||
|
|
||||||
public function testGetClickedWithoutLink() {
|
public function testGetClickedWithoutLink() {
|
||||||
$segmentFilter = $this->getSegmentFilter(EmailAction::ACTION_CLICKED, [
|
$segmentFilter = $this->getSegmentFilter(EmailAction::ACTION_CLICKED, [
|
||||||
'newsletter_id' => (int)$this->newsletter->getId(),
|
'newsletter_id' => (int)$this->newsletter->getId(),
|
||||||
|
Reference in New Issue
Block a user