Skip to content

Commit a70f829

Browse files
committed
Merge branch 'MC-37745' of https://github.com/magento-tango/magento2ce into PR-09-24-2020
2 parents 1dd2248 + a9c3691 commit a70f829

File tree

2 files changed

+51
-8
lines changed

2 files changed

+51
-8
lines changed

app/code/Magento/CatalogSearch/Model/Indexer/Fulltext.php

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Magento\CatalogSearch\Model\ResourceModel\Fulltext as FulltextResource;
1313
use Magento\Framework\App\ObjectManager;
1414
use Magento\Framework\Indexer\DimensionProviderInterface;
15+
use Magento\Framework\Indexer\SaveHandler\IndexerInterface;
1516
use Magento\Store\Model\StoreDimensionProvider;
1617
use Magento\Indexer\Model\ProcessManager;
1718

@@ -33,6 +34,11 @@ class Fulltext implements
3334
*/
3435
const INDEXER_ID = 'catalogsearch_fulltext';
3536

37+
/**
38+
* Default batch size
39+
*/
40+
private const BATCH_SIZE = 100;
41+
3642
/**
3743
* @var array index structure
3844
*/
@@ -77,6 +83,11 @@ class Fulltext implements
7783
*/
7884
private $processManager;
7985

86+
/**
87+
* @var int
88+
*/
89+
private $batchSize;
90+
8091
/**
8192
* @param FullFactory $fullActionFactory
8293
* @param IndexerHandlerFactory $indexerHandlerFactory
@@ -86,6 +97,7 @@ class Fulltext implements
8697
* @param DimensionProviderInterface $dimensionProvider
8798
* @param array $data
8899
* @param ProcessManager $processManager
100+
* @param int|null $batchSize
89101
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
90102
*/
91103
public function __construct(
@@ -96,7 +108,8 @@ public function __construct(
96108
StateFactory $indexScopeStateFactory,
97109
DimensionProviderInterface $dimensionProvider,
98110
array $data,
99-
ProcessManager $processManager = null
111+
ProcessManager $processManager = null,
112+
?int $batchSize = null
100113
) {
101114
$this->fullAction = $fullActionFactory->create(['data' => $data]);
102115
$this->indexerHandlerFactory = $indexerHandlerFactory;
@@ -106,6 +119,7 @@ public function __construct(
106119
$this->indexScopeState = ObjectManager::getInstance()->get(State::class);
107120
$this->dimensionProvider = $dimensionProvider;
108121
$this->processManager = $processManager ?: ObjectManager::getInstance()->get(ProcessManager::class);
122+
$this->batchSize = $batchSize ?? self::BATCH_SIZE;
109123
}
110124

111125
/**
@@ -148,13 +162,42 @@ public function executeByDimensions(array $dimensions, \Traversable $entityIds =
148162
} else {
149163
// internal implementation works only with array
150164
$entityIds = iterator_to_array($entityIds);
151-
$productIds = array_unique(
152-
array_merge($entityIds, $this->fulltextResource->getRelationsByChild($entityIds))
153-
);
154-
if ($saveHandler->isAvailable($dimensions)) {
155-
$saveHandler->deleteIndex($dimensions, new \ArrayIterator($productIds));
156-
$saveHandler->saveIndex($dimensions, $this->fullAction->rebuildStoreIndex($storeId, $productIds));
165+
$currentBatch = [];
166+
$i = 0;
167+
168+
foreach ($entityIds as $entityId) {
169+
$currentBatch[] = $entityId;
170+
if (++$i === $this->batchSize) {
171+
$this->processBatch($saveHandler, $dimensions, $currentBatch);
172+
$i = 0;
173+
$currentBatch = [];
174+
}
157175
}
176+
if (!empty($currentBatch)) {
177+
$this->processBatch($saveHandler, $dimensions, $currentBatch);
178+
}
179+
}
180+
}
181+
182+
/**
183+
* Process batch
184+
*
185+
* @param IndexerInterface $saveHandler
186+
* @param array $dimensions
187+
* @param array $entityIds
188+
*/
189+
private function processBatch(
190+
IndexerInterface $saveHandler,
191+
array $dimensions,
192+
array $entityIds
193+
) : void {
194+
$storeId = $dimensions[StoreDimensionProvider::DIMENSION_NAME]->getValue();
195+
$productIds = array_unique(
196+
array_merge($entityIds, $this->fulltextResource->getRelationsByChild($entityIds))
197+
);
198+
if ($saveHandler->isAvailable($dimensions)) {
199+
$saveHandler->deleteIndex($dimensions, new \ArrayIterator($productIds));
200+
$saveHandler->saveIndex($dimensions, $this->fullAction->rebuildStoreIndex($storeId, $productIds));
158201
}
159202
}
160203

app/code/Magento/CatalogSearch/Test/Unit/Model/Indexer/FulltextTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ private function setupDataProvider($stores)
144144
$dimension = $this->getMockBuilder(Dimension::class)
145145
->disableOriginalConstructor()
146146
->getMock();
147-
$dimension->expects($this->once())
147+
$dimension->expects($this->any())
148148
->method('getValue')
149149
->willReturn($storeId);
150150

0 commit comments

Comments
 (0)