55 */
66namespace Magento \Indexer \Console \Command ;
77
8+ use Magento \Framework \Console \Cli ;
89use Magento \Framework \Exception \LocalizedException ;
10+ use Magento \Framework \Indexer \Config \DependencyInfoProvider ;
11+ use Magento \Framework \Indexer \IndexerInterface ;
12+ use Magento \Framework \Indexer \IndexerRegistry ;
913use Magento \Framework \Indexer \StateInterface ;
1014use Symfony \Component \Console \Input \InputInterface ;
1115use Symfony \Component \Console \Output \OutputInterface ;
1216use Magento \Framework \Indexer \ConfigInterface ;
1317use Magento \Framework \App \ObjectManagerFactory ;
14- use Magento \Indexer \Model \IndexerFactory ;
1518
1619/**
1720 * Command to run indexers
@@ -24,27 +27,33 @@ class IndexerReindexCommand extends AbstractIndexerManageCommand
2427 private $ sharedIndexesComplete = [];
2528
2629 /**
27- * @var \Magento\Framework\Indexer\ ConfigInterface
30+ * @var ConfigInterface
2831 */
2932 private $ config ;
3033
3134 /**
32- * @var IndexerFactory
35+ * @var IndexerRegistry
3336 */
34- private $ indexerFactory ;
37+ private $ indexerRegistry ;
38+
39+ /**
40+ * @var DependencyInfoProvider|null
41+ */
42+ private $ dependencyInfoProvider ;
3543
3644 /**
37- * Constructor
38- *
3945 * @param ObjectManagerFactory $objectManagerFactory
40- * @param IndexerFactory|null $indexerFactory
46+ * @param IndexerRegistry|null $indexerRegistry
47+ * @param DependencyInfoProvider|null $dependencyInfoProvider
4148 */
4249 public function __construct (
4350 ObjectManagerFactory $ objectManagerFactory ,
44- IndexerFactory $ indexerFactory = null
51+ IndexerRegistry $ indexerRegistry = null ,
52+ DependencyInfoProvider $ dependencyInfoProvider = null
4553 ) {
46- parent ::__construct ($ objectManagerFactory , $ indexerFactory );
47- $ this ->indexerFactory = $ indexerFactory ;
54+ $ this ->indexerRegistry = $ indexerRegistry ;
55+ $ this ->dependencyInfoProvider = $ dependencyInfoProvider ;
56+ parent ::__construct ($ objectManagerFactory );
4857 }
4958
5059 /**
@@ -64,9 +73,8 @@ protected function configure()
6473 */
6574 protected function execute (InputInterface $ input , OutputInterface $ output )
6675 {
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 ) {
7078 try {
7179 $ this ->validateIndexerStatus ($ indexer );
7280 $ startTime = microtime (true );
@@ -84,30 +92,115 @@ protected function execute(InputInterface $input, OutputInterface $output)
8492 $ output ->writeln (
8593 $ indexer ->getTitle () . ' index has been rebuilt successfully in ' . gmdate ('H:i:s ' , $ resultTime )
8694 );
95+ $ returnValue = Cli::RETURN_SUCCESS ;
8796 } catch (LocalizedException $ e ) {
8897 $ 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 ;
9198 } catch (\Exception $ e ) {
9299 $ output ->writeln ($ indexer ->getTitle () . ' indexer process unknown error: ' );
93100 $ 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 ;
96101 }
97102 }
98103 return $ returnValue ;
99104 }
100105
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+
101194 /**
102195 * Validate that indexer is not locked
103196 *
104- * @param \Magento\Framework\Indexer\ IndexerInterface $indexer
197+ * @param IndexerInterface $indexer
105198 * @return void
106199 * @throws LocalizedException
107200 */
108- private function validateIndexerStatus (\ Magento \ Framework \ Indexer \ IndexerInterface $ indexer )
201+ private function validateIndexerStatus (IndexerInterface $ indexer )
109202 {
110- if ($ indexer ->getStatus () == \ Magento \ Framework \ Indexer \ StateInterface::STATUS_WORKING ) {
203+ if ($ indexer ->getStatus () == StateInterface::STATUS_WORKING ) {
111204 throw new LocalizedException (
112205 __ (
113206 '%1 index is locked by another reindex process. Skipping. ' ,
@@ -151,12 +244,10 @@ private function validateSharedIndex($sharedIndex)
151244 return $ this ;
152245 }
153246 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 );
157248 /** @var \Magento\Indexer\Model\Indexer\State $state */
158249 $ state = $ indexer ->getState ();
159- $ state ->setStatus (\ Magento \ Framework \ Indexer \ StateInterface::STATUS_VALID );
250+ $ state ->setStatus (StateInterface::STATUS_VALID );
160251 $ state ->save ();
161252 }
162253 $ this ->sharedIndexesComplete [] = $ sharedIndex ;
@@ -166,7 +257,7 @@ private function validateSharedIndex($sharedIndex)
166257 /**
167258 * Get config
168259 *
169- * @return \Magento\Framework\Indexer\ ConfigInterface
260+ * @return ConfigInterface
170261 * @deprecated 100.1.0
171262 */
172263 private function getConfig ()
@@ -178,16 +269,26 @@ private function getConfig()
178269 }
179270
180271 /**
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
184285 * @deprecated 100.2.0
185286 */
186- private function getIndexerFactory ()
287+ private function getDependencyInfoProvider ()
187288 {
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);
190291 }
191- return $ this ->indexerFactory ;
292+ return $ this ->dependencyInfoProvider ;
192293 }
193294}
0 commit comments