diff -Nuar a/vendor/magento/module-sales/Cron/CleanExpiredQuotes.php b/vendor/magento/module-sales/Cron/CleanExpiredQuotes.php index a3242228b28..ecb7d5c0824 100644 --- a/vendor/magento/module-sales/Cron/CleanExpiredQuotes.php +++ b/vendor/magento/module-sales/Cron/CleanExpiredQuotes.php @@ -5,12 +5,19 @@ */ namespace Magento\Sales\Cron; -use Magento\Quote\Model\ResourceModel\Quote\Collection; +use Exception; +use Magento\Framework\DB\Query\Generator as QueryGenerator; +use Magento\Framework\DB\Select; +use Magento\Quote\Api\CartRepositoryInterface; +use Magento\Quote\Api\Data\CartInterfaceFactory; +use Magento\Quote\Model\ResourceModel\Quote as ResourceQuote; +use Magento\Quote\Model\ResourceModel\Quote\Collection as QuoteCollection; use Magento\Sales\Model\ResourceModel\Collection\ExpiredQuotesCollection; use Magento\Store\Model\StoreManagerInterface; +use Psr\Log\LoggerInterface; /** - * Class CleanExpiredQuotes + * Cron job for cleaning expired Quotes */ class CleanExpiredQuotes { @@ -25,15 +32,63 @@ class CleanExpiredQuotes private $storeManager; /** + * @var CartRepositoryInterface + */ + private $quoteRepository; + + /** + * @var CartInterfaceFactory + */ + private $quoteFactory; + + /** + * @var ResourceQuote + */ + private $quoteResource; + + /** + * @var QueryGenerator + */ + private $queryGenerator; + + /** + * @var LoggerInterface + */ + private $logger; + + /** + * @var int + */ + private $batchSize; + + /** * @param StoreManagerInterface $storeManager * @param ExpiredQuotesCollection $expiredQuotesCollection + * @param CartRepositoryInterface $quoteRepository + * @param CartInterfaceFactory $quoteFactory + * @param ResourceQuote $quoteResource + * @param QueryGenerator $queryGenerator + * @param LoggerInterface $logger + * @param int $batchSize */ public function __construct( StoreManagerInterface $storeManager, - ExpiredQuotesCollection $expiredQuotesCollection + ExpiredQuotesCollection $expiredQuotesCollection, + CartRepositoryInterface $quoteRepository, + CartInterfaceFactory $quoteFactory, + ResourceQuote $quoteResource, + QueryGenerator $queryGenerator, + LoggerInterface $logger, + int $batchSize = 1000 ) { $this->storeManager = $storeManager; $this->expiredQuotesCollection = $expiredQuotesCollection; + $this->quoteRepository = $quoteRepository; + $this->quoteFactory = $quoteFactory; + $this->quoteResource = $quoteResource; + $this->queryGenerator = $queryGenerator; + $this->logger = $logger; + $this->batchSize = $batchSize; } /** @@ -45,9 +100,41 @@ class CleanExpiredQuotes { $stores = $this->storeManager->getStores(true); foreach ($stores as $store) { - /** @var $quotes Collection */ - $quotes = $this->expiredQuotesCollection->getExpiredQuotes($store); - $quotes->walk('delete'); + /** @var QuoteCollection $quoteCollection */ + $quoteCollection = $this->expiredQuotesCollection->getExpiredQuotes($store); + + $select = $quoteCollection->getSelect() + ->reset(Select::COLUMNS) + ->columns(['main_table.' . $this->quoteResource->getIdFieldName()]); + $queries = $this->queryGenerator->generate( + $this->quoteResource->getIdFieldName(), + $select, + $this->batchSize + ); + foreach ($queries as $query) { + $this->deleteQuotes($query); + } + } + } + + /** + * Deletes all quotes from select + * + * @param Select $query + */ + private function deleteQuotes(Select $query): void + { + $quoteIds = $this->quoteResource->getConnection()->fetchCol($query); + foreach ($quoteIds as $quoteId) { + $quote = $this->quoteFactory->create(); + $quote->setId((int) $quoteId); + + try { + $this->quoteRepository->delete($quote); + } catch (Exception $e) { + $message = sprintf('Unable to delete expired quote (ID: %s)', $quoteId); + $this->logger->error($message, ['exception' => $e]); + } } } }