Skip to content

Commit 86eed24

Browse files
author
Sergii Kovalenko
authored
Merge pull request magento#1416 from magento-helix/MAGETWO-71434
Fixed Issues: - MAGETWO-71434 Generated pages with "html" extension are not cached by Varnish - MAGETWO-69559 Declaration of dependencies for indexers
2 parents 6df4b3c + 3a61096 commit 86eed24

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+3128
-489
lines changed

app/code/Magento/Indexer/Console/Command/AbstractIndexerCommand.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
namespace Magento\Indexer\Console\Command;
77

88
use Magento\Backend\App\Area\FrontNameResolver;
9-
use Magento\Framework\App\ObjectManager;
10-
use Magento\Framework\App\ObjectManager\ConfigLoader;
119
use Magento\Framework\ObjectManagerInterface;
1210
use Symfony\Component\Console\Command\Command;
1311
use Magento\Framework\Indexer\IndexerInterface;
@@ -49,13 +47,23 @@ public function __construct(
4947
}
5048

5149
/**
52-
* Get all indexers
50+
* Return the array of all indexers with keys as indexer ids.
5351
*
5452
* @return IndexerInterface[]
5553
*/
5654
protected function getAllIndexers()
5755
{
58-
return $this->getCollectionFactory()->create()->getItems();
56+
$indexers = $this->getCollectionFactory()->create()->getItems();
57+
return array_combine(
58+
array_map(
59+
function ($item) {
60+
/** @var IndexerInterface $item */
61+
return $item->getId();
62+
},
63+
$indexers
64+
),
65+
$indexers
66+
);
5967
}
6068

6169
/**

app/code/Magento/Indexer/Console/Command/AbstractIndexerManageCommand.php

Lines changed: 9 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,9 @@
55
*/
66
namespace Magento\Indexer\Console\Command;
77

8+
use Magento\Framework\Indexer\IndexerInterface;
89
use Symfony\Component\Console\Input\InputInterface;
9-
use Symfony\Component\Console\Output\OutputInterface;
10-
use Symfony\Component\Console\Input\InputOption;
1110
use Symfony\Component\Console\Input\InputArgument;
12-
use Magento\Framework\Indexer\IndexerInterface;
13-
use Magento\Framework\App\ObjectManagerFactory;
14-
use Magento\Indexer\Model\IndexerFactory;
1511

1612
/**
1713
* An Abstract class for all Indexer related commands.
@@ -24,26 +20,7 @@ abstract class AbstractIndexerManageCommand extends AbstractIndexerCommand
2420
const INPUT_KEY_INDEXERS = 'index';
2521

2622
/**
27-
* @var IndexerFactory
28-
*/
29-
private $indexerFactory;
30-
31-
/**
32-
* Constructor
33-
*
34-
* @param ObjectManagerFactory $objectManagerFactory
35-
* @param IndexerFactory|null $indexerFactory
36-
*/
37-
public function __construct(
38-
ObjectManagerFactory $objectManagerFactory,
39-
IndexerFactory $indexerFactory = null
40-
) {
41-
parent::__construct($objectManagerFactory);
42-
$this->indexerFactory = $indexerFactory;
43-
}
44-
45-
/**
46-
* Gets list of indexers
23+
* Returns the ordered list of indexers.
4724
*
4825
* @param InputInterface $input
4926
* @return IndexerInterface[]
@@ -56,32 +33,21 @@ protected function getIndexers(InputInterface $input)
5633
$requestedTypes = $input->getArgument(self::INPUT_KEY_INDEXERS);
5734
$requestedTypes = array_filter(array_map('trim', $requestedTypes), 'strlen');
5835
}
36+
5937
if (empty($requestedTypes)) {
60-
return $this->getAllIndexers();
38+
$indexers = $this->getAllIndexers();
6139
} else {
62-
$indexers = [];
63-
$unsupportedTypes = [];
64-
foreach ($requestedTypes as $code) {
65-
$indexer = $this->getIndexerFactory()->create();
66-
try {
67-
$indexer->load($code);
68-
$indexers[] = $indexer;
69-
} catch (\Exception $e) {
70-
$unsupportedTypes[] = $code;
71-
}
72-
}
40+
$availableIndexers = $this->getAllIndexers();
41+
$unsupportedTypes = array_diff($requestedTypes, array_keys($availableIndexers));
7342
if ($unsupportedTypes) {
74-
$availableTypes = [];
75-
$indexers = $this->getAllIndexers();
76-
foreach ($indexers as $indexer) {
77-
$availableTypes[] = $indexer->getId();
78-
}
7943
throw new \InvalidArgumentException(
8044
"The following requested index types are not supported: '" . join("', '", $unsupportedTypes)
81-
. "'." . PHP_EOL . 'Supported types: ' . join(", ", $availableTypes)
45+
. "'." . PHP_EOL . 'Supported types: ' . join(", ", array_keys($availableIndexers))
8246
);
8347
}
48+
$indexers = array_intersect_key($availableIndexers, array_flip($requestedTypes));
8449
}
50+
8551
return $indexers;
8652
}
8753

@@ -100,18 +66,4 @@ public function getInputList()
10066
),
10167
];
10268
}
103-
104-
/**
105-
* Get indexer factory
106-
*
107-
* @return IndexerFactory
108-
* @deprecated 100.2.0
109-
*/
110-
private function getIndexerFactory()
111-
{
112-
if (null === $this->indexerFactory) {
113-
$this->indexerFactory = $this->getObjectManager()->get(IndexerFactory::class);
114-
}
115-
return $this->indexerFactory;
116-
}
11769
}

app/code/Magento/Indexer/Console/Command/IndexerReindexCommand.php

Lines changed: 133 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55
*/
66
namespace Magento\Indexer\Console\Command;
77

8+
use Magento\Framework\Console\Cli;
89
use Magento\Framework\Exception\LocalizedException;
10+
use Magento\Framework\Indexer\Config\DependencyInfoProvider;
11+
use Magento\Framework\Indexer\IndexerInterface;
12+
use Magento\Framework\Indexer\IndexerRegistry;
913
use Magento\Framework\Indexer\StateInterface;
1014
use Symfony\Component\Console\Input\InputInterface;
1115
use Symfony\Component\Console\Output\OutputInterface;
1216
use Magento\Framework\Indexer\ConfigInterface;
1317
use 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
}

app/code/Magento/Indexer/Cron/ReindexAllInvalid.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
*/
66
namespace Magento\Indexer\Cron;
77

8-
use Magento\Indexer\Model\Indexer;
9-
108
class ReindexAllInvalid
119
{
1210
/**

0 commit comments

Comments
 (0)