From b9474700b86eb3dab768df9eb64c1fa08f66f2bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lys=C3=BD?= Date: Mon, 25 Jan 2021 15:34:43 +0100 Subject: [PATCH] Use a query for duplication of segment subscribers [MAILPOET-3170] --- lib/Segments/SegmentSaveController.php | 35 ++++++++++---------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/lib/Segments/SegmentSaveController.php b/lib/Segments/SegmentSaveController.php index 9f8b2e8935..debfe20458 100644 --- a/lib/Segments/SegmentSaveController.php +++ b/lib/Segments/SegmentSaveController.php @@ -5,26 +5,20 @@ namespace MailPoet\Segments; use InvalidArgumentException; use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SubscriberSegmentEntity; -use MailPoet\Subscribers\SubscriberSegmentRepository; use MailPoetVendor\Doctrine\ORM\EntityManager; class SegmentSaveController { /** @var SegmentsRepository */ private $segmentsRepository; - /** @var SubscriberSegmentRepository */ - private $subscriberSegmentRepository; - /** @var EntityManager */ private $entityManager; public function __construct( SegmentsRepository $segmentsRepository, - SubscriberSegmentRepository $subscriberSegmentRepository, EntityManager $entityManager ) { $this->segmentsRepository = $segmentsRepository; - $this->subscriberSegmentRepository = $subscriberSegmentRepository; $this->entityManager = $entityManager; } @@ -44,25 +38,22 @@ class SegmentSaveController { $this->checkSegmenUniqueName($duplicate->getName(), $duplicate->getId()); - $subscriberSegments = $this->subscriberSegmentRepository->findBy(['segment' => $segmentEntity]); - - $this->entityManager->transactional(function (EntityManager $entityManager) use ($duplicate, $subscriberSegments) { + $this->entityManager->transactional(function (EntityManager $entityManager) use ($duplicate, $segmentEntity) { $entityManager->persist($duplicate); $entityManager->flush(); - foreach ($subscriberSegments as $subscriberSegment) { - $subscriber = $subscriberSegment->getSubscriber(); - if (!$subscriber) { - continue; - } - $subscriberDuplicate = new SubscriberSegmentEntity( - $duplicate, - $subscriber, - $subscriberSegment->getStatus() - ); - $entityManager->persist($subscriberDuplicate); - } - $entityManager->flush(); + $subscriberSegmentTable = $entityManager->getClassMetadata(SubscriberSegmentEntity::class)->getTableName(); + $conn = $this->entityManager->getConnection(); + $stmt = $conn->prepare(" + INSERT INTO $subscriberSegmentTable (segment_id, subscriber_id, status, created_at) + SELECT :duplicateId, subscriber_id, status, NOW() + FROM $subscriberSegmentTable + WHERE segment_id = :segmentId + "); + $stmt->execute([ + 'duplicateId' => $duplicate->getId(), + 'segmentId' => $segmentEntity->getId(), + ]); }); return $duplicate;