Search for last engagement in orders only if WooCommerce is active

[MAILPOET-3762]
This commit is contained in:
Rostislav Wolny
2021-09-03 14:01:43 +02:00
committed by Veljko V
parent 754f901e30
commit ae2d450dce

View File

@@ -7,6 +7,7 @@ use MailPoet\Entities\StatisticsOpenEntity;
use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberEntity;
use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTask;
use MailPoet\Util\DBCollationChecker; use MailPoet\Util\DBCollationChecker;
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
use MailPoetVendor\Doctrine\ORM\EntityManager; use MailPoetVendor\Doctrine\ORM\EntityManager;
class SubscribersLastEngagement extends SimpleWorker { class SubscribersLastEngagement extends SimpleWorker {
@@ -21,16 +22,21 @@ class SubscribersLastEngagement extends SimpleWorker {
/** @var DBCollationChecker */ /** @var DBCollationChecker */
private $dbCollationChecker; private $dbCollationChecker;
/** @var WooCommerceHelper */
private $wooCommereHelper;
/** @var null|string */ /** @var null|string */
private $emailCollationCorrection; private $emailCollationCorrection;
public function __construct( public function __construct(
EntityManager $entityManager, EntityManager $entityManager,
DBCollationChecker $dbCollationChecker DBCollationChecker $dbCollationChecker,
WooCommerceHelper $wooCommereHelper
) { ) {
parent::__construct(); parent::__construct();
$this->entityManager = $entityManager; $this->entityManager = $entityManager;
$this->dbCollationChecker = $dbCollationChecker; $this->dbCollationChecker = $dbCollationChecker;
$this->wooCommereHelper = $wooCommereHelper;
} }
public function processTaskStrategy(ScheduledTask $task, $timer): bool { public function processTaskStrategy(ScheduledTask $task, $timer): bool {
@@ -66,15 +72,27 @@ class SubscribersLastEngagement extends SimpleWorker {
} }
$emailCollate = $this->emailCollationCorrection; $emailCollate = $this->emailCollationCorrection;
$this->entityManager->getConnection()->executeStatement(" $query = "
UPDATE $subscribersTable as mps UPDATE $subscribersTable as mps
LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsOpensTable as mpsoinner GROUP BY mpsoinner.subscriber_id) as mpso ON mpso.subscriber_id = mps.id LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsOpensTable as mpsoinner GROUP BY mpsoinner.subscriber_id) as mpso ON mpso.subscriber_id = mps.id
LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsClicksTable as mpscinner GROUP BY mpscinner.subscriber_id) as mpsc ON mpsc.subscriber_id = mps.id LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsClicksTable as mpscinner GROUP BY mpscinner.subscriber_id) as mpsc ON mpsc.subscriber_id = mps.id
LEFT JOIN (SELECT MAX(post_id) AS post_id, meta_value as email FROM $postsmetaTable WHERE meta_key = '_billing_email' GROUP BY email) AS newestOrderIds ON newestOrderIds.email $emailCollate = mps.email SET mps.last_engagement_at = NULLIF(GREATEST(COALESCE(mpso.created_at, 0), COALESCE(mpsc.created_at,0)), 0)
LEFT JOIN (SELECT ID, post_date FROM $postsTable WHERE post_type = 'shop_order') AS shopOrders ON newestOrderIds.post_id = shopOrders.ID WHERE mps.last_engagement_at IS NULL AND mps.id >= $minSubscriberId AND mps.id < $maxSubscriberId;
SET mps.last_engagement_at = NULLIF(GREATEST(COALESCE(mpso.created_at, 0), COALESCE(mpsc.created_at,0), COALESCE(shopOrders.post_date, 0)), 0) ";
WHERE mps.last_engagement_at IS NULL AND mps.id >= $minSubscriberId AND mps.id < $maxSubscriberId;
"); // Use more complex query that takes into the account also subscriber's latest WooCommerce order
if ($this->wooCommereHelper->isWooCommerceActive()) {
$query = "
UPDATE $subscribersTable as mps
LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsOpensTable as mpsoinner GROUP BY mpsoinner.subscriber_id) as mpso ON mpso.subscriber_id = mps.id
LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsClicksTable as mpscinner GROUP BY mpscinner.subscriber_id) as mpsc ON mpsc.subscriber_id = mps.id
LEFT JOIN (SELECT MAX(post_id) AS post_id, meta_value as email FROM $postsmetaTable WHERE meta_key = '_billing_email' GROUP BY email) AS newestOrderIds ON newestOrderIds.email $emailCollate = mps.email
LEFT JOIN (SELECT ID, post_date FROM $postsTable WHERE post_type = 'shop_order') AS shopOrders ON newestOrderIds.post_id = shopOrders.ID
SET mps.last_engagement_at = NULLIF(GREATEST(COALESCE(mpso.created_at, 0), COALESCE(mpsc.created_at,0), COALESCE(shopOrders.post_date, 0)), 0)
WHERE mps.last_engagement_at IS NULL AND mps.id >= $minSubscriberId AND mps.id < $maxSubscriberId;
";
}
$this->entityManager->getConnection()->executeStatement($query);
} }
private function getHighestSubscriberId(): int { private function getHighestSubscriberId(): int {