Skip to content

Commit 3ec2cdb

Browse files
committed
MAGETWO-63571: Efficient price API optimization
1 parent 706b0b1 commit 3ec2cdb

20 files changed

+679
-945
lines changed

Diff for: app/code/Magento/Catalog/Api/BasePriceStorageInterface.php

-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ interface BasePriceStorageInterface
1717
*
1818
* @param string[] $skus
1919
* @return \Magento\Catalog\Api\Data\BasePriceInterface[]
20-
* @throws \Magento\Framework\Exception\NoSuchEntityException
2120
*/
2221
public function get(array $skus);
2322

Diff for: app/code/Magento/Catalog/Model/Product/Price/BasePriceStorage.php

+7-7
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ class BasePriceStorage implements \Magento\Catalog\Api\BasePriceStorageInterface
5454
private $pricePersistenceFactory;
5555

5656
/**
57-
* @var \Magento\Catalog\Model\Product\Price\InvalidSkuChecker
57+
* @var \Magento\Catalog\Model\Product\Price\Validation\InvalidSkuProcessor
5858
*/
59-
private $invalidSkuChecker;
59+
private $invalidSkuProcessor;
6060

6161
/**
6262
* Price type allowed.
@@ -79,7 +79,7 @@ class BasePriceStorage implements \Magento\Catalog\Api\BasePriceStorageInterface
7979
* @param \Magento\Store\Api\StoreRepositoryInterface $storeRepository
8080
* @param \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
8181
* @param \Magento\Catalog\Model\Product\Price\Validation\Result $validationResult
82-
* @param \Magento\Catalog\Model\Product\Price\InvalidSkuChecker $invalidSkuChecker
82+
* @param \Magento\Catalog\Model\Product\Price\Validation\InvalidSkuProcessor $invalidSkuProcessor
8383
* @param array $allowedProductTypes [optional]
8484
*/
8585
public function __construct(
@@ -89,7 +89,7 @@ public function __construct(
8989
\Magento\Store\Api\StoreRepositoryInterface $storeRepository,
9090
\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
9191
\Magento\Catalog\Model\Product\Price\Validation\Result $validationResult,
92-
\Magento\Catalog\Model\Product\Price\InvalidSkuChecker $invalidSkuChecker,
92+
\Magento\Catalog\Model\Product\Price\Validation\InvalidSkuProcessor $invalidSkuProcessor,
9393
array $allowedProductTypes = []
9494
) {
9595
$this->pricePersistenceFactory = $pricePersistenceFactory;
@@ -99,15 +99,15 @@ public function __construct(
9999
$this->productRepository = $productRepository;
100100
$this->validationResult = $validationResult;
101101
$this->allowedProductTypes = $allowedProductTypes;
102-
$this->invalidSkuChecker = $invalidSkuChecker;
102+
$this->invalidSkuProcessor = $invalidSkuProcessor;
103103
}
104104

105105
/**
106106
* {@inheritdoc}
107107
*/
108108
public function get(array $skus)
109109
{
110-
$this->invalidSkuChecker->isSkuListValid(
110+
$skus = $this->invalidSkuProcessor->filterSkuList(
111111
$skus,
112112
$this->allowedProductTypes,
113113
$this->priceTypeAllowed
@@ -178,7 +178,7 @@ private function retrieveValidPrices(array $prices)
178178
return $price->getSku();
179179
}, $prices)
180180
);
181-
$invalidSkus = $this->invalidSkuChecker->retrieveInvalidSkuList(
181+
$invalidSkus = $this->invalidSkuProcessor->retrieveInvalidSkuList(
182182
$skus,
183183
$this->allowedProductTypes,
184184
$this->priceTypeAllowed

Diff for: app/code/Magento/Catalog/Model/Product/Price/CostStorage.php

+8-8
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ class CostStorage implements \Magento\Catalog\Api\CostStorageInterface
3939
private $validationResult;
4040

4141
/**
42-
* @var \Magento\Catalog\Model\Product\Price\InvalidSkuChecker
42+
* @var \Magento\Catalog\Model\Product\Price\Validation\InvalidSkuProcessor
4343
*/
44-
private $invalidSkuChecker;
44+
private $invalidSkuProcessor;
4545

4646
/**
4747
* Allowed product types.
@@ -68,7 +68,7 @@ class CostStorage implements \Magento\Catalog\Api\CostStorageInterface
6868
* @param \Magento\Catalog\Model\ProductIdLocatorInterface $productIdLocator
6969
* @param \Magento\Store\Api\StoreRepositoryInterface $storeRepository
7070
* @param \Magento\Catalog\Model\Product\Price\Validation\Result $validationResult
71-
* @param \Magento\Catalog\Model\Product\Price\InvalidSkuChecker $invalidSkuChecker
71+
* @param \Magento\Catalog\Model\Product\Price\Validation\InvalidSkuProcessor $invalidSkuProcessor
7272
* @param array $allowedProductTypes [optional]
7373
*/
7474
public function __construct(
@@ -77,15 +77,15 @@ public function __construct(
7777
\Magento\Catalog\Model\ProductIdLocatorInterface $productIdLocator,
7878
\Magento\Store\Api\StoreRepositoryInterface $storeRepository,
7979
\Magento\Catalog\Model\Product\Price\Validation\Result $validationResult,
80-
\Magento\Catalog\Model\Product\Price\InvalidSkuChecker $invalidSkuChecker,
80+
\Magento\Catalog\Model\Product\Price\Validation\InvalidSkuProcessor $invalidSkuProcessor,
8181
array $allowedProductTypes = []
8282
) {
8383
$this->pricePersistenceFactory = $pricePersistenceFactory;
8484
$this->costInterfaceFactory = $costInterfaceFactory;
8585
$this->productIdLocator = $productIdLocator;
8686
$this->storeRepository = $storeRepository;
8787
$this->validationResult = $validationResult;
88-
$this->invalidSkuChecker = $invalidSkuChecker;
88+
$this->invalidSkuProcessor = $invalidSkuProcessor;
8989
$this->allowedProductTypes = $allowedProductTypes;
9090
}
9191

@@ -94,7 +94,7 @@ public function __construct(
9494
*/
9595
public function get(array $skus)
9696
{
97-
$this->invalidSkuChecker->isSkuListValid($skus, $this->allowedProductTypes);
97+
$skus = $this->invalidSkuProcessor->filterSkuList($skus, $this->allowedProductTypes);
9898
$rawPrices = $this->getPricePersistence()->get($skus);
9999
$prices = [];
100100
foreach ($rawPrices as $rawPrice) {
@@ -140,7 +140,7 @@ public function update(array $prices)
140140
*/
141141
public function delete(array $skus)
142142
{
143-
$this->invalidSkuChecker->isSkuListValid($skus, $this->allowedProductTypes);
143+
$skus = $this->invalidSkuProcessor->filterSkuList($skus, $this->allowedProductTypes);
144144
$this->getPricePersistence()->delete($skus);
145145

146146
return true;
@@ -173,7 +173,7 @@ private function retrieveValidPrices(array $prices)
173173
return $price->getSku();
174174
}, $prices)
175175
);
176-
$invalidSkus = $this->invalidSkuChecker->retrieveInvalidSkuList($skus, $this->allowedProductTypes);
176+
$invalidSkus = $this->invalidSkuProcessor->retrieveInvalidSkuList($skus, $this->allowedProductTypes);
177177

178178
foreach ($prices as $id => $price) {
179179
if (!$price->getSku() || in_array($price->getSku(), $invalidSkus)) {

Diff for: app/code/Magento/Catalog/Model/Product/Price/SpecialPriceStorage.php

+7-7
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ class SpecialPriceStorage implements \Magento\Catalog\Api\SpecialPriceStorageInt
3939
private $validationResult;
4040

4141
/**
42-
* @var \Magento\Catalog\Model\Product\Price\InvalidSkuChecker
42+
* @var \Magento\Catalog\Model\Product\Price\Validation\InvalidSkuProcessor
4343
*/
44-
private $invalidSkuChecker;
44+
private $invalidSkuProcessor;
4545

4646
/**
4747
* @var array
@@ -54,7 +54,7 @@ class SpecialPriceStorage implements \Magento\Catalog\Api\SpecialPriceStorageInt
5454
* @param \Magento\Catalog\Model\ProductIdLocatorInterface $productIdLocator
5555
* @param \Magento\Store\Api\StoreRepositoryInterface $storeRepository
5656
* @param \Magento\Catalog\Model\Product\Price\Validation\Result $validationResult
57-
* @param \Magento\Catalog\Model\Product\Price\InvalidSkuChecker $invalidSkuChecker
57+
* @param \Magento\Catalog\Model\Product\Price\Validation\InvalidSkuProcessor $invalidSkuProcessor
5858
* @param array $allowedProductTypes [optional]
5959
*/
6060
public function __construct(
@@ -63,15 +63,15 @@ public function __construct(
6363
\Magento\Catalog\Model\ProductIdLocatorInterface $productIdLocator,
6464
\Magento\Store\Api\StoreRepositoryInterface $storeRepository,
6565
\Magento\Catalog\Model\Product\Price\Validation\Result $validationResult,
66-
\Magento\Catalog\Model\Product\Price\InvalidSkuChecker $invalidSkuChecker,
66+
\Magento\Catalog\Model\Product\Price\Validation\InvalidSkuProcessor $invalidSkuProcessor,
6767
array $allowedProductTypes = []
6868
) {
6969
$this->specialPriceResource = $specialPriceResource;
7070
$this->specialPriceFactory = $specialPriceFactory;
7171
$this->productIdLocator = $productIdLocator;
7272
$this->storeRepository = $storeRepository;
7373
$this->validationResult = $validationResult;
74-
$this->invalidSkuChecker = $invalidSkuChecker;
74+
$this->invalidSkuProcessor = $invalidSkuProcessor;
7575
$this->allowedProductTypes = $allowedProductTypes;
7676
}
7777

@@ -80,7 +80,7 @@ public function __construct(
8080
*/
8181
public function get(array $skus)
8282
{
83-
$this->invalidSkuChecker->isSkuListValid($skus, $this->allowedProductTypes);
83+
$skus = $this->invalidSkuProcessor->filterSkuList($skus, $this->allowedProductTypes);
8484
$rawPrices = $this->specialPriceResource->get($skus);
8585

8686
$prices = [];
@@ -136,7 +136,7 @@ private function retrieveValidPrices(array $prices)
136136
return $price->getSku();
137137
}, $prices)
138138
);
139-
$failedSkus = $this->invalidSkuChecker->retrieveInvalidSkuList($skus, $this->allowedProductTypes);
139+
$failedSkus = $this->invalidSkuProcessor->retrieveInvalidSkuList($skus, $this->allowedProductTypes);
140140

141141
foreach ($prices as $key => $price) {
142142
if (!$price->getSku() || in_array($price->getSku(), $failedSkus)) {

Diff for: app/code/Magento/Catalog/Model/Product/Price/TierPriceStorage.php

+12-6
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public function __construct(
101101
*/
102102
public function get(array $skus)
103103
{
104-
$this->tierPriceValidator->validateSkus($skus);
104+
$skus = $this->tierPriceValidator->validateSkus($skus);
105105

106106
return $this->getExistingPrices($skus);
107107
}
@@ -117,7 +117,7 @@ public function update(array $prices)
117117
return $price->getSku();
118118
}, $prices)
119119
);
120-
$result = $this->tierPriceValidator->retrieveValidationResult($prices, $this->getExistingPrices($skus));
120+
$result = $this->tierPriceValidator->retrieveValidationResult($prices, $this->getExistingPrices($skus, true));
121121
$prices = $this->removeIncorrectPrices($prices, $result->getFailedRowIds());
122122
$formattedPrices = $this->retrieveFormattedPrices($prices);
123123
$this->tierPricePersistence->update($formattedPrices);
@@ -163,17 +163,23 @@ public function delete(array $prices)
163163
* Get existing prices by SKUs.
164164
*
165165
* @param array $skus
166+
* @param bool $groupBySku [optional]
166167
* @return array
167168
*/
168-
private function getExistingPrices(array $skus)
169+
private function getExistingPrices(array $skus, $groupBySku = false)
169170
{
170171
$ids = $this->retrieveAffectedIds($skus);
171172
$rawPrices = $this->tierPricePersistence->get($ids);
172173
$prices = [];
173174

174175
foreach ($rawPrices as $rawPrice) {
175176
$sku = $this->retrieveSkuById($rawPrice[$this->tierPricePersistence->getEntityLinkField()], $skus);
176-
$prices[] = $this->tierPriceFactory->create($rawPrice, $sku);
177+
$price = $this->tierPriceFactory->create($rawPrice, $sku);
178+
if ($groupBySku) {
179+
$prices[$sku][] = $price;
180+
} else {
181+
$prices[] = $price;
182+
}
177183
}
178184

179185
return $prices;
@@ -298,12 +304,12 @@ private function isCorrectPriceValue(array $existingPrice, array $price)
298304
*
299305
* @param int $id
300306
* @param array $skus
301-
* @return int|null
307+
* @return string|null
302308
*/
303309
private function retrieveSkuById($id, $skus)
304310
{
305311
foreach ($this->productIdLocator->retrieveProductIdsBySkus($skus) as $sku => $ids) {
306-
if (false !== array_key_exists($id, $ids)) {
312+
if (isset($ids[$id])) {
307313
return $sku;
308314
}
309315
}

Diff for: app/code/Magento/Catalog/Model/Product/Price/InvalidSkuChecker.php renamed to app/code/Magento/Catalog/Model/Product/Price/Validation/InvalidSkuProcessor.php

+10-18
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
* See COPYING.txt for license details.
55
*/
66

7-
namespace Magento\Catalog\Model\Product\Price;
7+
namespace Magento\Catalog\Model\Product\Price\Validation;
88

99
/**
1010
* Class is responsible to detect list of invalid SKU values from list of provided skus and allowed product types.
1111
*/
12-
class InvalidSkuChecker
12+
class InvalidSkuProcessor
1313
{
1414
/**
1515
* @param \Magento\Catalog\Model\ProductIdLocatorInterface $productIdLocator
@@ -24,14 +24,14 @@ public function __construct(
2424
}
2525

2626
/**
27-
* Retrieve not found or invalid SKUs and and check that their type corresponds to allowed types list.
27+
* Retrieve not found or invalid SKUs which product types are included to allowed types list.
2828
*
2929
* @param array $skus
3030
* @param array $allowedProductTypes
31-
* @param int|bool $allowedPriceTypeValue
31+
* @param int|null $allowedPriceTypeValue
3232
* @return array
3333
*/
34-
public function retrieveInvalidSkuList(array $skus, array $allowedProductTypes, $allowedPriceTypeValue = false)
34+
public function retrieveInvalidSkuList(array $skus, array $allowedProductTypes, $allowedPriceTypeValue = null)
3535
{
3636
$idsBySku = $this->productIdLocator->retrieveProductIdsBySkus($skus);
3737
$existingSkus = array_keys($idsBySku);
@@ -63,24 +63,16 @@ public function retrieveInvalidSkuList(array $skus, array $allowedProductTypes,
6363
}
6464

6565
/**
66-
* Check that SKU list is valid or return exception if it contains invalid values.
66+
* Filter invalid values in SKUs list.
6767
*
6868
* @param array $skus
6969
* @param array $allowedProductTypes
70-
* @param int|bool $allowedPriceTypeValue
71-
* @return void
72-
* @throws \Magento\Framework\Exception\NoSuchEntityException
70+
* @param int|null $allowedPriceTypeValue
71+
* @return array
7372
*/
74-
public function isSkuListValid(array $skus, array $allowedProductTypes, $allowedPriceTypeValue = false)
73+
public function filterSkuList(array $skus, array $allowedProductTypes, $allowedPriceTypeValue = null)
7574
{
7675
$failedItems = $this->retrieveInvalidSkuList($skus, $allowedProductTypes, $allowedPriceTypeValue);
77-
78-
if (!empty($failedItems)) {
79-
$values = implode(', ', $failedItems);
80-
$description = count($failedItems) == 1
81-
? __('Requested product doesn\'t exist: %sku', ['sku' => $values])
82-
: __('Requested products don\'t exist: %sku', ['sku' => $values]);
83-
throw new \Magento\Framework\Exception\NoSuchEntityException($description);
84-
}
76+
return array_diff($skus, $failedItems);
8577
}
8678
}

0 commit comments

Comments
 (0)