123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- declare(strict_types=1);
- namespace Magento\InventoryGroupedProductIndexer\Indexer;
- use Exception;
- use Magento\Catalog\Api\Data\ProductInterface;
- use Magento\Framework\App\ResourceConnection;
- use Magento\Framework\DB\Select;
- use Magento\Framework\EntityManager\MetadataPool;
- use Magento\GroupedProduct\Model\ResourceModel\Product\Link;
- use Magento\InventoryIndexer\Indexer\IndexStructure;
- use Magento\InventoryIndexer\Indexer\InventoryIndexer;
- use Magento\InventoryMultiDimensionalIndexerApi\Model\Alias;
- use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexNameBuilder;
- use Magento\InventoryMultiDimensionalIndexerApi\Model\IndexNameResolverInterface;
- class SelectBuilder
- {
- /**
- * @var ResourceConnection
- */
- private $resourceConnection;
- /**
- * @var IndexNameBuilder
- */
- private $indexNameBuilder;
- /**
- * @var IndexNameResolverInterface
- */
- private $indexNameResolver;
- /**
- * @var MetadataPool
- */
- private $metadataPool;
- /**
- * @param ResourceConnection $resourceConnection
- * @param IndexNameBuilder $indexNameBuilder
- * @param IndexNameResolverInterface $indexNameResolver
- * @param MetadataPool $metadataPool
- */
- public function __construct(
- ResourceConnection $resourceConnection,
- IndexNameBuilder $indexNameBuilder,
- IndexNameResolverInterface $indexNameResolver,
- MetadataPool $metadataPool
- ) {
- $this->resourceConnection = $resourceConnection;
- $this->indexNameBuilder = $indexNameBuilder;
- $this->indexNameResolver = $indexNameResolver;
- $this->metadataPool = $metadataPool;
- }
- /**
- * Prepare select.
- *
- * @param int $stockId
- * @return Select
- * @throws Exception
- */
- public function execute(int $stockId): Select
- {
- $connection = $this->resourceConnection->getConnection();
- $indexName = $this->indexNameBuilder
- ->setIndexId(InventoryIndexer::INDEXER_ID)
- ->addDimension('stock_', (string)$stockId)
- ->setAlias(Alias::ALIAS_MAIN)
- ->build();
- $indexTableName = $this->indexNameResolver->resolveName($indexName);
- $metadata = $this->metadataPool->getMetadata(ProductInterface::class);
- $linkField = $metadata->getLinkField();
- $select = $connection->select()
- ->from(
- ['stock' => $indexTableName],
- [
- IndexStructure::SKU => 'parent_product_entity.sku',
- IndexStructure::QUANTITY => 'SUM(stock.quantity)',
- IndexStructure::IS_SALABLE => 'MAX(stock.is_salable)',
- ]
- )->joinInner(
- ['product_entity' => $this->resourceConnection->getTableName('catalog_product_entity')],
- 'product_entity.sku = stock.sku',
- []
- )->joinInner(
- ['parent_link' => $this->resourceConnection->getTableName('catalog_product_link')],
- 'parent_link.linked_product_id = product_entity.entity_id
- AND parent_link.link_type_id = ' . Link::LINK_TYPE_GROUPED,
- []
- )->joinInner(
- ['parent_product_entity' => $this->resourceConnection->getTableName('catalog_product_entity')],
- 'parent_product_entity.' . $linkField . ' = parent_link.product_id',
- []
- )
- ->group(['parent_product_entity.sku']);
- return $select;
- }
- }
|