StockIndexer.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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\InventoryIndexer\Indexer\Stock;
  8. use Magento\Framework\App\ResourceConnection;
  9. use Magento\InventoryMultiDimensionalIndexerApi\Model\Alias;
  10. use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexHandlerInterface;
  11. use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexNameBuilder;
  12. use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexStructureInterface;
  13. use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexTableSwitcherInterface;
  14. use Magento\InventoryCatalogApi\Api\DefaultStockProviderInterface;
  15. use Magento\InventoryIndexer\Indexer\InventoryIndexer;
  16. /**
  17. * Stock indexer
  18. * Extension point for indexation
  19. *
  20. * @api
  21. */
  22. class StockIndexer
  23. {
  24. /**
  25. * @var GetAllStockIds
  26. */
  27. private $getAllStockIds;
  28. /**
  29. * @var IndexStructureInterface
  30. */
  31. private $indexStructure;
  32. /**
  33. * @var IndexHandlerInterface
  34. */
  35. private $indexHandler;
  36. /**
  37. * @var IndexNameBuilder
  38. */
  39. private $indexNameBuilder;
  40. /**
  41. * @var IndexDataProviderByStockId
  42. */
  43. private $indexDataProviderByStockId;
  44. /**
  45. * @var IndexTableSwitcherInterface
  46. */
  47. private $indexTableSwitcher;
  48. /**
  49. * @var DefaultStockProviderInterface
  50. */
  51. private $defaultStockProvider;
  52. /**
  53. * $indexStructure is reserved name for construct variable in index internal mechanism
  54. *
  55. * @param GetAllStockIds $getAllStockIds
  56. * @param IndexStructureInterface $indexStructureHandler
  57. * @param IndexHandlerInterface $indexHandler
  58. * @param IndexNameBuilder $indexNameBuilder
  59. * @param IndexDataProviderByStockId $indexDataProviderByStockId
  60. * @param IndexTableSwitcherInterface $indexTableSwitcher
  61. * @param DefaultStockProviderInterface $defaultStockProvider
  62. */
  63. public function __construct(
  64. GetAllStockIds $getAllStockIds,
  65. IndexStructureInterface $indexStructureHandler,
  66. IndexHandlerInterface $indexHandler,
  67. IndexNameBuilder $indexNameBuilder,
  68. IndexDataProviderByStockId $indexDataProviderByStockId,
  69. IndexTableSwitcherInterface $indexTableSwitcher,
  70. DefaultStockProviderInterface $defaultStockProvider
  71. ) {
  72. $this->getAllStockIds = $getAllStockIds;
  73. $this->indexStructure = $indexStructureHandler;
  74. $this->indexHandler = $indexHandler;
  75. $this->indexNameBuilder = $indexNameBuilder;
  76. $this->indexDataProviderByStockId = $indexDataProviderByStockId;
  77. $this->indexTableSwitcher = $indexTableSwitcher;
  78. $this->defaultStockProvider = $defaultStockProvider;
  79. }
  80. /**
  81. * @return void
  82. */
  83. public function executeFull()
  84. {
  85. $stockIds = $this->getAllStockIds->execute();
  86. $this->executeList($stockIds);
  87. }
  88. /**
  89. * @param int $stockId
  90. * @return void
  91. */
  92. public function executeRow(int $stockId)
  93. {
  94. $this->executeList([$stockId]);
  95. }
  96. /**
  97. * @param array $stockIds
  98. * @return void
  99. */
  100. public function executeList(array $stockIds)
  101. {
  102. foreach ($stockIds as $stockId) {
  103. if ($this->defaultStockProvider->getId() === (int)$stockId) {
  104. continue;
  105. }
  106. $replicaIndexName = $this->indexNameBuilder
  107. ->setIndexId(InventoryIndexer::INDEXER_ID)
  108. ->addDimension('stock_', (string)$stockId)
  109. ->setAlias(Alias::ALIAS_REPLICA)
  110. ->build();
  111. $mainIndexName = $this->indexNameBuilder
  112. ->setIndexId(InventoryIndexer::INDEXER_ID)
  113. ->addDimension('stock_', (string)$stockId)
  114. ->setAlias(Alias::ALIAS_MAIN)
  115. ->build();
  116. $this->indexStructure->delete($replicaIndexName, ResourceConnection::DEFAULT_CONNECTION);
  117. $this->indexStructure->create($replicaIndexName, ResourceConnection::DEFAULT_CONNECTION);
  118. if (!$this->indexStructure->isExist($mainIndexName, ResourceConnection::DEFAULT_CONNECTION)) {
  119. $this->indexStructure->create($mainIndexName, ResourceConnection::DEFAULT_CONNECTION);
  120. }
  121. $this->indexHandler->saveIndex(
  122. $replicaIndexName,
  123. $this->indexDataProviderByStockId->execute((int)$stockId),
  124. ResourceConnection::DEFAULT_CONNECTION
  125. );
  126. $this->indexTableSwitcher->switch($mainIndexName, ResourceConnection::DEFAULT_CONNECTION);
  127. $this->indexStructure->delete($replicaIndexName, ResourceConnection::DEFAULT_CONNECTION);
  128. }
  129. }
  130. }