DependencyUpdaterPlugin.php 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\Elasticsearch\Model\Indexer\Plugin;
  8. use Magento\Elasticsearch\Model\Config;
  9. use Magento\Framework\Indexer\Config\DependencyInfoProvider as Provider;
  10. use Magento\CatalogSearch\Model\Indexer\Fulltext as CatalogSearchFulltextIndexer;
  11. use Magento\CatalogInventory\Model\Indexer\Stock\Processor as CatalogInventoryStockIndexer;
  12. /**
  13. * Plugin for maintenance catalog search index dependency on stock index.
  14. * If elasticsearch is used as search engine catalog search index becomes dependent on stock index. Elasticsearch
  15. * module declares this dependence. But in case when elasticsearch module is enabled and elasticsearch engine isn`t
  16. * used as search engine other search engines don`t need this dependency.
  17. * This plugin remove catalog search index dependency on stock index when elasticsearch isn`t used as search engine
  18. * except full reindexing. During full reindexing this dependency doesn`t make overhead.
  19. */
  20. class DependencyUpdaterPlugin
  21. {
  22. /**
  23. * @var Config
  24. */
  25. private $config;
  26. /**
  27. * @param Config $config
  28. */
  29. public function __construct(Config $config)
  30. {
  31. $this->config = $config;
  32. }
  33. /**
  34. * Remove index dependency, if it needed, on run reindexing by specifics indexes.
  35. *
  36. * @param Provider $provider
  37. * @param array $dependencies
  38. * @param string $indexerId
  39. * @return array
  40. * @see \Magento\Indexer\Console\Command\IndexerReindexCommand::getIndexers()
  41. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  42. */
  43. public function afterGetIndexerIdsToRunBefore(Provider $provider, array $dependencies, string $indexerId): array
  44. {
  45. if ($this->isFilteringNeeded($indexerId, CatalogSearchFulltextIndexer::INDEXER_ID)) {
  46. $dependencies = array_diff($dependencies, [CatalogInventoryStockIndexer::INDEXER_ID]);
  47. }
  48. return $dependencies;
  49. }
  50. /**
  51. * Remove index dependency, if it needed, on reindex triggers.
  52. *
  53. * @param Provider $provider
  54. * @param array $dependencies
  55. * @param string $indexerId
  56. * @return array
  57. * @see \Magento\Indexer\Model\Indexer\DependencyDecorator
  58. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  59. */
  60. public function afterGetIndexerIdsToRunAfter(Provider $provider, array $dependencies, string $indexerId): array
  61. {
  62. if ($this->isFilteringNeeded($indexerId, CatalogInventoryStockIndexer::INDEXER_ID)) {
  63. $dependencies = array_diff($dependencies, [CatalogSearchFulltextIndexer::INDEXER_ID]);
  64. }
  65. return $dependencies;
  66. }
  67. /**
  68. * @param string $currentIndexerId
  69. * @param string $targetIndexerId
  70. * @return bool
  71. */
  72. private function isFilteringNeeded(string $currentIndexerId, string $targetIndexerId): bool
  73. {
  74. return (!$this->config->isElasticsearchEnabled() && $targetIndexerId === $currentIndexerId);
  75. }
  76. }