Skip to content

Commit a454c57

Browse files
author
Logvin, Michael(mlogvin)
committed
Merge pull request #202 from magento-firedrakes/MAGETWO-34645
[Firedrakes] Asynchronous grid reindex
2 parents f9966b1 + fa29532 commit a454c57

File tree

28 files changed

+549
-68
lines changed

28 files changed

+549
-68
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
/**
3+
* Copyright © 2015 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Sales\Model\Config\Backend\Grid;
7+
8+
/**
9+
* Backend model for global configuration value
10+
* 'dev/grid/async_indexing'.
11+
*/
12+
class AsyncIndexing extends \Magento\Framework\App\Config\Value
13+
{
14+
/**
15+
* Dispatches corresponding event after saving of configuration
16+
* value if it was changed.
17+
*
18+
* Dispatches next events:
19+
*
20+
* - config_data_dev_grid_async_indexing_enabled
21+
* - config_data_dev_grid_async_indexing_disabled
22+
*
23+
* @return $this
24+
*/
25+
public function afterSave()
26+
{
27+
if ($this->isValueChanged()) {
28+
$state = $this->getValue() ? 'enabled' : 'disabled';
29+
30+
$this->_eventManager->dispatch(
31+
$this->_eventPrefix . '_dev_grid_async_indexing_' . $state,
32+
$this->_getEventData()
33+
);
34+
}
35+
36+
return $this;
37+
}
38+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
<?php
2+
/**
3+
* Copyright © 2015 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Sales\Model\Observer;
7+
8+
/**
9+
* Sales entity grids indexing observer.
10+
*
11+
* Performs handling of events and cron jobs related to indexing
12+
* of Order, Invoice, Shipment and Creditmemo grids.
13+
*/
14+
class IndexGrid
15+
{
16+
/**
17+
* Entity grid model.
18+
*
19+
* @var \Magento\Sales\Model\Resource\GridInterface
20+
*/
21+
protected $entityGrid;
22+
23+
/**
24+
* Global configuration storage.
25+
*
26+
* @var \Magento\Framework\App\Config\ScopeConfigInterface
27+
*/
28+
protected $globalConfig;
29+
30+
/**
31+
* @param \Magento\Sales\Model\Resource\GridInterface $entityGrid
32+
* @param \Magento\Framework\App\Config\ScopeConfigInterface $globalConfig
33+
*/
34+
public function __construct(
35+
\Magento\Sales\Model\Resource\GridInterface $entityGrid,
36+
\Magento\Framework\App\Config\ScopeConfigInterface $globalConfig
37+
) {
38+
$this->entityGrid = $entityGrid;
39+
$this->globalConfig = $globalConfig;
40+
}
41+
42+
/**
43+
* Handles synchronous insertion of the new entity into
44+
* corresponding grid on certain events.
45+
*
46+
* Used in the next events:
47+
*
48+
* - sales_order_save_after
49+
* - sales_order_invoice_save_after
50+
* - sales_order_shipment_save_after
51+
* - sales_order_creditmemo_save_after
52+
*
53+
* Works only if asynchronous grid indexing is disabled
54+
* in global settings.
55+
*
56+
* @param \Magento\Framework\Event\Observer $observer
57+
* @return void
58+
*/
59+
public function syncInsert(\Magento\Framework\Event\Observer $observer)
60+
{
61+
if (!$this->globalConfig->getValue('dev/grid/async_indexing')) {
62+
$this->entityGrid->refresh($observer->getDataObject()->getId());
63+
}
64+
}
65+
66+
/**
67+
* Handles synchronous removing of the entity from
68+
* corresponding grid on certain events.
69+
*
70+
* Used in the next events:
71+
*
72+
* - sales_order_delete_after
73+
* - sales_order_invoice_delete_after
74+
* - sales_order_shipment_delete_after
75+
* - sales_order_creditmemo_delete_after
76+
*
77+
* @param \Magento\Framework\Event\Observer $observer
78+
* @return void
79+
*/
80+
public function syncRemove(\Magento\Framework\Event\Observer $observer)
81+
{
82+
$this->entityGrid->purge($observer->getDataObject()->getId());
83+
}
84+
85+
/**
86+
* Handles asynchronous insertion of the new entity into
87+
* corresponding grid during cron job.
88+
*
89+
* Also method is used in the next events:
90+
*
91+
* - config_data_dev_grid_async_indexing_disabled
92+
*
93+
* Works only if asynchronous grid indexing is enabled
94+
* in global settings.
95+
*
96+
* @return void
97+
*/
98+
public function asyncInsert()
99+
{
100+
if ($this->globalConfig->getValue('dev/grid/async_indexing')) {
101+
$this->entityGrid->refreshBySchedule();
102+
}
103+
}
104+
}

app/code/Magento/Sales/Model/Resource/AbstractGrid.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,24 @@ public function purge($value, $field = null)
7171
[($field ?: 'entity_id') . ' = ?' => $value]
7272
);
7373
}
74+
75+
/**
76+
* Returns update time of the last row in the grid.
77+
*
78+
* If there are no rows in the grid, default value will be returned.
79+
*
80+
* @param string $default
81+
* @return string
82+
*/
83+
protected function getLastUpdatedAtValue($default = '0000-00-00 00:00:00')
84+
{
85+
$select = $this->getConnection()->select()
86+
->from($this->getTable($this->gridTableName), ['updated_at'])
87+
->order('updated_at DESC')
88+
->limit(1);
89+
90+
$row = $this->getConnection()->fetchRow($select);
91+
92+
return isset($row['updated_at']) ? $row['updated_at'] : $default;
93+
}
7494
}

