Skip to content

Commit

Permalink
Merge pull request #202 from magento-firedrakes/MAGETWO-34645
Browse files Browse the repository at this point in the history
[Firedrakes] Asynchronous grid reindex
  • Loading branch information
Logvin, Michael(mlogvin) committed Apr 1, 2015
2 parents f9966b1 + fa29532 commit a454c57
Show file tree
Hide file tree
Showing 28 changed files with 549 additions and 68 deletions.
38 changes: 38 additions & 0 deletions app/code/Magento/Sales/Model/Config/Backend/Grid/AsyncIndexing.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php
/**
* Copyright © 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Sales\Model\Config\Backend\Grid;

/**
* Backend model for global configuration value
* 'dev/grid/async_indexing'.
*/
class AsyncIndexing extends \Magento\Framework\App\Config\Value
{
/**
* Dispatches corresponding event after saving of configuration
* value if it was changed.
*
* Dispatches next events:
*
* - config_data_dev_grid_async_indexing_enabled
* - config_data_dev_grid_async_indexing_disabled
*
* @return $this
*/
public function afterSave()
{
if ($this->isValueChanged()) {
$state = $this->getValue() ? 'enabled' : 'disabled';

$this->_eventManager->dispatch(
$this->_eventPrefix . '_dev_grid_async_indexing_' . $state,
$this->_getEventData()
);
}

return $this;
}
}
104 changes: 104 additions & 0 deletions app/code/Magento/Sales/Model/Observer/IndexGrid.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
<?php
/**
* Copyright © 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Sales\Model\Observer;

/**
* Sales entity grids indexing observer.
*
* Performs handling of events and cron jobs related to indexing
* of Order, Invoice, Shipment and Creditmemo grids.
*/
class IndexGrid
{
/**
* Entity grid model.
*
* @var \Magento\Sales\Model\Resource\GridInterface
*/
protected $entityGrid;

/**
* Global configuration storage.
*
* @var \Magento\Framework\App\Config\ScopeConfigInterface
*/
protected $globalConfig;

/**
* @param \Magento\Sales\Model\Resource\GridInterface $entityGrid
* @param \Magento\Framework\App\Config\ScopeConfigInterface $globalConfig
*/
public function __construct(
\Magento\Sales\Model\Resource\GridInterface $entityGrid,
\Magento\Framework\App\Config\ScopeConfigInterface $globalConfig
) {
$this->entityGrid = $entityGrid;
$this->globalConfig = $globalConfig;
}

/**
* Handles synchronous insertion of the new entity into
* corresponding grid on certain events.
*
* Used in the next events:
*
* - sales_order_save_after
* - sales_order_invoice_save_after
* - sales_order_shipment_save_after
* - sales_order_creditmemo_save_after
*
* Works only if asynchronous grid indexing is disabled
* in global settings.
*
* @param \Magento\Framework\Event\Observer $observer
* @return void
*/
public function syncInsert(\Magento\Framework\Event\Observer $observer)
{
if (!$this->globalConfig->getValue('dev/grid/async_indexing')) {
$this->entityGrid->refresh($observer->getDataObject()->getId());
}
}

/**
* Handles synchronous removing of the entity from
* corresponding grid on certain events.
*
* Used in the next events:
*
* - sales_order_delete_after
* - sales_order_invoice_delete_after
* - sales_order_shipment_delete_after
* - sales_order_creditmemo_delete_after
*
* @param \Magento\Framework\Event\Observer $observer
* @return void
*/
public function syncRemove(\Magento\Framework\Event\Observer $observer)
{
$this->entityGrid->purge($observer->getDataObject()->getId());
}

/**
* Handles asynchronous insertion of the new entity into
* corresponding grid during cron job.
*
* Also method is used in the next events:
*
* - config_data_dev_grid_async_indexing_disabled
*
* Works only if asynchronous grid indexing is enabled
* in global settings.
*
* @return void
*/
public function asyncInsert()
{
if ($this->globalConfig->getValue('dev/grid/async_indexing')) {
$this->entityGrid->refreshBySchedule();
}
}
}
20 changes: 20 additions & 0 deletions app/code/Magento/Sales/Model/Resource/AbstractGrid.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,24 @@ public function purge($value, $field = null)
[($field ?: 'entity_id') . ' = ?' => $value]
);
}

