-
Notifications
You must be signed in to change notification settings - Fork 9.4k
/
Copy pathBatchProvider.php
64 lines (58 loc) · 2.13 KB
/
BatchProvider.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Framework\Indexer;
use \Magento\Framework\DB\Adapter\AdapterInterface;
/**
* Generator of consecutive entity ID ranges that must be handled as a batch.
*
* Some ranges may contain non existent entity IDs.
* So the code that uses the generator must check if any entities were loaded during batch load.
*/
class BatchProvider implements BatchProviderInterface
{
/**
* @inheritdoc
*/
public function getBatches(AdapterInterface $adapter, $tableName, $linkField, $batchSize)
{
$maxLinkFieldValue = $adapter->fetchOne(
$adapter->select()->from(
['entity' => $tableName],
[
'max_value' => new \Zend_Db_Expr('MAX(entity.' . $linkField . ')')
]
)
);
/** @var int $truncatedBatchSize size of the last batch that is smaller than expected batch size */
$truncatedBatchSize = $maxLinkFieldValue % $batchSize;
/** @var int $fullBatchCount count of the batches that have expected batch size */
$fullBatchCount = ($maxLinkFieldValue - $truncatedBatchSize) / $batchSize;
for ($batchIndex = 0; $batchIndex < $fullBatchCount; $batchIndex ++) {
yield ['from' => $batchIndex * $batchSize + 1, 'to' => ($batchIndex + 1) * $batchSize];
}
// return the last batch if it has smaller size
if ($truncatedBatchSize > 0) {
yield ['from' => $fullBatchCount * $batchSize + 1, 'to' => $maxLinkFieldValue];
}
}
/**
* @inheritdoc
*/
public function getBatchIds(
\Magento\Framework\DB\Adapter\AdapterInterface $connection,
\Magento\Framework\DB\Select $select,
array $batch
) {
$betweenCondition = sprintf(
'(%s BETWEEN %s AND %s)',
'entity_id',
$connection->quote($batch['from']),
$connection->quote($batch['to'])
);
$ids = $connection->fetchCol($select->where($betweenCondition));
return array_map('intval', $ids);
}
}