StockIndexer.php 4.3 KB

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