diff -Nuar a/vendor/magento/module-inventory-configurable-product-indexer/Indexer/SelectBuilder.php b/vendor/magento/module-inventory-configurable-product-indexer/Indexer/SelectBuilder.php index 481056b5eb1..825775bc61f 100644 --- a/vendor/magento/module-inventory-configurable-product-indexer/Indexer/SelectBuilder.php +++ b/vendor/magento/module-inventory-configurable-product-indexer/Indexer/SelectBuilder.php @@ -15,10 +15,11 @@ use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexNameBuilder; use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexNameResolverInterface; use Magento\InventoryIndexer\Indexer\IndexStructure; use Magento\InventoryIndexer\Indexer\InventoryIndexer; +use Magento\InventoryIndexer\Indexer\SelectBuilderInterface; use Magento\Framework\EntityManager\MetadataPool; use Magento\Catalog\Api\Data\ProductInterface; -class SelectBuilder +class SelectBuilder implements SelectBuilderInterface { /** * @var ResourceConnection diff -Nuar a/vendor/magento/module-inventory-configurable-product-indexer/Indexer/SourceItem/SourceItemIndexer.php b/vendor/magento/module-inventory-configurable-product-indexer/Indexer/SourceItem/SourceItemIndexer.php index c6a798592ad..4ba73966192 100644 --- a/vendor/magento/module-inventory-configurable-product-indexer/Indexer/SourceItem/SourceItemIndexer.php +++ b/vendor/magento/module-inventory-configurable-product-indexer/Indexer/SourceItem/SourceItemIndexer.php @@ -7,17 +7,30 @@ declare(strict_types=1); namespace Magento\InventoryConfigurableProductIndexer\Indexer\SourceItem; +use Magento\Framework\App\ObjectManager; use Magento\Framework\App\ResourceConnection; +use Magento\Framework\Indexer\SaveHandler\Batch; use Magento\InventoryMultiDimensionalIndexerApi\Model\Alias; use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexHandlerInterface; use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexNameBuilder; use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexStructureInterface; use Magento\InventoryCatalogApi\Api\DefaultStockProviderInterface; use Magento\InventoryIndexer\Indexer\InventoryIndexer; +use ArrayIterator; +/** + * Configurable product source item indexer + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) Will be removed after deleting DefaultStockProviderInterface + */ class SourceItemIndexer { /** + * Default batch size + */ + private const BATCH_SIZE = 100; + + /** * @var ResourceConnection */ private $resourceConnection; @@ -53,6 +66,16 @@ class SourceItemIndexer private $defaultStockProvider; /** + * @var int + */ + private $batchSize; + + /** + * @var Batch + */ + private $batch; + + /** * @param ResourceConnection $resourceConnection * @param IndexNameBuilder $indexNameBuilder * @param IndexHandlerInterface $indexHandler @@ -60,6 +83,8 @@ class SourceItemIndexer * @param IndexDataBySkuListProvider $indexDataBySkuListProvider * @param SiblingSkuListInStockProvider $siblingSkuListInStockProvider * @param DefaultStockProviderInterface $defaultStockProvider + * @param Batch|null $batch + * @param int|null $batchSize */ public function __construct( ResourceConnection $resourceConnection, @@ -68,7 +93,9 @@ class SourceItemIndexer IndexStructureInterface $indexStructure, IndexDataBySkuListProvider $indexDataBySkuListProvider, SiblingSkuListInStockProvider $siblingSkuListInStockProvider, - DefaultStockProviderInterface $defaultStockProvider + DefaultStockProviderInterface $defaultStockProvider, + ?Batch $batch = null, + ?int $batchSize = null ) { $this->resourceConnection = $resourceConnection; $this->indexNameBuilder = $indexNameBuilder; @@ -77,9 +104,13 @@ class SourceItemIndexer $this->indexStructure = $indexStructure; $this->siblingSkuListInStockProvider = $siblingSkuListInStockProvider; $this->defaultStockProvider = $defaultStockProvider; + $this->batch = $batch ?: ObjectManager::getInstance()->get(Batch::class); + $this->batchSize = $batchSize ?? self::BATCH_SIZE; } /** + * Executes index by list of stock ids + * * @param array $sourceItemIds */ public function executeList(array $sourceItemIds) @@ -106,17 +137,20 @@ class SourceItemIndexer $indexData = $this->indexDataBySkuListProvider->execute($stockId, $skuList); - $this->indexHandler->cleanIndex( - $mainIndexName, - $indexData, - ResourceConnection::DEFAULT_CONNECTION - ); - - $this->indexHandler->saveIndex( - $mainIndexName, - $indexData, - ResourceConnection::DEFAULT_CONNECTION - ); + foreach ($this->batch->getItems($indexData, $this->batchSize) as $batchData) { + $batchIndexData = new ArrayIterator($batchData); + $this->indexHandler->cleanIndex( + $mainIndexName, + $batchIndexData, + ResourceConnection::DEFAULT_CONNECTION + ); + + $this->indexHandler->saveIndex( + $mainIndexName, + $batchIndexData, + ResourceConnection::DEFAULT_CONNECTION + ); + } } } } diff -Nuar a/vendor/magento/module-inventory-configurable-product-indexer/Indexer/Stock/StockIndexer.php b/vendor/magento/module-inventory-configurable-product-indexer/Indexer/Stock/StockIndexer.php index 68bba4793de..4f081613b90 100644 --- a/vendor/magento/module-inventory-configurable-product-indexer/Indexer/Stock/StockIndexer.php +++ b/vendor/magento/module-inventory-configurable-product-indexer/Indexer/Stock/StockIndexer.php @@ -10,6 +10,7 @@ namespace Magento\InventoryConfigurableProductIndexer\Indexer\Stock; use Magento\Framework\App\ObjectManager; use Magento\Framework\App\ResourceConnection; use Magento\Framework\Exception\StateException; +use Magento\Framework\Indexer\SaveHandler\Batch; use Magento\InventoryCatalogApi\Api\DefaultStockProviderInterface; use Magento\InventoryIndexer\Indexer\InventoryIndexer; use Magento\InventoryIndexer\Indexer\Stock\GetAllStockIds; @@ -19,6 +20,7 @@ use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexHandlerInterface; use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexNameBuilder; use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexStructureInterface; use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexTableSwitcherInterface; +use ArrayIterator; /** * Configurable product stock indexer class @@ -28,6 +30,11 @@ use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexTableSwitcherInterfac class StockIndexer { /** + * Default batch size + */ + private const BATCH_SIZE = 100; + + /** * @var GetAllStockIds */ private $getAllStockIds; @@ -68,6 +75,16 @@ class StockIndexer private $prepareIndexDataForClearingIndex; /** + * @var int + */ + private $batchSize; + + /** + * @var Batch + */ + private $batch; + + /** * $indexStructure is reserved name for construct variable in index internal mechanism * * @param GetAllStockIds $getAllStockIds @@ -78,6 +95,9 @@ class StockIndexer * @param IndexTableSwitcherInterface $indexTableSwitcher * @param DefaultStockProviderInterface $defaultStockProvider * @param PrepareIndexDataForClearingIndex|null $prepareIndexDataForClearingIndex + * @param Batch|null $batch + * @param int|null $batchSize + * @SuppressWarnings(PHPMD.ExcessiveParameterList) All parameters are needed for backward compatibility */ public function __construct( GetAllStockIds $getAllStockIds, @@ -87,7 +107,9 @@ class StockIndexer IndexDataByStockIdProvider $indexDataByStockIdProvider, IndexTableSwitcherInterface $indexTableSwitcher, DefaultStockProviderInterface $defaultStockProvider, - PrepareIndexDataForClearingIndex $prepareIndexDataForClearingIndex = null + PrepareIndexDataForClearingIndex $prepareIndexDataForClearingIndex = null, + ?Batch $batch = null, + ?int $batchSize = null ) { $this->getAllStockIds = $getAllStockIds; $this->indexStructure = $indexStructure; @@ -98,6 +120,8 @@ class StockIndexer $this->defaultStockProvider = $defaultStockProvider; $this->prepareIndexDataForClearingIndex = $prepareIndexDataForClearingIndex ?: ObjectManager::getInstance() ->get(PrepareIndexDataForClearingIndex::class); + $this->batch = $batch ?: ObjectManager::getInstance()->get(Batch::class); + $this->batchSize = $batchSize ?? self::BATCH_SIZE; } /** @@ -150,17 +174,20 @@ class StockIndexer $indexData = $this->indexDataByStockIdProvider->execute((int)$stockId); - $this->indexHandler->cleanIndex( - $mainIndexName, - $this->prepareIndexDataForClearingIndex->execute($indexData), - ResourceConnection::DEFAULT_CONNECTION - ); - - $this->indexHandler->saveIndex( - $mainIndexName, - $indexData, - ResourceConnection::DEFAULT_CONNECTION - ); + foreach ($this->batch->getItems($indexData, $this->batchSize) as $batchData) { + $batchIndexData = new ArrayIterator($batchData); + $this->indexHandler->cleanIndex( + $mainIndexName, + $this->prepareIndexDataForClearingIndex->execute($batchIndexData), + ResourceConnection::DEFAULT_CONNECTION + ); + + $this->indexHandler->saveIndex( + $mainIndexName, + $batchIndexData, + ResourceConnection::DEFAULT_CONNECTION + ); + } } } } diff -Nuar a/vendor/magento/module-inventory-configurable-product-indexer/etc/di.xml b/vendor/magento/module-inventory-configurable-product-indexer/etc/di.xml index 9def048d6c7..781c907f14b 100644 --- a/vendor/magento/module-inventory-configurable-product-indexer/etc/di.xml +++ b/vendor/magento/module-inventory-configurable-product-indexer/etc/di.xml @@ -14,16 +14,25 @@ + + + + Magento\InventoryConfigurableProductIndexer\Indexer\SelectBuilder + + + Magento\InventoryIndexer\Indexer\IndexHandler Magento\InventoryIndexer\Indexer\IndexStructure + 100 Magento\InventoryIndexer\Indexer\IndexHandler Magento\InventoryIndexer\Indexer\IndexStructure + 100 diff -Nuar a/vendor/magento/module-inventory-indexer/Indexer/SelectBuilder.php b/vendor/magento/module-inventory-indexer/Indexer/SelectBuilder.php index ac1beea684b..ef24b60714e 100644 --- a/vendor/magento/module-inventory-indexer/Indexer/SelectBuilder.php +++ b/vendor/magento/module-inventory-indexer/Indexer/SelectBuilder.php @@ -20,7 +20,7 @@ use Magento\InventorySales\Model\ResourceModel\IsStockItemSalableCondition\GetIs /** * Select builder */ -class SelectBuilder +class SelectBuilder implements SelectBuilderInterface { /** * @var ResourceConnection diff -Nuar a/vendor/magento/module-inventory-indexer/Indexer/SelectBuilderInterface.php b/vendor/magento/module-inventory-indexer/Indexer/SelectBuilderInterface.php new file mode 100644 index 00000000000..d0500f3cb97 --- /dev/null +++ b/vendor/magento/module-inventory-indexer/Indexer/SelectBuilderInterface.php @@ -0,0 +1,24 @@ +resourceConnection = $resourceConnection; - $this->selectBuilder = $selectBuilder; + + foreach ($selectBuilders as $selectBuilder) { + if (!$selectBuilder instanceof SelectBuilderInterface) { + throw new LocalizedException( + __('SelectBuilder must implement SelectBuilderInterface.') + ); + } + } + $this->selectBuilders = $selectBuilders; } /** + * Returns selected data + * * @param int $stockId + * @throws \Exception * @return ArrayIterator */ public function execute(int $stockId): ArrayIterator { - $select = $this->selectBuilder->execute($stockId); - + $result = []; $connection = $this->resourceConnection->getConnection(); - return new ArrayIterator($connection->fetchAll($select)); + + foreach ($this->selectBuilders as $selectBuilder) { + $select = $selectBuilder->execute($stockId); + $result[] = $connection->fetchAll($select); + } + + return new ArrayIterator(array_merge([], ...$result)); } } diff -Nuar a/vendor/magento/module-inventory-indexer/etc/di.xml b/vendor/magento/module-inventory-indexer/etc/di.xml index f6914e24ab7..3ffc61314f5 100644 --- a/vendor/magento/module-inventory-indexer/etc/di.xml +++ b/vendor/magento/module-inventory-indexer/etc/di.xml @@ -24,6 +24,13 @@ + + + + Magento\InventoryIndexer\Indexer\SelectBuilder + + + 100