Skip to content

Commit aef28d0

Browse files
committed
MAGETWO-59801: [Performance Bug] Tax Rules Form unusable with large # of tax rates
- CR related changes
1 parent 8b19f0c commit aef28d0

File tree

12 files changed

+76
-30
lines changed

12 files changed

+76
-30
lines changed

app/code/Magento/Tax/Block/Grid/Renderer/Codes.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
*/
66
namespace Magento\Tax\Block\Grid\Renderer;
77

8+
/**
9+
* Provides tax rates codes for each tax rule in the grid.
10+
*/
811
class Codes extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer
912
{
1013
/**
@@ -16,6 +19,7 @@ class Codes extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractR
1619
public function render(\Magento\Framework\DataObject $row)
1720
{
1821
$ratesCodes = $row->getTaxRatesCodes();
22+
1923
return is_array($ratesCodes) ? implode(', ', $ratesCodes) : '';
2024
}
2125
}

app/code/Magento/Tax/Controller/Adminhtml/Rule/AjaxLoadRates.php

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,20 @@
1313
use Magento\Framework\Api\SearchCriteriaBuilder;
1414
use Magento\Tax\Model\Calculation\Rate;
1515

16+
/**
17+
* Class AjaxLoadRates is intended to load existing
18+
* Tax rates as options for a select element.
19+
*/
1620
class AjaxLoadRates extends Action
1721
{
18-
const PAGE_PARAM_NAME = 'p';
19-
const FILTER_PARAM_NAME = 's';
20-
const SEARCH_CONDITION_TYPE = 'like';
21-
2222
/**
2323
* @var RatesProvider
2424
*/
2525
private $ratesProvider;
2626

27-
/** @var SearchCriteriaBuilder */
27+
/**
28+
* @var SearchCriteriaBuilder
29+
*/
2830
private $searchCriteriaBuilder;
2931

3032
/**
@@ -49,20 +51,20 @@ public function __construct(
4951
*/
5052
public function execute()
5153
{
52-
$ratesPage = (int) $this->getRequest()->getParam(self::PAGE_PARAM_NAME);
53-
$ratesFilter = trim($this->getRequest()->getParam(self::FILTER_PARAM_NAME));
54+
$ratesPage = (int) $this->getRequest()->getParam('p');
55+
$ratesFilter = trim($this->getRequest()->getParam('s'));
5456

5557
try {
5658
if (!empty($ratesFilter)) {
5759
$this->searchCriteriaBuilder->addFilter(
5860
Rate::KEY_CODE,
5961
'%'.$ratesFilter.'%',
60-
self::SEARCH_CONDITION_TYPE
62+
'like'
6163
);
6264
}
6365

6466
$searchCriteria = $this->searchCriteriaBuilder
65-
->setPageSize(RatesProvider::PAGE_SIZE)
67+
->setPageSize($this->ratesProvider->getPageSize())
6668
->setCurrentPage($ratesPage)
6769
->create();
6870

@@ -71,7 +73,7 @@ public function execute()
7173
$response = [
7274
'success' => true,
7375
'errorMessage' => '',
74-
'result'=>$options,
76+
'result'=> $options,
7577
];
7678
} catch (\Exception $e) {
7779
$response = [

app/code/Magento/Tax/Model/Api/SearchCriteria/JoinProcessor/RateCode.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
use Magento\Framework\Data\Collection\AbstractDb;
1010

1111
/**
12-
* Class RateCode
13-
* @package Magento\Tax\Model\Api\SearchCriteria\JoinProcessor
12+
* Provides additional SQL JOIN to ensure search of required
13+
* tax rule by tax rate code in Tax Rules grid.
1414
*/
1515
class RateCode implements CustomJoinInterface
1616
{

app/code/Magento/Tax/Model/Rate/Provider.php

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6-
76
namespace Magento\Tax\Model\Rate;
87

98
use Magento\Framework\Convert\DataObject as Converter;
@@ -12,17 +11,25 @@
1211
use Magento\Tax\Model\Calculation\Rate;
1312

1413
/**
15-
* Paged Tax Rates source model.
14+
* Provides filtered tax rates models
15+
* as options for select element.
1616
*/
1717
class Provider
1818
{
19-
const PAGE_SIZE = 100;
20-
21-
/** @var TaxRateRepositoryInterface */
19+
/**
20+
* @var TaxRateRepositoryInterface
21+
*/
2222
private $taxRateRepository;
2323

24-
/** @var Converter */
25-
protected $converter;
24+
/**
25+
* @var Converter
26+
*/
27+
private $converter;
28+
29+
/**
30+
* @var int
31+
*/
32+
private $pageSize = 100;
2633

2734
/**
2835
* Initialize dependencies.
@@ -54,4 +61,14 @@ public function toOptionArray(SearchCriteriaInterface $searchCriteria)
5461
Rate::KEY_CODE
5562
);
5663
}
64+
65+
/**
66+
* Returns predefined size of tax rates list
67+
*
68+
* @return int
69+
*/
70+
public function getPageSize()
71+
{
72+
return (int) $this->pageSize;
73+
}
5774
}

app/code/Magento/Tax/Model/Rate/Source.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public function toOptionArray()
6161
{
6262
if (!$this->options) {
6363
$searchCriteria = $this->searchCriteriaBuilder
64-
->setPageSize(RateProvider::PAGE_SIZE)
64+
->setPageSize($this->rateProvider->getPageSize())
6565
->setCurrentPage(1)
6666
->create();
6767

app/code/Magento/Tax/Test/Unit/Block/Adminhtml/Rule/Edit/FormTest.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
use Magento\Tax\Model\TaxClass\Source\Product;
1919
use PHPUnit_Framework_MockObject_MockObject as MockObject;
2020

21+
/**
22+
* Test for Tax Rule Edit Form
23+
*
24+
* Class FormTest
25+
*/
2126
class FormTest extends \PHPUnit_Framework_TestCase
2227
{
2328
/**
@@ -126,7 +131,7 @@ protected function setUp()
126131
/**
127132
* Check tax lazy loading URL.
128133
*
129-
* @covers \Magento\Tax\Block\Adminhtml\Rule\Edit\Form::getTaxRatesPageUrl
134+
* @see \Magento\Tax\Block\Adminhtml\Rule\Edit\Form::getTaxRatesPageUrl
130135
*/
131136
public function testTaxRatesPageUrl()
132137
{
@@ -143,7 +148,7 @@ public function testTaxRatesPageUrl()
143148
*
144149
* @param array $formValue
145150
* @param array $expected
146-
* @covers \Magento\Tax\Block\Adminhtml\Rule\Edit\Form::getTaxRatesSelectConfig
151+
* @see \Magento\Tax\Block\Adminhtml\Rule\Edit\Form::getTaxRatesSelectConfig
147152
* @dataProvider formValuesDataProvider
148153
*/
149154
public function testTaxRatesSelectConfig($formValue, $expected)

app/code/Magento/Tax/Test/Unit/Block/Grid/Renderer/CodesTest.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
1010
use Magento\Tax\Block\Grid\Renderer\Codes;
1111

12+
/**
13+
* Test for Tax Rates codes column of Tax Rules grid.
14+
*
15+
* Class CodesTest
16+
*/
1217
class CodesTest extends \PHPUnit_Framework_TestCase
1318
{
1419
/**
@@ -27,7 +32,7 @@ protected function setUp()
2732
*
2833
* @param array $ratesCodes
2934
* @param string $expected
30-
* @covers Magento\Tax\Block\Grid\Renderer\Codes::render
35+
* @see Magento\Tax\Block\Grid\Renderer\Codes::render
3136
* @dataProvider ratesCodesDataProvider
3237
*/
3338
public function testRenderCodes($ratesCodes, $expected)

app/code/Magento/Tax/Test/Unit/Controller/Adminhtml/Rule/AjaxLoadRatesTest.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,18 @@ protected function setUp()
5858

5959
$this->searchCriteriaBuilder = $this->getMockBuilder(SearchCriteriaBuilder::class)
6060
->disableOriginalConstructor()
61-
->setMethods(['setPageSize', 'setCurrentPage', 'create'])
6261
->getMock();
6362

6463
$this->request = $this->getMockBuilder(Request::class)
6564
->disableOriginalConstructor()
66-
->setMethods(['getParam'])
6765
->getMock();
6866

6967
$this->resultFactory = $this->getMockBuilder(ResultFactory::class)
7068
->disableOriginalConstructor()
71-
->setMethods(['create'])
7269
->getMock();
7370

7471
$this->ratesProvider = $this->getMockBuilder(RatesProvider::class)
7572
->disableOriginalConstructor()
76-
->setMethods(['toOptionArray'])
7773
->getMock();
7874
}
7975

app/code/Magento/Tax/i18n/en_US.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,3 +174,4 @@ Rate,Rate
174174
"Order Total Incl. Tax","Order Total Incl. Tax"
175175
"Order Total","Order Total"
176176
"Your credit card will be charged for","Your credit card will be charged for"
177+
"An error occurred while loading tax rates.","An error occurred while loading tax rates."

dev/tests/integration/testsuite/Magento/Tax/Controller/Adminhtml/RuleTest.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
use Magento\Tax\Model\Rate\Provider as RatesProvider;
1818

1919
/**
20+
* Tests for Tax Rules controllers.
21+
*
2022
* @magentoAppArea adminhtml
2123
*/
2224
class RuleTest extends \Magento\TestFramework\TestCase\AbstractBackendController
@@ -57,6 +59,11 @@ class RuleTest extends \Magento\TestFramework\TestCase\AbstractBackendController
5759
*/
5860
private $dataObjectHelper;
5961

62+
/**
63+
* @var RatesProvider
64+
*/
65+
private $taxRatesProvider;
66+
6067
/**
6168
* @inheritdoc
6269
*/
@@ -70,6 +77,7 @@ protected function setUp()
7077
$this->taxRateFixtureFactory = new TaxRuleFixtureFactory();
7178
$this->countryFactory = $this->_objectManager->create(CountryFactory::class);
7279
$this->regionFactory = $this->_objectManager->create(RegionFactory::class);
80+
$this->taxRatesProvider = $this->_objectManager->create(RatesProvider::class);
7381

7482
$this->_generateTaxRates();
7583
}
@@ -104,7 +112,7 @@ public function testAjaxLoadRates($postData, $itemsCount)
104112
*/
105113
private function _generateTaxRates()
106114
{
107-
$ratesCount = RatesProvider::PAGE_SIZE + 1;
115+
$ratesCount = $this->taxRatesProvider->getPageSize() + 1;
108116
for ($i = 0; $i <= $ratesCount; $i++) {
109117
$taxData = [
110118
'tax_country_id' => 'US',
@@ -132,8 +140,10 @@ private function _generateTaxRates()
132140
*/
133141
public function ajaxActionDataProvider()
134142
{
143+
$taxRatesProvider = Bootstrap::getObjectManager()->create(RatesProvider::class);
144+
135145
return [
136-
[['p' => 1], RatesProvider::PAGE_SIZE],
146+
[['p' => 1], $taxRatesProvider->getPageSize()],
137147
[['p' => 1, 's' => 'no_such_code'], 0]
138148
];
139149
}

0 commit comments

Comments
 (0)