15 use Symfony\Component\Console\Input\InputInterface;
16 use Symfony\Component\Console\Output\OutputInterface;
28 private $sharedIndexesComplete = [];
38 private $indexerRegistry;
43 private $dependencyInfoProvider;
55 $this->indexerRegistry = $indexerRegistry;
56 $this->dependencyInfoProvider = $dependencyInfoProvider;
65 $this->setName(
'indexer:reindex')
66 ->setDescription(
'Reindexes Data')
80 $this->validateIndexerStatus(
$indexer);
81 $startTime = microtime(
true);
82 $indexerConfig = $this->getConfig()->getIndexer(
$indexer->getId());
83 $sharedIndex = $indexerConfig[
'shared_index'];
86 if (!in_array($sharedIndex, $this->sharedIndexesComplete)) {
89 $this->validateSharedIndex($sharedIndex);
92 $resultTime = microtime(
true) - $startTime;
94 $indexer->getTitle() .
' index has been rebuilt successfully in ' .
gmdate(
'H:i:s', $resultTime)
98 $output->writeln($e->getMessage());
99 }
catch (\Exception $e) {
100 $output->writeln(
$indexer->getTitle() .
' indexer process unknown error:');
101 $output->writeln($e->getMessage());
112 $indexers = parent::getIndexers($input);
113 $allIndexers = $this->getAllIndexers();
114 if (!array_diff_key($allIndexers, $indexers)) {
118 $relatedIndexers = [];
119 $dependentIndexers = [];
121 $relatedIndexers = array_merge(
123 $this->getRelatedIndexerIds(
$indexer->getId())
125 $dependentIndexers = array_merge(
127 $this->getDependentIndexerIds(
$indexer->getId())
131 $invalidRelatedIndexers = [];
132 foreach (array_unique($relatedIndexers) as $relatedIndexer) {
133 if ($allIndexers[$relatedIndexer]->isInvalid()) {
134 $invalidRelatedIndexers[] = $relatedIndexer;
138 return array_intersect_key(
143 array_keys($indexers),
144 $invalidRelatedIndexers,
158 private function getRelatedIndexerIds(
string $indexerId)
160 $relatedIndexerIds = [];
161 foreach ($this->getDependencyInfoProvider()->getIndexerIdsToRunBefore($indexerId) as $relatedIndexerId) {
162 $relatedIndexerIds = array_merge(
165 $this->getRelatedIndexerIds($relatedIndexerId)
169 return array_unique($relatedIndexerIds);
178 private function getDependentIndexerIds(
string $indexerId)
180 $dependentIndexerIds = [];
182 $dependencies = $this->getDependencyInfoProvider()->getIndexerIdsToRunBefore(
$id);
183 if (array_search($indexerId, $dependencies) !==
false) {
184 $dependentIndexerIds = array_merge(
185 $dependentIndexerIds,
187 $this->getDependentIndexerIds(
$id)
192 return array_unique($dependentIndexerIds);
202 private function validateIndexerStatus(IndexerInterface
$indexer)
205 throw new LocalizedException(
207 '%1 index is locked by another reindex process. Skipping.',
220 private function getIndexerIdsBySharedIndex($sharedIndex)
222 $indexers = $this->getConfig()->getIndexers();
224 foreach ($indexers as $indexerConfig) {
225 if ($indexerConfig[
'shared_index'] == $sharedIndex) {
226 $result[] = $indexerConfig[
'indexer_id'];
238 private function validateSharedIndex($sharedIndex)
240 if (empty($sharedIndex)) {
241 throw new \InvalidArgumentException(
242 'The sharedIndex is an invalid shared index identifier. Verify the identifier and try again.' 245 $indexerIds = $this->getIndexerIdsBySharedIndex($sharedIndex);
246 if (empty($indexerIds)) {
249 foreach ($indexerIds as $indexerId) {
250 $indexer = $this->getIndexerRegistry()->get($indexerId);
256 $this->sharedIndexesComplete[] = $sharedIndex;
266 private function getConfig()
268 if (!$this->config) {
269 $this->config = $this->getObjectManager()->get(ConfigInterface::class);
271 return $this->config;
278 private function getIndexerRegistry()
280 if (!$this->indexerRegistry) {
281 $this->indexerRegistry = $this->getObjectManager()->get(IndexerRegistry::class);
283 return $this->indexerRegistry;
290 private function getDependencyInfoProvider()
292 if (!$this->dependencyInfoProvider) {
293 $this->dependencyInfoProvider = $this->getObjectManager()->get(DependencyInfoProvider::class);
295 return $this->dependencyInfoProvider;
execute(InputInterface $input, OutputInterface $output)
getIndexers(InputInterface $input)
__construct(ObjectManagerFactory $objectManagerFactory, IndexerRegistry $indexerRegistry=null, DependencyInfoProvider $dependencyInfoProvider=null)