/** * @param EmailOrigin $origin */ protected function removeRemotelyRemovedEmails(EmailOrigin $origin) { $imapFolders = $this->getSyncEnabledImapFolders($origin); foreach ($imapFolders as $imapFolder) { $folder = $imapFolder->getFolder(); $this->manager->selectFolder($folder->getFullName()); $this->em->transactional(function () use($imapFolder, $folder) { $existingUids = $this->manager->getEmailUIDs(); $staleImapEmailsQb = $this->em->getRepository('OroImapBundle:ImapEmail')->createQueryBuilder('ie'); $staleImapEmailsQb->andWhere($staleImapEmailsQb->expr()->eq('ie.imapFolder', ':imap_folder'))->setParameter('imap_folder', $imapFolder); if ($existingUids) { $staleImapEmailsQb->andWhere($staleImapEmailsQb->expr()->notIn('ie.uid', ':uids'))->setParameter('uids', $existingUids); } $staleImapEmails = (new BufferedQueryResultIterator($staleImapEmailsQb))->setPageCallback(function () { $this->em->flush(); $this->em->clear(); }); /* @var $staleImapEmails ImapEmail[] */ foreach ($staleImapEmails as $imapEmail) { $email = $imapEmail->getEmail(); $email->getEmailUsers()->forAll(function ($key, EmailUser $emailUser) use($folder) { $emailUser->removeFolder($folder); if (!$emailUser->getFolders()->count()) { $this->em->remove($emailUser); } }); $this->em->remove($imapEmail); } }); } }