Skip to content

Commit 60b5c0c

Browse files
authored
ENGCOM-9130: Optimize QuoteIdToMaskedQuoteId model #33324
2 parents f3e8f25 + bb99aa0 commit 60b5c0c

File tree

3 files changed

+71
-18
lines changed

3 files changed

+71
-18
lines changed

app/code/Magento/Quote/Model/QuoteIdToMaskedQuoteId.php

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77

88
namespace Magento\Quote\Model;
99

10+
use Magento\Framework\App\ObjectManager;
11+
use Magento\Framework\Exception\NoSuchEntityException;
1012
use Magento\Quote\Api\CartRepositoryInterface;
13+
use Magento\Quote\Model\ResourceModel\Quote as QuoteResource;
1114
use Magento\Quote\Model\ResourceModel\Quote\QuoteIdMask as QuoteIdMaskResource;
1215

1316
/**
@@ -16,46 +19,51 @@
1619
class QuoteIdToMaskedQuoteId implements QuoteIdToMaskedQuoteIdInterface
1720
{
1821
/**
19-
* @var QuoteIdMaskFactory
20-
*/
21-
private $quoteIdMaskFactory;
22-
/**
23-
* @var CartRepositoryInterface
22+
* @var QuoteIdMaskResource
2423
*/
25-
private $cartRepository;
24+
private $quoteIdMaskResource;
2625

2726
/**
28-
* @var QuoteIdMaskResource
27+
* @var QuoteResource
2928
*/
30-
private $quoteIdMaskResource;
29+
private $quoteResource;
3130

3231
/**
3332
* @param QuoteIdMaskFactory $quoteIdMaskFactory
3433
* @param CartRepositoryInterface $cartRepository
3534
* @param QuoteIdMaskResource $quoteIdMaskResource
35+
* @param QuoteResource|null $quoteResourceModel
36+
*
37+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
3638
*/
3739
public function __construct(
3840
QuoteIdMaskFactory $quoteIdMaskFactory,
3941
CartRepositoryInterface $cartRepository,
40-
QuoteIdMaskResource $quoteIdMaskResource
42+
QuoteIdMaskResource $quoteIdMaskResource,
43+
QuoteResource $quoteResourceModel = null
4144
) {
42-
$this->quoteIdMaskFactory = $quoteIdMaskFactory;
43-
$this->cartRepository = $cartRepository;
4445
$this->quoteIdMaskResource = $quoteIdMaskResource;
46+
$this->quoteResource = $quoteResourceModel ?? ObjectManager::getInstance()->get(QuoteResource::class);
4547
}
4648

4749
/**
4850
* @inheritDoc
4951
*/
5052
public function execute(int $quoteId): string
5153
{
52-
/* Check the quote exists to avoid database constraint issues */
53-
$this->cartRepository->get($quoteId);
54-
55-
$quoteIdMask = $this->quoteIdMaskFactory->create();
56-
$this->quoteIdMaskResource->load($quoteIdMask, $quoteId, 'quote_id');
57-
$maskedId = $quoteIdMask->getMaskedId() ?? '';
54+
// Check the quote exists to avoid database constraint issues
55+
if (!$this->quoteResource->isExists($quoteId)) {
56+
throw new NoSuchEntityException(
57+
__(
58+
'No such entity with %fieldName = %fieldValue',
59+
[
60+
'fieldName' => 'quoteId',
61+
'fieldValue' => $quoteId
62+
]
63+
)
64+
);
65+
}
5866

59-
return $maskedId;
67+
return (string)$this->quoteIdMaskResource->getMaskedQuoteId($quoteId);
6068
}
6169
}

app/code/Magento/Quote/Model/ResourceModel/Quote.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,4 +319,26 @@ public function save(\Magento\Framework\Model\AbstractModel $object)
319319

320320
return $this;
321321
}
322+
323+
/**
324+
* Quickly check if quote exists
325+
*
326+
* Uses direct DB query due to performance reasons
327+
*
328+
* @param int $quoteId
329+
* @return bool
330+
*/
331+
public function isExists(int $quoteId): bool
332+
{
333+
$connection = $this->getConnection();
334+
$mainTable = $this->getMainTable();
335+
$idFieldName = $this->getIdFieldName();
336+
337+
$field = $connection->quoteIdentifier(sprintf('%s.%s', $mainTable, $idFieldName));
338+
$select = $connection->select()
339+
->from($mainTable, [$idFieldName])
340+
->where($field . '=?', $quoteId);
341+
342+
return (bool)$connection->fetchOne($select);
343+
}
322344
}

app/code/Magento/Quote/Model/ResourceModel/Quote/QuoteIdMask.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,27 @@ protected function _construct()
2222
{
2323
$this->_init('quote_id_mask', 'entity_id');
2424
}
25+
26+
/**
27+
* Retrieves masked quote id
28+
*
29+
* Uses direct DB query due to performance reasons
30+
*
31+
* @param int $quoteId
32+
* @return string|null
33+
*/
34+
public function getMaskedQuoteId(int $quoteId): ?string
35+
{
36+
$connection = $this->getConnection();
37+
$mainTable = $this->getMainTable();
38+
$field = $connection->quoteIdentifier(sprintf('%s.%s', $mainTable, 'quote_id'));
39+
40+
$select = $connection->select()
41+
->from($mainTable, ['masked_id'])
42+
->where($field . '=?', $quoteId);
43+
44+
$result = $connection->fetchOne($select);
45+
46+
return $result ?: null;
47+
}
2548
}

0 commit comments

Comments
 (0)