app/code/Magento/Sales/Model/Resource/Entity.php

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -50,28 +50,20 @@ abstract class Entity extends AbstractDb
5050
*/
5151
protected $salesIncrement;
5252

53-
/**
54-
* @var \Magento\Sales\Model\Resource\GridInterface
55-
*/
56-
protected $gridAggregator;
57-
5853
/**
5954
* @param \Magento\Framework\Model\Resource\Db\Context $context
6055
* @param Attribute $attribute
6156
* @param \Magento\Sales\Model\Increment $salesIncrement
6257
* @param string|null $resourcePrefix
63-
* @param GridInterface|null $gridAggregator
6458
*/
6559
public function __construct(
6660
\Magento\Framework\Model\Resource\Db\Context $context,
6761
\Magento\Sales\Model\Resource\Attribute $attribute,
6862
\Magento\Sales\Model\Increment $salesIncrement,
69-
$resourcePrefix = null,
70-
\Magento\Sales\Model\Resource\GridInterface $gridAggregator = null
63+
$resourcePrefix = null
7164
) {
7265
$this->attribute = $attribute;
7366
$this->salesIncrement = $salesIncrement;
74-
$this->gridAggregator = $gridAggregator;
7567
parent::__construct($context, $resourcePrefix);
7668
}
7769

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

84+
/**
85+
* Prepares data for saving and removes update time (if exists).
86+
* This prevents saving same update time on each entity update.
87+
*
88+
* @param \Magento\Framework\Model\AbstractModel $object
89+
* @return array
90+
*/
91+
protected function _prepareDataForSave(\Magento\Framework\Model\AbstractModel $object)
92+
{
93+
$data = parent::_prepareDataForTable($object, $this->getMainTable());
94+
95+
if (isset($data['updated_at'])) {
96+
unset($data['updated_at']);
97+
}
98+
99+
return $data;
100+
}
101+
92102
/**
93103
* Perform actions before object save
94104
*
@@ -127,10 +137,6 @@ public function save(\Magento\Framework\Model\AbstractModel $object)
127137
*/
128138
protected function _afterSave(\Magento\Framework\Model\AbstractModel $object)
129139
{
130-
if ($this->gridAggregator) {
131-
$this->gridAggregator->refresh($object->getId());
132-
}
133-
134140
$adapter = $this->_getReadAdapter();
135141
$columns = $adapter->describeTable($this->getMainTable());
136142

@@ -158,9 +164,6 @@ protected function _afterSave(\Magento\Framework\Model\AbstractModel $object)
158164
*/
159165
protected function _afterDelete(\Magento\Framework\Model\AbstractModel $object)
160166
{
161-
if ($this->gridAggregator) {
162-
$this->gridAggregator->purge($object->getId());
163-
}
164167
parent::_afterDelete($object);
165168
return $this;
166169
}

app/code/Magento/Sales/Model/Resource/GridInterface.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,25 @@
1212
interface GridInterface
1313
{
1414
/**
15+
* Adds new rows to the grid.
16+
*
17+
* Only rows that correspond to $value and $field parameters should be added.
18+
*
1519
* @param int|string $value
1620
* @param null|string $field
1721
* @return \Zend_Db_Statement_Interface
1822
*/
1923
public function refresh($value, $field = null);
2024

25+
/**
26+
* Adds new rows to the grid.
27+
*
28+
* Only rows created/updated since the last method call should be added.
29+
*
30+
* @return \Zend_Db_Statement_Interface
31+
*/
32+
public function refreshBySchedule();
33+
2134
/**
2235
* @param int|string $value
2336
* @param null|string $field

app/code/Magento/Sales/Model/Resource/Order.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
use Magento\Framework\Math\Random;
1010
use Magento\Sales\Model\Increment as SalesIncrement;
1111
use Magento\Sales\Model\Resource\Entity as SalesResource;
12-
use Magento\Sales\Model\Resource\Order\Grid as OrderGrid;
1312
use Magento\Sales\Model\Resource\Order\Handler\Address as AddressHandler;
1413
use Magento\Sales\Model\Resource\Order\Handler\State as StateHandler;
1514
use Magento\Sales\Model\Spi\OrderResourceInterface;
@@ -61,7 +60,6 @@ protected function _construct()
6160
* @param SalesIncrement $salesIncrement
6261
* @param AddressHandler $addressHandler
6362
* @param StateHandler $stateHandler
64-
* @param OrderGrid $gridAggregator
6563
* @param string|null $resourcePrefix
6664
*/
6765
public function __construct(
@@ -70,12 +68,11 @@ public function __construct(
7068
SalesIncrement $salesIncrement,
7169
AddressHandler $addressHandler,
7270
StateHandler $stateHandler,
73-
OrderGrid $gridAggregator,
7471
$resourcePrefix = null
7572
) {
7673
$this->stateHandler = $stateHandler;
7774
$this->addressHandler = $addressHandler;
78-
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix, $gridAggregator);
75+
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix);
7976
}
8077

8178
/**
@@ -199,6 +196,7 @@ protected function _afterSave(\Magento\Framework\Model\AbstractModel $object)
199196
$relatedObject->save();
200197
$relatedObject->setOrder($object);
201198
}
199+
202200
return parent::_afterSave($object);
203201
}
204202
}

app/code/Magento/Sales/Model/Resource/Order/Address.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,18 @@ class Address extends SalesResource implements OrderAddressResourceInterface
3737
* @param \Magento\Sales\Model\Order\Address\Validator $validator
3838
* @param \Magento\Sales\Model\Resource\GridPool $gridPool
3939
* @param string|null $resourcePrefix
40-
* @param \Magento\Sales\Model\Resource\GridInterface $gridAggregator
4140
*/
4241
public function __construct(
4342
\Magento\Framework\Model\Resource\Db\Context $context,
4443
\Magento\Sales\Model\Resource\Attribute $attribute,
4544
\Magento\Sales\Model\Increment $salesIncrement,
4645
\Magento\Sales\Model\Order\Address\Validator $validator,
4746
\Magento\Sales\Model\Resource\GridPool $gridPool,
48-
$resourcePrefix = null,
49-
\Magento\Sales\Model\Resource\GridInterface $gridAggregator = null
47+
$resourcePrefix = null
5048
) {
5149
$this->_validator = $validator;
5250
$this->gridPool = $gridPool;
53-
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix, $gridAggregator);
51+
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix);
5452
}
5553

