SelectBuilder.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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\InventoryGroupedProductIndexer\Indexer;
  8. use Exception;
  9. use Magento\Catalog\Api\Data\ProductInterface;
  10. use Magento\Framework\App\ResourceConnection;
  11. use Magento\Framework\DB\Select;
  12. use Magento\Framework\EntityManager\MetadataPool;
  13. use Magento\GroupedProduct\Model\ResourceModel\Product\Link;
  14. use Magento\InventoryIndexer\Indexer\IndexStructure;
  15. use Magento\InventoryIndexer\Indexer\InventoryIndexer;
  16. use Magento\InventoryMultiDimensionalIndexerApi\Model\Alias;
  17. use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexNameBuilder;
  18. use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexNameResolverInterface;
  19. class SelectBuilder
  20. {
  21. /**
  22. * @var ResourceConnection
  23. */
  24. private $resourceConnection;
  25. /**
  26. * @var IndexNameBuilder
  27. */
  28. private $indexNameBuilder;
  29. /**
  30. * @var IndexNameResolverInterface
  31. */
  32. private $indexNameResolver;
  33. /**
  34. * @var MetadataPool
  35. */
  36. private $metadataPool;
  37. /**
  38. * @param ResourceConnection $resourceConnection
  39. * @param IndexNameBuilder $indexNameBuilder
  40. * @param IndexNameResolverInterface $indexNameResolver
  41. * @param MetadataPool $metadataPool
  42. */
  43. public function __construct(
  44. ResourceConnection $resourceConnection,
  45. IndexNameBuilder $indexNameBuilder,
  46. IndexNameResolverInterface $indexNameResolver,
  47. MetadataPool $metadataPool
  48. ) {
  49. $this->resourceConnection = $resourceConnection;
  50. $this->indexNameBuilder = $indexNameBuilder;
  51. $this->indexNameResolver = $indexNameResolver;
  52. $this->metadataPool = $metadataPool;
  53. }
  54. /**
  55. * Prepare select.
  56. *
  57. * @param int $stockId
  58. * @return Select
  59. * @throws Exception
  60. */
  61. public function execute(int $stockId): Select
  62. {
  63. $connection = $this->resourceConnection->getConnection();
  64. $indexName = $this->indexNameBuilder
  65. ->setIndexId(InventoryIndexer::INDEXER_ID)
  66. ->addDimension('stock_', (string)$stockId)
  67. ->setAlias(Alias::ALIAS_MAIN)
  68. ->build();
  69. $indexTableName = $this->indexNameResolver->resolveName($indexName);
  70. $metadata = $this->metadataPool->getMetadata(ProductInterface::class);
  71. $linkField = $metadata->getLinkField();
  72. $select = $connection->select()
  73. ->from(
  74. ['stock' => $indexTableName],
  75. [
  76. IndexStructure::SKU => 'parent_product_entity.sku',
  77. IndexStructure::QUANTITY => 'SUM(stock.quantity)',
  78. IndexStructure::IS_SALABLE => 'MAX(stock.is_salable)',
  79. ]
  80. )->joinInner(
  81. ['product_entity' => $this->resourceConnection->getTableName('catalog_product_entity')],
  82. 'product_entity.sku = stock.sku',
  83. []
  84. )->joinInner(
  85. ['parent_link' => $this->resourceConnection->getTableName('catalog_product_link')],
  86. 'parent_link.linked_product_id = product_entity.entity_id
  87. AND parent_link.link_type_id = ' . Link::LINK_TYPE_GROUPED,
  88. []
  89. )->joinInner(
  90. ['parent_product_entity' => $this->resourceConnection->getTableName('catalog_product_entity')],
  91. 'parent_product_entity.' . $linkField . ' = parent_link.product_id',
  92. []
  93. )
  94. ->group(['parent_product_entity.sku']);
  95. return $select;
  96. }
  97. }