SourceItemIndexer.php 4.3 KB

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