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\Models\ScheduledTask;
use MailPoet\Util\DBCollationChecker;
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
use MailPoetVendor\Doctrine\ORM\EntityManager;
class SubscribersLastEngagement extends SimpleWorker {
@@ -21,16 +22,21 @@ class SubscribersLastEngagement extends SimpleWorker {
/** @var DBCollationChecker */
private $dbCollationChecker;
/** @var WooCommerceHelper */
private $wooCommereHelper;
/** @var null|string */
private $emailCollationCorrection;
public function __construct(
EntityManager $entityManager,
DBCollationChecker $dbCollationChecker
DBCollationChecker $dbCollationChecker,
WooCommerceHelper $wooCommereHelper
) {
parent::__construct();
$this->entityManager = $entityManager;
$this->dbCollationChecker = $dbCollationChecker;
$this->wooCommereHelper = $wooCommereHelper;
}
public function processTaskStrategy(ScheduledTask $task, $timer): bool {
@@ -66,7 +72,17 @@ class SubscribersLastEngagement extends SimpleWorker {
}
$emailCollate = $this->emailCollationCorrection;
$this->entityManager->getConnection()->executeStatement("
$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
SET mps.last_engagement_at = NULLIF(GREATEST(COALESCE(mpso.created_at, 0), COALESCE(mpsc.created_at,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
@@ -74,7 +90,9 @@ class SubscribersLastEngagement extends SimpleWorker {
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 {