/**
* Returns update time of the last row in the grid.
*
* If there are no rows in the grid, default value will be returned.
*
* @param string $default
* @return string
*/
protected function getLastUpdatedAtValue($default = '0000-00-00 00:00:00')
{
$select = $this->getConnection()->select()
->from($this->getTable($this->gridTableName), ['updated_at'])
->order('updated_at DESC')
->limit(1);

$row = $this->getConnection()->fetchRow($select);

return isset($row['updated_at']) ? $row['updated_at'] : $default;
}
}
35 changes: 19 additions & 16 deletions app/code/Magento/Sales/Model/Resource/Entity.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,28 +50,20 @@ abstract class Entity extends AbstractDb
*/
protected $salesIncrement;

/**
* @var \Magento\Sales\Model\Resource\GridInterface
*/
protected $gridAggregator;

/**
* @param \Magento\Framework\Model\Resource\Db\Context $context
* @param Attribute $attribute
* @param \Magento\Sales\Model\Increment $salesIncrement
* @param string|null $resourcePrefix
* @param GridInterface|null $gridAggregator
*/
public function __construct(
\Magento\Framework\Model\Resource\Db\Context $context,
\Magento\Sales\Model\Resource\Attribute $attribute,
\Magento\Sales\Model\Increment $salesIncrement,
$resourcePrefix = null,
\Magento\Sales\Model\Resource\GridInterface $gridAggregator = null
$resourcePrefix = null
) {
$this->attribute = $attribute;
$this->salesIncrement = $salesIncrement;
$this->gridAggregator = $gridAggregator;
parent::__construct($context, $resourcePrefix);
}

Expand All @@ -89,6 +81,24 @@ public function saveAttribute(\Magento\Framework\Model\AbstractModel $object, $a
return $this;
}

/**
* Prepares data for saving and removes update time (if exists).
* This prevents saving same update time on each entity update.
*
* @param \Magento\Framework\Model\AbstractModel $object
* @return array
*/
protected function _prepareDataForSave(\Magento\Framework\Model\AbstractModel $object)
{
$data = parent::_prepareDataForTable($object, $this->getMainTable());

if (isset($data['updated_at'])) {
unset($data['updated_at']);
}

return $data;
}

/**
* Perform actions before object save
*
Expand Down Expand Up @@ -127,10 +137,6 @@ public function save(\Magento\Framework\Model\AbstractModel $object)
*/
protected function _afterSave(\Magento\Framework\Model\AbstractModel $object)
{
if ($this->gridAggregator) {
$this->gridAggregator->refresh($object->getId());
}

$adapter = $this->_getReadAdapter();
$columns = $adapter->describeTable($this->getMainTable());

Expand Down Expand Up @@ -158,9 +164,6 @@ protected function _afterSave(\Magento\Framework\Model\AbstractModel $object)
*/
protected function _afterDelete(\Magento\Framework\Model\AbstractModel $object)
{
if ($this->gridAggregator) {
$this->gridAggregator->purge($object->getId());
}
parent::_afterDelete($object);
return $this;
}
Expand Down
13 changes: 13 additions & 0 deletions app/code/Magento/Sales/Model/Resource/GridInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,25 @@
interface GridInterface
{
/**
* Adds new rows to the grid.
*
* Only rows that correspond to $value and $field parameters should be added.
*
* @param int|string $value
* @param null|string $field
* @return \Zend_Db_Statement_Interface
*/
public function refresh($value, $field = null);

/**
* Adds new rows to the grid.
*
* Only rows created/updated since the last method call should be added.
*
* @return \Zend_Db_Statement_Interface
*/
public function refreshBySchedule();

/**
* @param int|string $value
* @param null|string $field
Expand Down
6 changes: 2 additions & 4 deletions app/code/Magento/Sales/Model/Resource/Order.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
use Magento\Framework\Math\Random;
use Magento\Sales\Model\Increment as SalesIncrement;
use Magento\Sales\Model\Resource\Entity as SalesResource;
use Magento\Sales\Model\Resource\Order\Grid as OrderGrid;
use Magento\Sales\Model\Resource\Order\Handler\Address as AddressHandler;
use Magento\Sales\Model\Resource\Order\Handler\State as StateHandler;
use Magento\Sales\Model\Spi\OrderResourceInterface;
Expand Down Expand Up @@ -61,7 +60,6 @@ protected function _construct()
* @param SalesIncrement $salesIncrement
* @param AddressHandler $addressHandler
* @param StateHandler $stateHandler
* @param OrderGrid $gridAggregator
* @param string|null $resourcePrefix
*/
public function __construct(
Expand All @@ -70,12 +68,11 @@ public function __construct(
SalesIncrement $salesIncrement,
AddressHandler $addressHandler,
StateHandler $stateHandler,
OrderGrid $gridAggregator,
$resourcePrefix = null
) {
$this->stateHandler = $stateHandler;
$this->addressHandler = $addressHandler;
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix, $gridAggregator);
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix);
}

/**
Expand Down Expand Up @@ -199,6 +196,7 @@ protected function _afterSave(\Magento\Framework\Model\AbstractModel $object)
$relatedObject->save();
$relatedObject->setOrder($object);
}

return parent::_afterSave($object);
}
}
6 changes: 2 additions & 4 deletions app/code/Magento/Sales/Model/Resource/Order/Address.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,20 +37,18 @@ class Address extends SalesResource implements OrderAddressResourceInterface
* @param \Magento\Sales\Model\Order\Address\Validator $validator
* @param \Magento\Sales\Model\Resource\GridPool $gridPool
* @param string|null $resourcePrefix
* @param \Magento\Sales\Model\Resource\GridInterface $gridAggregator
*/
public function __construct(
\Magento\Framework\Model\Resource\Db\Context $context,
\Magento\Sales\Model\Resource\Attribute $attribute,
\Magento\Sales\Model\Increment $salesIncrement,
\Magento\Sales\Model\Order\Address\Validator $validator,
\Magento\Sales\Model\Resource\GridPool $gridPool,
$resourcePrefix = null,
\Magento\Sales\Model\Resource\GridInterface $gridAggregator = null
$resourcePrefix = null
) {
$this->_validator = $validator;
$this->gridPool = $gridPool;
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix, $gridAggregator);
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix);
}