5654
/**

app/code/Magento/Sales/Model/Resource/Order/Creditmemo.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
use Magento\Sales\Model\Increment as SalesIncrement;
1010
use Magento\Sales\Model\Resource\Attribute;
1111
use Magento\Sales\Model\Resource\Entity as SalesResource;
12-
use Magento\Sales\Model\Resource\Order\Creditmemo\Grid as CreditmemoGrid;
1312
use Magento\Sales\Model\Spi\CreditmemoResourceInterface;
1413

1514
/**
@@ -42,17 +41,15 @@ protected function _construct()
4241
* @param \Magento\Framework\Model\Resource\Db\Context $context
4342
* @param Attribute $attribute
4443
* @param SalesIncrement $salesIncrement
45-
* @param CreditmemoGrid $gridAggregator
4644
* @param string|null $resourcePrefix
4745
*/
4846
public function __construct(
4947
\Magento\Framework\Model\Resource\Db\Context $context,
5048
Attribute $attribute,
5149
SalesIncrement $salesIncrement,
52-
CreditmemoGrid $gridAggregator,
5350
$resourcePrefix = null
5451
) {
55-
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix, $gridAggregator);
52+
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix);
5653
}
5754

5855
/**
@@ -93,6 +90,7 @@ protected function _afterSave(\Magento\Framework\Model\AbstractModel $object)
9390
$comment->save();
9491
}
9592
}
93+
9694
return parent::_afterSave($object);
9795
}
9896
}

app/code/Magento/Sales/Model/Resource/Order/Creditmemo/Comment.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,16 @@ class Comment extends Entity implements CreditmemoCommentResourceInterface
3535
* @param \Magento\Sales\Model\Increment $salesIncrement
3636
* @param \Magento\Sales\Model\Order\Creditmemo\Comment\Validator $validator
3737
* @param string|null $resourcePrefix
38-
* @param \Magento\Sales\Model\Resource\GridInterface $gridAggregator
3938
*/
4039
public function __construct(
4140
\Magento\Framework\Model\Resource\Db\Context $context,
4241
\Magento\Sales\Model\Resource\Attribute $attribute,
4342
\Magento\Sales\Model\Increment $salesIncrement,
4443
\Magento\Sales\Model\Order\Creditmemo\Comment\Validator $validator,
45-
$resourcePrefix = null,
46-
\Magento\Sales\Model\Resource\GridInterface $gridAggregator = null
44+
$resourcePrefix = null
4745
) {
4846
$this->validator = $validator;
49-
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix, $gridAggregator);
47+
parent::__construct($context, $attribute, $salesIncrement, $resourcePrefix);
5048
}
5149

5250
/**

0 commit comments

Comments
 (0)