Refactor newsletter bulkDelete transaction

[MAILPOET-2898]
This commit is contained in:
Rostislav Wolny
2020-06-17 10:25:04 +02:00
committed by Veljko V
parent ccf5210dbd
commit 2db677f9de

View File

@ -24,6 +24,7 @@ use MailPoet\Entities\StatisticsWooCommercePurchaseEntity;
use MailPoet\Entities\StatsNotificationEntity; use MailPoet\Entities\StatsNotificationEntity;
use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Carbon\Carbon;
use MailPoetVendor\Doctrine\DBAL\Connection; use MailPoetVendor\Doctrine\DBAL\Connection;
use MailPoetVendor\Doctrine\ORM\EntityManager;
use MailPoetVendor\Doctrine\ORM\Query\Expr\Join; use MailPoetVendor\Doctrine\ORM\Query\Expr\Join;
use function MailPoetVendor\array_column; use function MailPoetVendor\array_column;
@ -210,107 +211,103 @@ class NewslettersRepository extends Repository {
if (empty($ids)) { if (empty($ids)) {
return 0; return 0;
} }
$this->entityManager->getConnection()->beginTransaction(); // Fetch children ids for deleting
try { $childrenIds = $this->fetchChildrenIds($ids);
// Fetch children ids for deleting $ids = array_merge($ids, $childrenIds);
$childrenIds = $this->fetchChildrenIds($ids);
$ids = array_merge($ids, $childrenIds); $this->entityManager->transactional(function (EntityManager $entityManager) use ($ids) {
// Delete statistics data // Delete statistics data
$newsletterStatisticsTable = $this->entityManager->getClassMetadata(StatisticsNewsletterEntity::class)->getTableName(); $newsletterStatisticsTable = $entityManager->getClassMetadata(StatisticsNewsletterEntity::class)->getTableName();
$this->entityManager->getConnection()->executeUpdate(" $entityManager->getConnection()->executeUpdate("
DELETE s FROM $newsletterStatisticsTable s DELETE s FROM $newsletterStatisticsTable s
WHERE s.`newsletter_id` IN (:ids) WHERE s.`newsletter_id` IN (:ids)
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]); ", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
$statisticsOpensTable = $this->entityManager->getClassMetadata(StatisticsOpenEntity::class)->getTableName(); $statisticsOpensTable = $entityManager->getClassMetadata(StatisticsOpenEntity::class)->getTableName();
$this->entityManager->getConnection()->executeUpdate(" $entityManager->getConnection()->executeUpdate("
DELETE s FROM $statisticsOpensTable s DELETE s FROM $statisticsOpensTable s
WHERE s.`newsletter_id` IN (:ids) WHERE s.`newsletter_id` IN (:ids)
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]); ", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
$statisticsClicksTable = $this->entityManager->getClassMetadata(StatisticsClickEntity::class)->getTableName(); $statisticsClicksTable = $entityManager->getClassMetadata(StatisticsClickEntity::class)->getTableName();
$this->entityManager->getConnection()->executeUpdate(" $entityManager->getConnection()->executeUpdate("
DELETE s FROM $statisticsClicksTable s DELETE s FROM $statisticsClicksTable s
WHERE s.`newsletter_id` IN (:ids) WHERE s.`newsletter_id` IN (:ids)
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]); ", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
$statisticsPurchasesTable = $this->entityManager->getClassMetadata(StatisticsWooCommercePurchaseEntity::class)->getTableName(); $statisticsPurchasesTable = $entityManager->getClassMetadata(StatisticsWooCommercePurchaseEntity::class)->getTableName();
$this->entityManager->getConnection()->executeUpdate(" $entityManager->getConnection()->executeUpdate("
DELETE s FROM $statisticsPurchasesTable s DELETE s FROM $statisticsPurchasesTable s
WHERE s.`newsletter_id` IN (:ids) WHERE s.`newsletter_id` IN (:ids)
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]); ", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
// Delete newsletter posts // Delete newsletter posts
$postsTable = $this->entityManager->getClassMetadata(NewsletterPostEntity::class)->getTableName(); $postsTable = $entityManager->getClassMetadata(NewsletterPostEntity::class)->getTableName();
$this->entityManager->getConnection()->executeUpdate(" $entityManager->getConnection()->executeUpdate("
DELETE np FROM $postsTable np DELETE np FROM $postsTable np
WHERE np.`newsletter_id` IN (:ids) WHERE np.`newsletter_id` IN (:ids)
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]); ", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
// Delete newsletter options // Delete newsletter options
$optionsTable = $this->entityManager->getClassMetadata(NewsletterOptionEntity::class)->getTableName(); $optionsTable = $entityManager->getClassMetadata(NewsletterOptionEntity::class)->getTableName();
$this->entityManager->getConnection()->executeUpdate(" $entityManager->getConnection()->executeUpdate("
DELETE no FROM $optionsTable no DELETE no FROM $optionsTable no
WHERE no.`newsletter_id` IN (:ids) WHERE no.`newsletter_id` IN (:ids)
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]); ", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
// Delete newsletter links // Delete newsletter links
$linksTable = $this->entityManager->getClassMetadata(NewsletterLinkEntity::class)->getTableName(); $linksTable = $entityManager->getClassMetadata(NewsletterLinkEntity::class)->getTableName();
$this->entityManager->getConnection()->executeUpdate(" $entityManager->getConnection()->executeUpdate("
DELETE nl FROM $linksTable nl DELETE nl FROM $linksTable nl
WHERE nl.`newsletter_id` IN (:ids) WHERE nl.`newsletter_id` IN (:ids)
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]); ", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
// Delete stats notifications // Delete stats notifications
$statsNotificationsTable = $this->entityManager->getClassMetadata(StatsNotificationEntity::class)->getTableName(); $statsNotificationsTable = $entityManager->getClassMetadata(StatsNotificationEntity::class)->getTableName();
$this->entityManager->getConnection()->executeUpdate(" $entityManager->getConnection()->executeUpdate("
DELETE sn FROM $statsNotificationsTable sn DELETE sn FROM $statsNotificationsTable sn
WHERE sn.`newsletter_id` IN (:ids) WHERE sn.`newsletter_id` IN (:ids)
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]); ", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
// Delete scheduled tasks and scheduled task subscribers // Delete scheduled tasks and scheduled task subscribers
$scheduledTasksTable = $this->entityManager->getClassMetadata(ScheduledTaskEntity::class)->getTableName(); $scheduledTasksTable = $entityManager->getClassMetadata(ScheduledTaskEntity::class)->getTableName();
$sendingQueueTable = $this->entityManager->getClassMetadata(SendingQueueEntity::class)->getTableName(); $sendingQueueTable = $entityManager->getClassMetadata(SendingQueueEntity::class)->getTableName();
$scheduledTaskSubscribersTable = $this->entityManager->getClassMetadata(ScheduledTaskSubscriberEntity::class)->getTableName(); $scheduledTaskSubscribersTable = $entityManager->getClassMetadata(ScheduledTaskSubscriberEntity::class)->getTableName();
// Delete scheduled tasks subscribers // Delete scheduled tasks subscribers
$this->entityManager->getConnection()->executeUpdate(" $entityManager->getConnection()->executeUpdate("
DELETE ts FROM $scheduledTaskSubscribersTable ts DELETE ts FROM $scheduledTaskSubscribersTable ts
JOIN $scheduledTasksTable t ON t.`id` = ts.`task_id` JOIN $scheduledTasksTable t ON t.`id` = ts.`task_id`
JOIN $sendingQueueTable q ON q.`task_id` = t.`id` JOIN $sendingQueueTable q ON q.`task_id` = t.`id`
WHERE q.`newsletter_id` IN (:ids) WHERE q.`newsletter_id` IN (:ids)
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]); ", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
$this->entityManager->getConnection()->executeUpdate(" $entityManager->getConnection()->executeUpdate("
DELETE t FROM $scheduledTasksTable t DELETE t FROM $scheduledTasksTable t
JOIN $sendingQueueTable q ON t.`id` = q.`task_id` JOIN $sendingQueueTable q ON t.`id` = q.`task_id`
WHERE q.`newsletter_id` IN (:ids) WHERE q.`newsletter_id` IN (:ids)
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]); ", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
// Delete sending queues // Delete sending queues
$this->entityManager->getConnection()->executeUpdate(" $entityManager->getConnection()->executeUpdate("
DELETE q FROM $sendingQueueTable q DELETE q FROM $sendingQueueTable q
WHERE q.`newsletter_id` IN (:ids) WHERE q.`newsletter_id` IN (:ids)
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]); ", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
// Delete newsletter segments // Delete newsletter segments
$newsletterSegmentsTable = $this->entityManager->getClassMetadata(NewsletterSegmentEntity::class)->getTableName(); $newsletterSegmentsTable = $entityManager->getClassMetadata(NewsletterSegmentEntity::class)->getTableName();
$this->entityManager->getConnection()->executeUpdate(" $entityManager->getConnection()->executeUpdate("
DELETE ns FROM $newsletterSegmentsTable ns DELETE ns FROM $newsletterSegmentsTable ns
WHERE ns.`newsletter_id` IN (:ids) WHERE ns.`newsletter_id` IN (:ids)
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]); ", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
$queryBuilder = $this->entityManager->createQueryBuilder(); $queryBuilder = $entityManager->createQueryBuilder();
$queryBuilder->delete(NewsletterEntity::class, 'n') $queryBuilder->delete(NewsletterEntity::class, 'n')
->where('n.id IN (:ids)') ->where('n.id IN (:ids)')
->setParameter('ids', $ids) ->setParameter('ids', $ids)
->getQuery()->execute(); ->getQuery()->execute();
$this->entityManager->getConnection()->commit(); });
return count($ids); return count($ids);
} catch (\Exception $e) {
$this->entityManager->getConnection()->rollBack();
throw $e;
}
} }
private function fetchChildrenIds(array $parentIds) { private function fetchChildrenIds(array $parentIds) {