Skip to content

Commit

Permalink
Performance improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
vlmed committed Mar 4, 2024
1 parent 7a6e670 commit 2cafca2
Show file tree
Hide file tree
Showing 7 changed files with 264 additions and 2 deletions.
19 changes: 18 additions & 1 deletion Model/DataMapping/FieldValueRenderer/OrderItem/OrderField.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
namespace Bloomreach\EngagementConnector\Model\DataMapping\FieldValueRenderer\OrderItem;

use Bloomreach\EngagementConnector\Model\DataMapping\FieldValueRenderer\RenderInterface;
use Bloomreach\EngagementConnector\Model\Order\OrderRepository;
use Magento\Framework\Api\AbstractSimpleObject;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Model\AbstractModel;
use Magento\Sales\Api\Data\OrderInterface;

Expand All @@ -17,18 +19,33 @@
*/
class OrderField implements RenderInterface
{
/**
* @var OrderRepository
*/
private $orderRepository;

/**
* @param OrderRepository $orderRepository
*/
public function __construct(OrderRepository $orderRepository)
{
$this->orderRepository = $orderRepository;
}

/**
* Render the value of order field
*
* @param AbstractSimpleObject|AbstractModel $entity
* @param string $fieldCode
*
* @return string
* @throws NoSuchEntityException
*/
public function render($entity, string $fieldCode)
{
$orderId = $entity->getOrderId();
/** @var OrderInterface $order */
$order = $entity->getOrder();
$order = $orderId ? $this->orderRepository->getById((int) $orderId) : $entity->getOrder();

return $order ? (string) $order->getData($fieldCode) : '';
}
Expand Down
41 changes: 41 additions & 0 deletions Model/DataProvider/DB/SnapshotSettings.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php
/**
* @author Bloomreach
* @copyright Copyright (c) Bloomreach (https://www.bloomreach.com/)
*/
declare(strict_types=1);

namespace Bloomreach\EngagementConnector\Model\DataProvider\DB;

/**
* Snapshot Settings data provider
*/
class SnapshotSettings
{
/**
* @var bool
*/
private $status = true;

/**
* Is enabled
*
* @return bool
*/
public function isEnabled(): bool
{
return $this->status;
}

/**
* Set Enabled
*
* @param bool $status
*
* @return void
*/
public function setEnabled(bool $status): void
{
$this->status = $status;
}
}
21 changes: 20 additions & 1 deletion Model/Export/QueueProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Bloomreach\EngagementConnector\Api\Data\InitialExportStatusInterface;
use Bloomreach\EngagementConnector\Api\SaveInitialExportStatusInterface;
use Bloomreach\EngagementConnector\Model\DataMapping\DataMapperResolver;
use Bloomreach\EngagementConnector\Model\DataProvider\DB\SnapshotSettings;
use Bloomreach\EngagementConnector\Model\DataProvider\EntityType;
use Bloomreach\EngagementConnector\Model\Export\Condition\IsInitialExportAllowed;
use Bloomreach\EngagementConnector\Model\Export\Entity\CollectionFactory as EntityCollectionFactory;
Expand Down Expand Up @@ -114,6 +115,11 @@ class QueueProcessor
*/
private $exportQueueRegistry;

/**
* @var SnapshotSettings
*/
private $snapshotSettings;

/**
* @param EntityType $entityType
* @param EntityCollectionFactory $entityCollectionFactory
Expand All @@ -127,6 +133,7 @@ class QueueProcessor
* @param AddNewErrorMessage $addNewErrorMessage
* @param LoggerInterface $logger
* @param ExportQueueRegistry $exportQueueRegistry
* @param SnapshotSettings $snapshotSettings
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
Expand All @@ -141,7 +148,8 @@ public function __construct(
AddInitialExportDataToExportQueue $addInitialExportDataToExportQueue,
AddNewErrorMessage $addNewErrorMessage,
LoggerInterface $logger,
ExportQueueRegistry $exportQueueRegistry
ExportQueueRegistry $exportQueueRegistry,
SnapshotSettings $snapshotSettings
) {
$this->entityType = $entityType;
$this->entityCollectionFactory = $entityCollectionFactory;
Expand All @@ -155,6 +163,7 @@ public function __construct(
$this->addNewErrorMessage = $addNewErrorMessage;
$this->logger = $logger;
$this->exportQueueRegistry = $exportQueueRegistry;
$this->snapshotSettings = $snapshotSettings;
}

/**
Expand All @@ -164,6 +173,10 @@ public function __construct(
*/
public function process(): void
{
//Disable db snapshot for all entities except ExportQueue and InitialExportStatus to prevent issue with memory
//A snapshot is not required as entities other than ExportQueue and InitialExportStatus are not updated
$this->snapshotSettings->setEnabled(false);

//Retrieve each entity separately to prevent it from being processed by another cron process
foreach ($this->entityType->getAllTypes() as $entityType) {
$initialExportStatus = $this->initialExportStatusGetter->execute($entityType);
Expand All @@ -172,8 +185,14 @@ public function process(): void
&& $this->isInitialExportAllowed->execute($initialExportStatus->getEntityType())
) {
$this->addEntityTypeToExportQueue($initialExportStatus);

//Handle only one entity type per execution to avoid memory issues
return;
}
}

//Enable db snapshot
$this->snapshotSettings->setEnabled(true);
}

