123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Indexer\Console\Command;
- use Magento\Framework\Console\Cli;
- use Magento\Framework\Exception\LocalizedException;
- use Magento\Framework\Indexer\Config\DependencyInfoProvider;
- use Magento\Framework\Indexer\IndexerInterface;
- use Magento\Framework\Indexer\IndexerRegistry;
- use Magento\Framework\Indexer\StateInterface;
- use Symfony\Component\Console\Input\InputInterface;
- use Symfony\Component\Console\Output\OutputInterface;
- use Magento\Framework\Indexer\ConfigInterface;
- use Magento\Framework\App\ObjectManagerFactory;
- /**
- * Command to run indexers
- */
- class IndexerReindexCommand extends AbstractIndexerManageCommand
- {
- /**
- * @var array
- */
- private $sharedIndexesComplete = [];
- /**
- * @var ConfigInterface
- */
- private $config;
- /**
- * @var IndexerRegistry
- */
- private $indexerRegistry;
- /**
- * @var DependencyInfoProvider|null
- */
- private $dependencyInfoProvider;
- /**
- * @param ObjectManagerFactory $objectManagerFactory
- * @param IndexerRegistry|null $indexerRegistry
- * @param DependencyInfoProvider|null $dependencyInfoProvider
- */
- public function __construct(
- ObjectManagerFactory $objectManagerFactory,
- IndexerRegistry $indexerRegistry = null,
- DependencyInfoProvider $dependencyInfoProvider = null
- ) {
- $this->indexerRegistry = $indexerRegistry;
- $this->dependencyInfoProvider = $dependencyInfoProvider;
- parent::__construct($objectManagerFactory);
- }
- /**
- * @inheritdoc
- */
- protected function configure()
- {
- $this->setName('indexer:reindex')
- ->setDescription('Reindexes Data')
- ->setDefinition($this->getInputList());
- parent::configure();
- }
- /**
- * @inheritdoc
- */
- protected function execute(InputInterface $input, OutputInterface $output)
- {
- $returnValue = Cli::RETURN_FAILURE;
- foreach ($this->getIndexers($input) as $indexer) {
- try {
- $this->validateIndexerStatus($indexer);
- $startTime = microtime(true);
- $indexerConfig = $this->getConfig()->getIndexer($indexer->getId());
- $sharedIndex = $indexerConfig['shared_index'];
- // Skip indexers having shared index that was already complete
- if (!in_array($sharedIndex, $this->sharedIndexesComplete)) {
- $indexer->reindexAll();
- if ($sharedIndex) {
- $this->validateSharedIndex($sharedIndex);
- }
- }
- $resultTime = microtime(true) - $startTime;
- $output->writeln(
- $indexer->getTitle() . ' index has been rebuilt successfully in ' . gmdate('H:i:s', $resultTime)
- );
- $returnValue = Cli::RETURN_SUCCESS;
- } catch (LocalizedException $e) {
- $output->writeln($e->getMessage());
- } catch (\Exception $e) {
- $output->writeln($indexer->getTitle() . ' indexer process unknown error:');
- $output->writeln($e->getMessage());
- }
- }
- return $returnValue;
- }
- /**
- * @inheritdoc
- *
- * Returns the ordered list of specified indexers and related indexers.
- */
- protected function getIndexers(InputInterface $input)
- {
- $indexers = parent::getIndexers($input);
- $allIndexers = $this->getAllIndexers();
- if (!array_diff_key($allIndexers, $indexers)) {
- return $indexers;
- }
- $relatedIndexers = [];
- $dependentIndexers = [];
- foreach ($indexers as $indexer) {
- $relatedIndexers = array_merge(
- $relatedIndexers,
- $this->getRelatedIndexerIds($indexer->getId())
- );
- $dependentIndexers = array_merge(
- $dependentIndexers,
- $this->getDependentIndexerIds($indexer->getId())
- );
- }
- $invalidRelatedIndexers = [];
- foreach (array_unique($relatedIndexers) as $relatedIndexer) {
- if ($allIndexers[$relatedIndexer]->isInvalid()) {
- $invalidRelatedIndexers[] = $relatedIndexer;
- }
- }
- return array_intersect_key(
- $allIndexers,
- array_flip(
- array_unique(
- array_merge(
- array_keys($indexers),
- $invalidRelatedIndexers,
- $dependentIndexers
- )
- )
- )
- );
- }
- /**
- * Return all indexer Ids on which the current indexer depends (directly or indirectly).
- *
- * @param string $indexerId
- * @return array
- */
- private function getRelatedIndexerIds(string $indexerId)
- {
- $relatedIndexerIds = [];
- foreach ($this->getDependencyInfoProvider()->getIndexerIdsToRunBefore($indexerId) as $relatedIndexerId) {
- $relatedIndexerIds = array_merge(
- $relatedIndexerIds,
- [$relatedIndexerId],
- $this->getRelatedIndexerIds($relatedIndexerId)
- );
- }
- return array_unique($relatedIndexerIds);
- }
- /**
- * Return all indexer Ids which depend on the current indexer (directly or indirectly).
- *
- * @param string $indexerId
- * @return array
- */
- private function getDependentIndexerIds(string $indexerId)
- {
- $dependentIndexerIds = [];
- foreach (array_keys($this->getConfig()->getIndexers()) as $id) {
- $dependencies = $this->getDependencyInfoProvider()->getIndexerIdsToRunBefore($id);
- if (array_search($indexerId, $dependencies) !== false) {
- $dependentIndexerIds = array_merge(
- $dependentIndexerIds,
- [$id],
- $this->getDependentIndexerIds($id)
- );
- }
- }
- return array_unique($dependentIndexerIds);
- }
- /**
- * Validate that indexer is not locked
- *
- * @param IndexerInterface $indexer
- * @return void
- * @throws LocalizedException
- */
- private function validateIndexerStatus(IndexerInterface $indexer)
- {
- if ($indexer->getStatus() == StateInterface::STATUS_WORKING) {
- throw new LocalizedException(
- __(
- '%1 index is locked by another reindex process. Skipping.',
- $indexer->getTitle()
- )
- );
- }
- }
- /**
- * Get indexer ids that have common shared index
- *
- * @param string $sharedIndex
- * @return array
- */
- private function getIndexerIdsBySharedIndex($sharedIndex)
- {
- $indexers = $this->getConfig()->getIndexers();
- $result = [];
- foreach ($indexers as $indexerConfig) {
- if ($indexerConfig['shared_index'] == $sharedIndex) {
- $result[] = $indexerConfig['indexer_id'];
- }
- }
- return $result;
- }
- /**
- * Validate indexers by shared index ID
- *
- * @param string $sharedIndex
- * @return $this
- */
- private function validateSharedIndex($sharedIndex)
- {
- if (empty($sharedIndex)) {
- throw new \InvalidArgumentException(
- 'The sharedIndex is an invalid shared index identifier. Verify the identifier and try again.'
- );
- }
- $indexerIds = $this->getIndexerIdsBySharedIndex($sharedIndex);
- if (empty($indexerIds)) {
- return $this;
- }
- foreach ($indexerIds as $indexerId) {
- $indexer = $this->getIndexerRegistry()->get($indexerId);
- /** @var \Magento\Indexer\Model\Indexer\State $state */
- $state = $indexer->getState();
- $state->setStatus(StateInterface::STATUS_VALID);
- $state->save();
- }
- $this->sharedIndexesComplete[] = $sharedIndex;
- return $this;
- }
- /**
- * Get config
- *
- * @return ConfigInterface
- * @deprecated 100.1.0
- */
- private function getConfig()
- {
- if (!$this->config) {
- $this->config = $this->getObjectManager()->get(ConfigInterface::class);
- }
- return $this->config;
- }
- /**
- * Get indexer registry
- *
- * @return IndexerRegistry
- * @deprecated 100.2.0
- */
- private function getIndexerRegistry()
- {
- if (!$this->indexerRegistry) {
- $this->indexerRegistry = $this->getObjectManager()->get(IndexerRegistry::class);
- }
- return $this->indexerRegistry;
- }
- /**
- * Get dependency info provider
- *
- * @return DependencyInfoProvider
- * @deprecated 100.2.0
- */
- private function getDependencyInfoProvider()
- {
- if (!$this->dependencyInfoProvider) {
- $this->dependencyInfoProvider = $this->getObjectManager()->get(DependencyInfoProvider::class);
- }
- return $this->dependencyInfoProvider;
- }
- }
|