/**
Expand Down
6 changes: 2 additions & 4 deletions app/code/Magento/Sales/Model/Resource/Order/Creditmemo.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
use Magento\Sales\Model\Increment as SalesIncrement;
use Magento\Sales\Model\Resource\Attribute;
use Magento\Sales\Model\Resource\Entity as SalesResource;
use Magento\Sales\Model\Resource\Order\Creditmemo\Grid as CreditmemoGrid;
use Magento\Sales\Model\Spi\CreditmemoResourceInterface;

/**
Expand Down Expand Up @@ -42,17 +41,15 @@ protected function _construct()
* @param \Magento\Framework\Model\Resource\Db\Context $context
* @param Attribute $attribute
* @param SalesIncrement $salesIncrement
* @param CreditmemoGrid $gridAggregator
* @param string|null $resourcePrefix
*/
public function __construct(
\Magento\Framework\Model\Resource\Db\Context $context,
Attribute $attribute,
SalesIncrement $salesIncrement,
CreditmemoGrid $gridAggregator,
$resourcePrefix = null
) {
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix, $gridAggregator);
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix);
}

/**
Expand Down Expand Up @@ -93,6 +90,7 @@ protected function _afterSave(\Magento\Framework\Model\AbstractModel $object)
$comment->save();
}
}

return parent::_afterSave($object);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,16 @@ class Comment extends Entity implements CreditmemoCommentResourceInterface
* @param \Magento\Sales\Model\Increment $salesIncrement
* @param \Magento\Sales\Model\Order\Creditmemo\Comment\Validator $validator
* @param string|null $resourcePrefix
* @param \Magento\Sales\Model\Resource\GridInterface $gridAggregator
*/
public function __construct(
\Magento\Framework\Model\Resource\Db\Context $context,
\Magento\Sales\Model\Resource\Attribute $attribute,
\Magento\Sales\Model\Increment $salesIncrement,
\Magento\Sales\Model\Order\Creditmemo\Comment\Validator $validator,
$resourcePrefix = null,
\Magento\Sales\Model\Resource\GridInterface $gridAggregator = null
$resourcePrefix = null
) {
$this->validator = $validator;
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix, $gridAggregator);
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix);
}

/**
Expand Down
Loading

0 comments on commit a454c57

Please sign in to comment.