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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Indexer\Setup\Patch\Data;
use Magento\Framework\Encryption\Encryptor;
use Magento\Framework\Encryption\EncryptorInterface;
use Magento\Framework\Indexer\StateInterface;
use Magento\Framework\Json\EncoderInterface;
use Magento\Framework\Indexer\ConfigInterface;
use Magento\Indexer\Model\ResourceModel\Indexer\State\CollectionFactory;
use Magento\Indexer\Model\Indexer\State;
use Magento\Indexer\Model\Indexer\StateFactory;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\Setup\Patch\DataPatchInterface;
use Magento\Framework\Setup\Patch\PatchVersionInterface;
/**
* Class InitializeIndexerState
* @package Magento\Indexer\Setup\Patch
*/
class InitializeIndexerState implements DataPatchInterface, PatchVersionInterface
{
/**
* @var \Magento\Framework\Setup\ModuleDataSetupInterface
*/
private $moduleDataSetup;
/**
* @var CollectionFactory
*/
private $statesFactory;
/**
* @var StateFactory
*/
private $stateFactory;
/**
* @var ConfigInterface
*/
private $config;
/**
* @var EncryptorInterface
*/
private $encryptor;
/**
* @var EncoderInterface
*/
private $encoder;
/**
* PatchInitial constructor.
* @param \Magento\Framework\Setup\ModuleDataSetupInterface $moduleDataSetup
*/
public function __construct(
\Magento\Framework\Setup\ModuleDataSetupInterface $moduleDataSetup,
CollectionFactory $statesFactory,
StateFactory $stateFactory,
ConfigInterface $config,
EncryptorInterface $encryptor,
EncoderInterface $encoder
) {
$this->moduleDataSetup = $moduleDataSetup;
$this->statesFactory = $statesFactory;
$this->stateFactory = $stateFactory;
$this->config = $config;
$this->encryptor = $encryptor;
$this->encoder = $encoder;
}
/**
* {@inheritdoc}
*/
public function apply()
{
/** @var State[] $stateIndexers */
$stateIndexers = [];
$states = $this->statesFactory->create();
foreach ($states->getItems() as $state) {
/** @var State $state */
$stateIndexers[$state->getIndexerId()] = $state;
}
foreach ($this->config->getIndexers() as $indexerId => $indexerConfig) {
$hash = $this->encryptor->hash($this->encoder->encode($indexerConfig), Encryptor::HASH_VERSION_MD5);
if (isset($stateIndexers[$indexerId])) {
$stateIndexers[$indexerId]->setHashConfig($hash);
$stateIndexers[$indexerId]->save();
} else {
/** @var State $state */
$state = $this->stateFactory->create();
$state->loadByIndexer($indexerId);
$state->setHashConfig($hash);
$state->setStatus(StateInterface::STATUS_INVALID);
$state->save();
}
}
}
/**
* {@inheritdoc}
*/
public static function getDependencies()
{
return [];
}
/**
* {@inheritdoc}
*/
public static function getVersion()
{
return '2.1.0';
}
/**
* {@inheritdoc}
*/
public function getAliases()
{
return [];
}
}