Skip to content

Commit

Permalink
FRW-9739 Adjusted DDE API performance. (#11273)
Browse files Browse the repository at this point in the history
FRW-9739 Adjusted DDE API performance.
  • Loading branch information
dimitriyTsemma authored Jan 28, 2025
1 parent d4bd24d commit f735e0e
Show file tree
Hide file tree
Showing 13 changed files with 403 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/Spryker/Shared/Url/Transfer/url.transfer.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<property name="resourceType" type="string" deprecated="Use appropriate fkResourceXYZ attribute instead."/>
<property name="resourceId" type="int" deprecated="Use appropriate fkResourceXYZ attribute instead."/>
<property name="fkResourceRedirect" type="int"/>
<property name="originalUrl" type="string"/>
</transfer>

<transfer name="UrlRedirect">
Expand Down
49 changes: 49 additions & 0 deletions src/Spryker/Zed/Url/Business/BulkCreator/UrlBulkCreator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

namespace Spryker\Zed\Url\Business\BulkCreator;

use Spryker\Zed\Url\Persistence\UrlEntityManagerInterface;

class UrlBulkCreator implements UrlBulkCreatorInterface
{
/**
* @param array<\Spryker\Zed\Url\Business\Url\UrlCreatorBeforeSaveObserverInterface> $createBeforeSaveObservers
* @param array<\Spryker\Zed\Url\Business\Url\UrlCreatorAfterSaveObserverInterface> $createAfterSaveObservers
* @param \Spryker\Zed\Url\Persistence\UrlEntityManagerInterface $urlEntityManager
*/
public function __construct(
protected array $createBeforeSaveObservers,
protected array $createAfterSaveObservers,
protected UrlEntityManagerInterface $urlEntityManager
) {
}

/**
* @param array<\Generated\Shared\Transfer\UrlTransfer> $urlTransfers
*
* @return array<\Generated\Shared\Transfer\UrlTransfer>
*/
public function create(array $urlTransfers): array
{
foreach ($urlTransfers as $urlTransfer) {
foreach ($this->createBeforeSaveObservers as $observer) {
$observer->handleUrlCreation($urlTransfer);
}
}

$this->urlEntityManager->saveUrlEntities($urlTransfers);

foreach ($urlTransfers as $urlTransfer) {
foreach ($this->createAfterSaveObservers as $observer) {
$observer->handleUrlCreation($urlTransfer);
}
}

return $urlTransfers;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

namespace Spryker\Zed\Url\Business\BulkCreator;

interface UrlBulkCreatorInterface
{
/**
* @param array<\Generated\Shared\Transfer\UrlTransfer> $urlTransfers
*
* @return array<\Generated\Shared\Transfer\UrlTransfer>
*/
public function create(array $urlTransfers): array;
}
60 changes: 60 additions & 0 deletions src/Spryker/Zed/Url/Business/BulkSaver/UrlBulkSaver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

namespace Spryker\Zed\Url\Business\BulkSaver;

use Spryker\Zed\Url\Business\BulkCreator\UrlBulkCreatorInterface;
use Spryker\Zed\Url\Business\BulkUpdater\UrlBulkUpdaterInterface;

class UrlBulkSaver implements UrlBulkSaverInterface
{
/**
* @param \Spryker\Zed\Url\Business\BulkCreator\UrlBulkCreatorInterface $urlBulkCreator
* @param \Spryker\Zed\Url\Business\BulkUpdater\UrlBulkUpdaterInterface $urlBulkUpdater
*/
public function __construct(
protected UrlBulkCreatorInterface $urlBulkCreator,
protected UrlBulkUpdaterInterface $urlBulkUpdater
) {
}

/**
* @param array<\Generated\Shared\Transfer\UrlTransfer> $urlTransfers
*
* @return array<\Generated\Shared\Transfer\UrlTransfer>
*/
public function save(array $urlTransfers): array
{
[$newUrlTransfers, $existingUrlTransfers] = $this->separateNewTransferFromExisting($urlTransfers);

$urlTransfers = $this->urlBulkCreator->create($newUrlTransfers);

return array_merge($urlTransfers, $this->urlBulkUpdater->update($existingUrlTransfers));
}

/**
* @param array<\Generated\Shared\Transfer\UrlTransfer> $urlTransfers
*
* @return array<array<\Generated\Shared\Transfer\UrlTransfer>>
*/
protected function separateNewTransferFromExisting(array $urlTransfers): array
{
$newUrlTransfers = [];
$existingUrlTransfers = [];

foreach ($urlTransfers as $urlTransfer) {
if ($urlTransfer->getIdUrl() === null) {
$newUrlTransfers[] = $urlTransfer;

continue;
}
$existingUrlTransfers[] = $urlTransfer;
}

return [$newUrlTransfers, $existingUrlTransfers];
}
}
18 changes: 18 additions & 0 deletions src/Spryker/Zed/Url/Business/BulkSaver/UrlBulkSaverInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

namespace Spryker\Zed\Url\Business\BulkSaver;

interface UrlBulkSaverInterface
{
/**
* @param array<\Generated\Shared\Transfer\UrlTransfer> $urlTransfers
*
* @return array<\Generated\Shared\Transfer\UrlTransfer>
*/
public function save(array $urlTransfers): array;
}
100 changes: 100 additions & 0 deletions src/Spryker/Zed/Url/Business/BulkUpdater/UrlBulkUpdater.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

namespace Spryker\Zed\Url\Business\BulkUpdater;

use Generated\Shared\Transfer\UrlTransfer;
use Spryker\Zed\Url\Business\Url\UrlReaderInterface;
use Spryker\Zed\Url\Persistence\UrlEntityManagerInterface;

class UrlBulkUpdater implements UrlBulkUpdaterInterface
{
/**
* @param \Spryker\Zed\Url\Business\Url\UrlReaderInterface $urlReader
* @param array<\Spryker\Zed\Url\Business\Url\UrlUpdaterBeforeSaveObserverInterface> $updateBeforeSaveObservers
* @param array<\Spryker\Zed\Url\Business\Url\UrlUpdaterAfterSaveObserverInterface> $updateAfterSaveObservers
* @param \Spryker\Zed\Url\Persistence\UrlEntityManagerInterface $urlEntityManager
*/
public function __construct(
protected UrlReaderInterface $urlReader,
protected array $updateBeforeSaveObservers,
protected array $updateAfterSaveObservers,
protected UrlEntityManagerInterface $urlEntityManager
) {
}

/**
* @param array<\Generated\Shared\Transfer\UrlTransfer> $urlTransfers
*
* @return array<\Generated\Shared\Transfer\UrlTransfer>
*/
public function update(array $urlTransfers): array
{
[$urlTransfers, $originalTransfers] = $this->filterExistingUrlTransfers($urlTransfers);

foreach ($urlTransfers as $urlTransfer) {
$this->notifyUpdateBeforeSaveObservers($urlTransfer, $originalTransfers[$urlTransfer->getIdUrl()]);
}

$this->urlEntityManager->saveUrlEntities($urlTransfers, false);

foreach ($urlTransfers as $urlTransfer) {
$this->notifyUpdateAfterSaveObservers($urlTransfer, $originalTransfers[$urlTransfer->getIdUrl()]);
}

return $urlTransfers;
}

/**
* @param \Generated\Shared\Transfer\UrlTransfer $urlTransfer
* @param \Generated\Shared\Transfer\UrlTransfer $originalTransfer
*
* @return void
*/
protected function notifyUpdateBeforeSaveObservers(UrlTransfer $urlTransfer, UrlTransfer $originalTransfer): void
{
foreach ($this->updateBeforeSaveObservers as $observer) {
$observer->handleUrlUpdate($urlTransfer, $originalTransfer);
}
}

/**
* @param \Generated\Shared\Transfer\UrlTransfer $urlTransfer
* @param \Generated\Shared\Transfer\UrlTransfer $originalTransfer
*
* @return void
*/
protected function notifyUpdateAfterSaveObservers(UrlTransfer $urlTransfer, UrlTransfer $originalTransfer): void
{
foreach ($this->updateAfterSaveObservers as $observer) {
$observer->handleUrlUpdate($urlTransfer, $originalTransfer);
}
}

/**
* @param array<\Generated\Shared\Transfer\UrlTransfer> $urlTransfers
*
* @return array<array<\Generated\Shared\Transfer\UrlTransfer>>
*/
protected function filterExistingUrlTransfers(array $urlTransfers): array
{
$filteredUrlTransfers = [];
$originalTransfers = [];
foreach ($urlTransfers as $urlTransfer) {
if ($urlTransfer->getOriginalUrl() === $urlTransfer->getUrl() || $this->urlReader->hasUrl($urlTransfer)) {
continue;
}

$filteredUrlTransfers[$urlTransfer->getIdUrl()] = $urlTransfer;
$originalTransfer = clone $urlTransfer;
$originalTransfer->setUrl($urlTransfer->getOriginalUrl());
$originalTransfers[$urlTransfer->getIdUrl()] = $originalTransfer;
}

return [$filteredUrlTransfers, $originalTransfers];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

namespace Spryker\Zed\Url\Business\BulkUpdater;

interface UrlBulkUpdaterInterface
{
/**
* @param array<\Generated\Shared\Transfer\UrlTransfer> $urlTransfers
*
* @return array<\Generated\Shared\Transfer\UrlTransfer>
*/
public function update(array $urlTransfers): array;
}
43 changes: 43 additions & 0 deletions src/Spryker/Zed/Url/Business/UrlBusinessFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@
namespace Spryker\Zed\Url\Business;

use Spryker\Zed\Kernel\Business\AbstractBusinessFactory;
use Spryker\Zed\Url\Business\BulkCreator\UrlBulkCreator;
use Spryker\Zed\Url\Business\BulkCreator\UrlBulkCreatorInterface;
use Spryker\Zed\Url\Business\BulkSaver\UrlBulkSaver;
use Spryker\Zed\Url\Business\BulkSaver\UrlBulkSaverInterface;
use Spryker\Zed\Url\Business\BulkUpdater\UrlBulkUpdater;
use Spryker\Zed\Url\Business\BulkUpdater\UrlBulkUpdaterInterface;
use Spryker\Zed\Url\Business\Deletion\AbstractUrlDeleterSubject;
use Spryker\Zed\Url\Business\Deletion\Observer\UrlDeletePluginObserver;
use Spryker\Zed\Url\Business\Deletion\UrlDeleter;
Expand Down Expand Up @@ -35,6 +41,7 @@
* @method \Spryker\Zed\Url\Persistence\UrlQueryContainerInterface getQueryContainer()
* @method \Spryker\Zed\Url\UrlConfig getConfig()
* @method \Spryker\Zed\Url\Persistence\UrlRepositoryInterface getRepository()
* @method \Spryker\Zed\Url\Persistence\UrlEntityManagerInterface getEntityManager()
*/
class UrlBusinessFactory extends AbstractBusinessFactory
{
Expand Down Expand Up @@ -163,6 +170,42 @@ public function createRedirectManager()
);
}

/**
* @return \Spryker\Zed\Url\Business\BulkSaver\UrlBulkSaverInterface
*/
public function createUrlBulkSaver(): UrlBulkSaverInterface
{
return new UrlBulkSaver(
$this->createUrlBulkCreator(),
$this->createUrlBulkUpdater(),
);
}

/**
* @return \Spryker\Zed\Url\Business\BulkCreator\UrlBulkCreatorInterface
*/
public function createUrlBulkCreator(): UrlBulkCreatorInterface
{
return new UrlBulkCreator(
$this->createUrlCreatorBeforeSaveObservers(),
$this->createUrlCreatorAfterSaveObservers(),
$this->getEntityManager(),
);
}

/**
* @return \Spryker\Zed\Url\Business\BulkUpdater\UrlBulkUpdaterInterface
*/
public function createUrlBulkUpdater(): UrlBulkUpdaterInterface
{
return new UrlBulkUpdater(
$this->createUrlReader(),
$this->createUrlUpdaterBeforeSaveObservers(),
$this->createUrlUpdaterAfterSaveObservers(),
$this->getEntityManager(),
);
}

/**
* @return \Spryker\Zed\Url\Dependency\UrlToTouchInterface
*/
Expand Down
15 changes: 15 additions & 0 deletions src/Spryker/Zed/Url/Business/UrlFacade.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
/**
* @method \Spryker\Zed\Url\Business\UrlBusinessFactory getFactory()
* @method \Spryker\Zed\Url\Persistence\UrlRepositoryInterface getRepository()
* @method \Spryker\Zed\Url\Persistence\UrlEntityManagerInterface getEntityManager()
*/
class UrlFacade extends AbstractFacade implements UrlFacadeInterface
{
Expand Down Expand Up @@ -755,4 +756,18 @@ public function getUrlCollection(UrlCriteriaTransfer $urlCriteriaTransfer): UrlC
{
return $this->getRepository()->getUrlCollection($urlCriteriaTransfer);
}

/**
* {@inheritDoc}
*
* @api
*
* @param array<\Generated\Shared\Transfer\UrlTransfer> $urlTransfers
*
* @return array<\Generated\Shared\Transfer\UrlTransfer>
*/
public function saveUrlCollection(array $urlTransfers): array
{
return $this->getFactory()->createUrlBulkSaver()->save($urlTransfers);
}
}
13 changes: 13 additions & 0 deletions src/Spryker/Zed/Url/Business/UrlFacadeInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -600,4 +600,17 @@ public function getUrlByIdProductAbstractAndIdLocale($idProductAbstract, $idLoca
* @return \Generated\Shared\Transfer\UrlCollectionTransfer
*/
public function getUrlCollection(UrlCriteriaTransfer $urlCriteriaTransfer): UrlCollectionTransfer;

/**
* Specification:
* - Persists a collection of URL entities to the database.
* - Not following Bulk Facade methods flow due to the necessity to be as fast as possible.
*
* @api
*
* @param array<\Generated\Shared\Transfer\UrlTransfer> $urlTransfers
*
* @return array<\Generated\Shared\Transfer\UrlTransfer>
*/
public function saveUrlCollection(array $urlTransfers): array;
}
Loading

0 comments on commit f735e0e

Please sign in to comment.