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