/**
Expand Down
65 changes: 65 additions & 0 deletions Model/Order/OrderRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?php
/**
* @author Bloomreach
* @copyright Copyright (c) Bloomreach (https://www.bloomreach.com/)
*/
declare(strict_types=1);

namespace Bloomreach\EngagementConnector\Model\Order;

use Bloomreach\EngagementConnector\Model\ResourceModel\Order as OrderResource;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Sales\Api\Data\OrderInterface;

/**
* This class is responsible for loading orders by ID
* - It stores only one order in the local cache, unlike the OrderRepository
* - It only returns data from `sales_order` table
*/
class OrderRepository
{
/**
* @var OrderResource
*/
private $orderResource;

/**
* @var OrderInterface|null
*/
private $cachedOrder;

/**
* @param OrderResource $orderResource
*/
public function __construct(OrderResource $orderResource)
{
$this->orderResource = $orderResource;
}

/**
* Get Order by ID
*
* @param int $orderId
*
* @return OrderInterface
* @throws NoSuchEntityException
*/
public function getById(int $orderId): OrderInterface
{
if (($this->cachedOrder instanceof OrderInterface) && (int) $this->cachedOrder->getId() === $orderId) {
return $this->cachedOrder;
}

$order = $this->orderResource->getById($orderId);

if ($order->getId()) {
$this->cachedOrder = $order;

return $this->cachedOrder;
}

throw new NoSuchEntityException(
__('The entity that was requested doesn\'t exist. Verify the entity and try again.')
);
}
}
57 changes: 57 additions & 0 deletions Model/ResourceModel/Order.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?php
/**
* @author Bloomreach
* @copyright Copyright (c) Bloomreach (https://www.bloomreach.com/)
*/
declare(strict_types=1);

namespace Bloomreach\EngagementConnector\Model\ResourceModel;

use Magento\Framework\App\ResourceConnection;
use Magento\Sales\Api\Data\OrderInterface;
use Magento\Sales\Model\OrderFactory as OrderModelFactory;

/**
* This resource model is responsible for getting simplified order object
*/
class Order
{
/**
* @var ResourceConnection
*/
private $resourceConnection;

/**
* @var OrderModelFactory
*/
private $orderModelFactory;

/**
* @param ResourceConnection $resourceConnection
* @param OrderModelFactory $orderModelFactory
*/
public function __construct(
ResourceConnection $resourceConnection,
OrderModelFactory $orderModelFactory
) {
$this->resourceConnection = $resourceConnection;
$this->orderModelFactory = $orderModelFactory;
}

/**
* Get order by id
*
* @param int $orderId
*
* @return OrderInterface
*/
public function getById(int $orderId): OrderInterface
{
$connection = $this->resourceConnection->getConnection();
$select = $connection->select()->reset()->from($connection->getTableName('sales_order'));
$select->where('entity_id = ?', $orderId);
$result = $connection->fetchRow($select);

return $this->orderModelFactory->create(['data' => is_array($result) ? $result : []]);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php
/**
* @author Bloomreach
* @copyright Copyright (c) Bloomreach (https://www.bloomreach.com/)
*/
declare(strict_types=1);

namespace Bloomreach\EngagementConnector\Plugin\Framework\Model\ResourceModel\Db\VersionControl;

use Bloomreach\EngagementConnector\Api\Data\ExportQueueInterface;
use Bloomreach\EngagementConnector\Api\Data\InitialExportStatusInterface;
use Bloomreach\EngagementConnector\Model\DataProvider\DB\SnapshotSettings;
use Magento\Framework\DataObject;
use Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot as Subject;

/**
* This plugin is responsible for disabling db snapshot
*/
class DisableSnapshot
{
/**
* @var SnapshotSettings
*/
private $snapshotSettings;

/**
* @param SnapshotSettings $snapshotSettings
*/
public function __construct(SnapshotSettings $snapshotSettings)
{
$this->snapshotSettings = $snapshotSettings;
}

/**
* Creates snapshot only if it is enabled
*
* Snapshot is disabled for all entities except:
* - ExportQueue
* - InitialExportStatus
*
* Snapshot is only disabled during preparing Export queue
*
* @param Subject $subject
* @param callable $proceed
* @param DataObject $entity
*
* @return void
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function aroundRegisterSnapshot(Subject $subject, callable $proceed, DataObject $entity)
{
if ($this->snapshotSettings->isEnabled()
|| ($entity instanceof ExportQueueInterface)
|| ($entity instanceof InitialExportStatusInterface)
) {
$proceed($entity);
}
}
}
4 changes: 4 additions & 0 deletions etc/di.xml
Original file line number Diff line number Diff line change
Expand Up @@ -541,4 +541,8 @@
</argument>
</arguments>
</type>
<type name="Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot">
<plugin name="bloomreach_engagement_prevent_db_snapshot"
type="Bloomreach\EngagementConnector\Plugin\Framework\Model\ResourceModel\Db\VersionControl\DisableSnapshot" />
</type>
</config>

0 comments on commit 2cafca2

Please sign in to comment.