5
5
*/
6
6
namespace Magento \Indexer \Console \Command ;
7
7
8
+ use Magento \Framework \Console \Cli ;
8
9
use Magento \Framework \Exception \LocalizedException ;
10
+ use Magento \Framework \Indexer \Config \DependencyInfoProvider ;
11
+ use Magento \Framework \Indexer \IndexerInterface ;
12
+ use Magento \Framework \Indexer \IndexerRegistry ;
9
13
use Magento \Framework \Indexer \StateInterface ;
10
14
use Symfony \Component \Console \Input \InputInterface ;
11
15
use Symfony \Component \Console \Output \OutputInterface ;
12
16
use Magento \Framework \Indexer \ConfigInterface ;
13
17
use Magento \Framework \App \ObjectManagerFactory ;
14
- use Magento \Indexer \Model \IndexerFactory ;
15
18
16
19
/**
17
20
* Command to run indexers
@@ -24,27 +27,33 @@ class IndexerReindexCommand extends AbstractIndexerManageCommand
24
27
private $ sharedIndexesComplete = [];
25
28
26
29
/**
27
- * @var \Magento\Framework\Indexer\ ConfigInterface
30
+ * @var ConfigInterface
28
31
*/
29
32
private $ config ;
30
33
31
34
/**
32
- * @var IndexerFactory
35
+ * @var IndexerRegistry
33
36
*/
34
- private $ indexerFactory ;
37
+ private $ indexerRegistry ;
38
+
39
+ /**
40
+ * @var DependencyInfoProvider|null
41
+ */
42
+ private $ dependencyInfoProvider ;
35
43
36
44
/**
37
- * Constructor
38
- *
39
45
* @param ObjectManagerFactory $objectManagerFactory
40
- * @param IndexerFactory|null $indexerFactory
46
+ * @param IndexerRegistry|null $indexerRegistry
47
+ * @param DependencyInfoProvider|null $dependencyInfoProvider
41
48
*/
42
49
public function __construct (
43
50
ObjectManagerFactory $ objectManagerFactory ,
44
- IndexerFactory $ indexerFactory = null
51
+ IndexerRegistry $ indexerRegistry = null ,
52
+ DependencyInfoProvider $ dependencyInfoProvider = null
45
53
) {
46
- parent ::__construct ($ objectManagerFactory , $ indexerFactory );
47
- $ this ->indexerFactory = $ indexerFactory ;
54
+ $ this ->indexerRegistry = $ indexerRegistry ;
55
+ $ this ->dependencyInfoProvider = $ dependencyInfoProvider ;
56
+ parent ::__construct ($ objectManagerFactory );
48
57
}
49
58
50
59
/**
@@ -64,9 +73,8 @@ protected function configure()
64
73
*/
65
74
protected function execute (InputInterface $ input , OutputInterface $ output )
66
75
{
67
- $ indexers = $ this ->getIndexers ($ input );
68
- $ returnValue = \Magento \Framework \Console \Cli::RETURN_SUCCESS ;
69
- foreach ($ indexers as $ indexer ) {
76
+ $ returnValue = Cli::RETURN_FAILURE ;
77
+ foreach ($ this ->getIndexers ($ input ) as $ indexer ) {
70
78
try {
71
79
$ this ->validateIndexerStatus ($ indexer );
72
80
$ startTime = microtime (true );
@@ -84,30 +92,115 @@ protected function execute(InputInterface $input, OutputInterface $output)
84
92
$ output ->writeln (
85
93
$ indexer ->getTitle () . ' index has been rebuilt successfully in ' . gmdate ('H:i:s ' , $ resultTime )
86
94
);
95
+ $ returnValue = Cli::RETURN_SUCCESS ;
87
96
} catch (LocalizedException $ e ) {
88
97
$ output ->writeln ($ e ->getMessage ());
89
- // we must have an exit code higher than zero to indicate something was wrong
90
- $ returnValue = \Magento \Framework \Console \Cli::RETURN_FAILURE ;
91
98
} catch (\Exception $ e ) {
92
99
$ output ->writeln ($ indexer ->getTitle () . ' indexer process unknown error: ' );
93
100
$ output ->writeln ($ e ->getMessage ());
94
- // we must have an exit code higher than zero to indicate something was wrong
95
- $ returnValue = \Magento \Framework \Console \Cli::RETURN_FAILURE ;
96
101
}
97
102
}
98
103
return $ returnValue ;
99
104
}
100
105
106
+ /**
107
+ * {@inheritdoc} Returns the ordered list of specified indexers and related indexers.
108
+ */
109
+ protected function getIndexers (InputInterface $ input )
110
+ {
111
+ $ indexers = parent ::getIndexers ($ input );
112
+ $ allIndexers = $ this ->getAllIndexers ();
113
+ if (!array_diff_key ($ allIndexers , $ indexers )) {
114
+ return $ indexers ;
115
+ }
116
+
117
+ $ relatedIndexers = [];
118
+ $ dependentIndexers = [];
119
+ foreach ($ indexers as $ indexer ) {
120
+ $ relatedIndexers = array_merge (
121
+ $ relatedIndexers ,
122
+ $ this ->getRelatedIndexerIds ($ indexer ->getId ())
123
+ );
124
+ $ dependentIndexers = array_merge (
125
+ $ dependentIndexers ,
126
+ $ this ->getDependentIndexerIds ($ indexer ->getId ())
127
+ );
128
+ }
129
+
130
+ $ invalidRelatedIndexers = [];
131
+ foreach (array_unique ($ relatedIndexers ) as $ relatedIndexer ) {
132
+ if ($ allIndexers [$ relatedIndexer ]->isInvalid ()) {
133
+ $ invalidRelatedIndexers [] = $ relatedIndexer ;
134
+ }
135
+ }
136
+
137
+ return array_intersect_key (
138
+ $ allIndexers ,
139
+ array_flip (
140
+ array_unique (
141
+ array_merge (
142
+ array_keys ($ indexers ),
143
+ $ invalidRelatedIndexers ,
144
+ $ dependentIndexers
145
+ )
146
+ )
147
+ )
148
+ );
149
+ }
150
+
151
+ /**
152
+ * Return all indexer Ids on which the current indexer depends (directly or indirectly).
153
+ *
154
+ * @param string $indexerId
155
+ * @return array
156
+ */
157
+ private function getRelatedIndexerIds (string $ indexerId )
158
+ {
159
+ $ relatedIndexerIds = [];
160
+ foreach ($ this ->getDependencyInfoProvider ()->getIndexerIdsToRunBefore ($ indexerId ) as $ relatedIndexerId ) {
161
+ $ relatedIndexerIds = array_merge (
162
+ $ relatedIndexerIds ,
163
+ [$ relatedIndexerId ],
164
+ $ this ->getRelatedIndexerIds ($ relatedIndexerId )
165
+ );
166
+ }
167
+
168
+ return array_unique ($ relatedIndexerIds );
169
+ }
170
+
171
+ /**
172
+ * Return all indexer Ids which depend on the current indexer (directly or indirectly).
173
+ *
174
+ * @param string $indexerId
175
+ * @return array
176
+ */
177
+ private function getDependentIndexerIds (string $ indexerId )
178
+ {
179
+ $ dependentIndexerIds = [];
180
+ foreach (array_keys ($ this ->getConfig ()->getIndexers ()) as $ id ) {
181
+ $ dependencies = $ this ->getDependencyInfoProvider ()->getIndexerIdsToRunBefore ($ id );
182
+ if (array_search ($ indexerId , $ dependencies ) !== false ) {
183
+ $ dependentIndexerIds = array_merge (
184
+ $ dependentIndexerIds ,
185
+ [$ id ],
186
+ $ this ->getDependentIndexerIds ($ id )
187
+ );
188
+ }
189
+ };
190
+
191
+ return array_unique ($ dependentIndexerIds );
192
+ }
193
+
101
194
/**
102
195
* Validate that indexer is not locked
103
196
*
104
- * @param \Magento\Framework\Indexer\ IndexerInterface $indexer
197
+ * @param IndexerInterface $indexer
105
198
* @return void
106
199
* @throws LocalizedException
107
200
*/
108
- private function validateIndexerStatus (\ Magento \ Framework \ Indexer \ IndexerInterface $ indexer )
201
+ private function validateIndexerStatus (IndexerInterface $ indexer )
109
202
{
110
- if ($ indexer ->getStatus () == \ Magento \ Framework \ Indexer \ StateInterface::STATUS_WORKING ) {
203
+ if ($ indexer ->getStatus () == StateInterface::STATUS_WORKING ) {
111
204
throw new LocalizedException (
112
205
__ (
113
206
'%1 index is locked by another reindex process. Skipping. ' ,
@@ -151,12 +244,10 @@ private function validateSharedIndex($sharedIndex)
151
244
return $ this ;
152
245
}
153
246
foreach ($ indexerIds as $ indexerId ) {
154
- /** @var \Magento\Indexer\Model\Indexer $indexer */
155
- $ indexer = $ this ->getIndexerFactory ()->create ();
156
- $ indexer ->load ($ indexerId );
247
+ $ indexer = $ this ->getIndexerRegistry ()->get ($ indexerId );
157
248
/** @var \Magento\Indexer\Model\Indexer\State $state */
158
249
$ state = $ indexer ->getState ();
159
- $ state ->setStatus (\ Magento \ Framework \ Indexer \ StateInterface::STATUS_VALID );
250
+ $ state ->setStatus (StateInterface::STATUS_VALID );
160
251
$ state ->save ();
161
252
}
162
253
$ this ->sharedIndexesComplete [] = $ sharedIndex ;
@@ -166,7 +257,7 @@ private function validateSharedIndex($sharedIndex)
166
257
/**
167
258
* Get config
168
259
*
169
- * @return \Magento\Framework\Indexer\ ConfigInterface
260
+ * @return ConfigInterface
170
261
* @deprecated 100.1.0
171
262
*/
172
263
private function getConfig ()
@@ -178,16 +269,26 @@ private function getConfig()
178
269
}
179
270
180
271
/**
181
- * Get indexer factory
182
- *
183
- * @return IndexerFactory
272
+ * @return IndexerRegistry
273
+ * @deprecated 100.2.0
274
+ */
275
+ private function getIndexerRegistry ()
276
+ {
277
+ if (!$ this ->indexerRegistry ) {
278
+ $ this ->indexerRegistry = $ this ->getObjectManager ()->get (IndexerRegistry::class);
279
+ }
280
+ return $ this ->indexerRegistry ;
281
+ }
282
+
283
+ /**
284
+ * @return DependencyInfoProvider
184
285
* @deprecated 100.2.0
185
286
*/
186
- private function getIndexerFactory ()
287
+ private function getDependencyInfoProvider ()
187
288
{
188
- if (null === $ this ->indexerFactory ) {
189
- $ this ->indexerFactory = $ this ->getObjectManager ()->get (IndexerFactory ::class);
289
+ if (! $ this ->dependencyInfoProvider ) {
290
+ $ this ->dependencyInfoProvider = $ this ->getObjectManager ()->get (DependencyInfoProvider ::class);
190
291
}
191
- return $ this ->indexerFactory ;
292
+ return $ this ->dependencyInfoProvider ;
192
293
}
193
294
}
0 commit comments