Skip to content

Commit

Permalink
Merge pull request magento#1009 from magento-folks/stock_indexer_batc…
Browse files Browse the repository at this point in the history
…hing

[Folks] Update catalog_inventory stock indexer
  • Loading branch information
Alexander Akimov authored Apr 12, 2017
2 parents 8b656e2 + 8a306f1 commit 23f7456
Show file tree
Hide file tree
Showing 50 changed files with 1,392 additions and 60 deletions.
39 changes: 30 additions & 9 deletions app/code/Magento/Bundle/Model/ResourceModel/Indexer/Stock.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
namespace Magento\Bundle\Model\ResourceModel\Indexer;

use Magento\Catalog\Api\Data\ProductInterface;
use Magento\CatalogInventory\Model\Indexer\Stock\Action\Full;

/**
* Bundle Stock Status Indexer Resource Model
Expand All @@ -15,16 +16,33 @@
class Stock extends \Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\DefaultStock
{
/**
* Reindex temporary (price result data) for defined product(s)
*
* @param int|array $entityIds
* @return $this
* @var \Magento\Indexer\Model\ResourceModel\FrontendResource
*/
public function reindexEntity($entityIds)
{
$this->_updateIndex($entityIds);
private $indexerStockFrontendResource;

return $this;
/**
* Class constructor
*
* @param \Magento\Framework\Model\ResourceModel\Db\Context $context
* @param \Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy
* @param \Magento\Eav\Model\Config $eavConfig
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
* @param string $connectionName
* @param null|\Magento\Indexer\Model\Indexer\StateFactory $stateFactory
* @param null|\Magento\Indexer\Model\ResourceModel\FrontendResource $indexerStockFrontendResource
*/
public function __construct(
\Magento\Framework\Model\ResourceModel\Db\Context $context,
\Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy,
\Magento\Eav\Model\Config $eavConfig,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
$connectionName = null,
\Magento\Indexer\Model\Indexer\StateFactory $stateFactory = null,
\Magento\Indexer\Model\ResourceModel\FrontendResource $indexerStockFrontendResource = null
) {
parent::__construct($context, $tableStrategy, $eavConfig, $scopeConfig, $connectionName, $stateFactory);
$this->indexerStockFrontendResource = $indexerStockFrontendResource ?: ObjectManager::getInstance()
->get(\Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\FrontendResource::class);
}

/**
Expand All @@ -48,7 +66,10 @@ protected function _prepareBundleOptionStockData($entityIds = null, $usePrimaryT
{
$this->_cleanBundleOptionStockData();
$linkField = $this->getMetadataPool()->getMetadata(ProductInterface::class)->getLinkField();
$idxTable = $usePrimaryTable ? $this->getMainTable() : $this->getIdxTable();
$table = $this->getActionType() === Full::ACTION_TYPE
? $this->getMainTable()
: $this->indexerStockFrontendResource->getMainTable();
$idxTable = $usePrimaryTable ? $table : $this->getIdxTable();
$connection = $this->getConnection();
$select = $connection->select()->from(
['product' => $this->getTable('catalog_product_entity')],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,14 @@
use Magento\Customer\Api\GroupManagementInterface;
use Magento\Framework\DataObject;
use Magento\Framework\DB\Select;
use Magento\Framework\EntityManager\MetadataPool;
use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory;
use Magento\Framework\App\ObjectManager;

/**
* Bundle Selections Resource Collection
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
{
Expand Down Expand Up @@ -38,6 +43,99 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
*/
private $websiteScopePriceJoined = false;

/**
* @var \Magento\Indexer\Model\ResourceModel\FrontendResource
*/
private $indexerStockFrontendResource;

/**
* Collection constructor.
* @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
* @param \Psr\Log\LoggerInterface $logger
* @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
* @param \Magento\Framework\Event\ManagerInterface $eventManager
* @param \Magento\Eav\Model\Config $eavConfig
* @param \Magento\Framework\App\ResourceConnection $resource
* @param \Magento\Eav\Model\EntityFactory $eavEntityFactory
* @param \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper
* @param \Magento\Framework\Validator\UniversalFactory $universalFactory
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
* @param \Magento\Framework\Module\Manager $moduleManager
* @param \Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
* @param \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory
* @param \Magento\Catalog\Model\ResourceModel\Url $catalogUrl
* @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
* @param \Magento\Customer\Model\Session $customerSession
* @param \Magento\Framework\Stdlib\DateTime $dateTime
* @param GroupManagementInterface $groupManagement
* @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection
* @param ProductLimitationFactory|null $productLimitationFactory
* @param MetadataPool|null $metadataPool
* @param \Magento\Indexer\Model\ResourceModel\FrontendResource|null $indexerFrontendResource
* @param \Magento\Indexer\Model\ResourceModel\FrontendResource|null $categoryProductIndexerFrontend
* @param \Magento\Indexer\Model\ResourceModel\FrontendResource|null $indexerStockFrontendResource
*
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
* @SuppressWarnings(Magento.TypeDuplication)
*/
public function __construct(
\Magento\Framework\Data\Collection\EntityFactory $entityFactory,
\Psr\Log\LoggerInterface $logger,
\Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
\Magento\Framework\Event\ManagerInterface $eventManager,
\Magento\Eav\Model\Config $eavConfig,
\Magento\Framework\App\ResourceConnection $resource,
\Magento\Eav\Model\EntityFactory $eavEntityFactory,
\Magento\Catalog\Model\ResourceModel\Helper $resourceHelper,
\Magento\Framework\Validator\UniversalFactory $universalFactory,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\Module\Manager $moduleManager,
\Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Catalog\Model\Product\OptionFactory $productOptionFactory,
\Magento\Catalog\Model\ResourceModel\Url $catalogUrl,
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
\Magento\Customer\Model\Session $customerSession,
\Magento\Framework\Stdlib\DateTime $dateTime,
GroupManagementInterface $groupManagement,
\Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
ProductLimitationFactory $productLimitationFactory = null,
MetadataPool $metadataPool = null,
\Magento\Indexer\Model\ResourceModel\FrontendResource $indexerFrontendResource = null,
\Magento\Indexer\Model\ResourceModel\FrontendResource $categoryProductIndexerFrontend = null,
\Magento\Indexer\Model\ResourceModel\FrontendResource $indexerStockFrontendResource = null
) {
parent::__construct(
$entityFactory,
$logger,
$fetchStrategy,
$eventManager,
$eavConfig,
$resource,
$eavEntityFactory,
$resourceHelper,
$universalFactory,
$storeManager,
$moduleManager,
$catalogProductFlatState,
$scopeConfig,
$productOptionFactory,
$catalogUrl,
$localeDate,
$customerSession,
$dateTime,
$groupManagement,
$connection,
$productLimitationFactory,
$metadataPool,
$indexerFrontendResource,
$categoryProductIndexerFrontend
);
$this->indexerStockFrontendResource = $indexerStockFrontendResource ?: ObjectManager::getInstance()
->get(\Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\FrontendResource::class);
}

/**
* Initialize collection
*
Expand Down Expand Up @@ -162,7 +260,7 @@ public function addQuantityFilter()
{
$this->getSelect()
->joinInner(
['stock' => $this->getTable('cataloginventory_stock_status')],
['stock' => $this->indexerStockFrontendResource->getMainTable()],
'selection.product_id = stock.product_id',
[]
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Bundle\Test\Unit\Model\ResourceModel\Selection;

use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
use Magento\Indexer\Model\ResourceModel\FrontendResource;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Store\Api\Data\StoreInterface;
use Magento\Framework\Validator\UniversalFactory;
use Magento\Eav\Model\Entity\AbstractEntity;
use Magento\Framework\DB\Adapter\AdapterInterface;
use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory;
use Magento\Framework\DB\Select;

/**
* Class CollectionTest.
* Unit test for \Magento\Indexer\Model\ResourceModel\FrontendResource.
*/
class CollectionTest extends \PHPUnit_Framework_TestCase
{
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $frontendResource;

/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $storeManager;

/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $store;

/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $universalFactory;

/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $entity;

/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $adapter;

/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $select;

/**
* @var \Magento\Bundle\Model\ResourceModel\Selection\Collection
*/
private $model;

protected function setUp()
{
$objectManager = new ObjectManager($this);
$this->frontendResource = $this->getMockBuilder(FrontendResource::class)
->disableOriginalConstructor()
->getMock();
$this->storeManager = $this->getMockBuilder(StoreManagerInterface::class)
->disableOriginalConstructor()
->getMock();
$this->store = $this->getMockBuilder(StoreInterface::class)
->disableOriginalConstructor()
->getMock();
$this->universalFactory = $this->getMockBuilder(UniversalFactory::class)
->disableOriginalConstructor()
->getMock();
$this->entity = $this->getMockBuilder(AbstractEntity::class)
->disableOriginalConstructor()
->getMock();
$this->adapter = $this->getMockBuilder(AdapterInterface::class)
->disableOriginalConstructor()
->getMock();
$this->select = $this->getMockBuilder(Select::class)
->disableOriginalConstructor()
->getMock();
$factory = $this->getMockBuilder(ProductLimitationFactory::class)
->disableOriginalConstructor()
->setMethods(['create'])
->getMock();

$this->storeManager->expects($this->any())
->method('getStore')
->willReturn($this->store);
$this->store->expects($this->any())
->method('getId')
->willReturn(1);
$this->universalFactory->expects($this->any())
->method('create')
->willReturn($this->entity);
$this->entity->expects($this->any())
->method('getConnection')
->willReturn($this->adapter);
$this->entity->expects($this->any())
->method('getDefaultAttributes')
->willReturn([]);
$this->adapter->expects($this->any())
->method('select')
->willReturn($this->select);

$this->model = $objectManager->getObject(
\Magento\Bundle\Model\ResourceModel\Selection\Collection::class,
[
'storeManager' => $this->storeManager,
'universalFactory' => $this->universalFactory,
'productLimitationFactory' => $factory,
'indexerStockFrontendResource' => $this->frontendResource
]
);
}

public function testAddQuantityFilter()
{
$tableName = 'cataloginventory_stock_status';
$this->frontendResource->expects($this->once())
->method('getMainTable')
->willReturn($tableName);
$this->select->expects($this->once())
->method('joinInner')
->with(
['stock' => $tableName],
'selection.product_id = stock.product_id',
[]
)->willReturnSelf();
$this->assertEquals($this->model, $this->model->addQuantityFilter());
}
}
3 changes: 2 additions & 1 deletion app/code/Magento/Bundle/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
"magento/framework": "100.2.*",
"magento/module-quote": "100.2.*",
"magento/module-media-storage": "100.2.*",
"magento/module-ui": "100.2.*"
"magento/module-ui": "100.2.*",
"magento/module-indexer": "100.2.*"
},
"suggest": {
"magento/module-webapi": "100.2.*",
Expand Down
17 changes: 17 additions & 0 deletions app/code/Magento/Bundle/etc/di.xml
Original file line number Diff line number Diff line change
Expand Up @@ -150,4 +150,21 @@
<argument name="connectionName" xsi:type="string">indexer</argument>
</arguments>
</type>
<type name="Magento\CatalogInventory\Model\Indexer\Stock\Action\Full">
<arguments>
<argument name="memoryTablesMinRows" xsi:type="array">
<item name="bundle" xsi:type="number">136</item>
</argument>
</arguments>
</type>
<type name="Magento\Bundle\Model\ResourceModel\Selection\Collection">
<arguments>
<argument name="indexerStockFrontendResource" xsi:type="object">Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\FrontendResource</argument>
</arguments>
</type>
<type name="Magento\Bundle\Model\ResourceModel\Indexer\Stock">
<arguments>
<argument name="indexerStockFrontendResource" xsi:type="object">Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\FrontendResource</argument>
</arguments>
</type>
</config>
Loading

0 comments on commit 23f7456

Please sign in to comment.