From f4fb3fcdb0e2c7c1d018dd6ac87d3b61fe0c6f99 Mon Sep 17 00:00:00 2001 From: Cristian Partica <cpartica@magento.com> Date: Wed, 28 Dec 2016 17:07:47 -0600 Subject: [PATCH] MAGETWO-58924: SQL error wait timeout error when saving categories - use clone instead of non shared object because of performance improvement --- .../Category/ChildrenUrlRewriteGenerator.php | 19 ++++++----- .../CurrentUrlRewritesRegenerator.php | 21 ++++++------ .../Model/CategoryUrlRewriteGenerator.php | 30 +++++++++-------- .../Product/CurrentUrlRewritesRegenerator.php | 21 ++++++------ .../Model/ProductScopeRewriteGenerator.php | 32 +++++++++++-------- .../Observer/AfterImportDataObserver.php | 23 +++++++------ .../Observer/UrlRewriteHandler.php | 30 +++++++++-------- .../ChildrenUrlRewriteGeneratorTest.php | 10 +++++- .../CurrentUrlRewritesRegeneratorTest.php | 16 +++++++--- .../Model/CategoryUrlRewriteGeneratorTest.php | 10 +++++- .../CurrentUrlRewritesRegeneratorTest.php | 14 ++++++-- .../ProductScopeRewriteGeneratorTest.php | 10 +++++- .../Observer/AfterImportDataObserverTest.php | 10 +++++- app/code/Magento/UrlRewrite/etc/di.xml | 1 - .../Model/CategoryUrlRewriteGeneratorTest.php | 6 ++-- 15 files changed, 162 insertions(+), 91 deletions(-) diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Category/ChildrenUrlRewriteGenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/Category/ChildrenUrlRewriteGenerator.php index 14215d62310..6080c14ee24 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Category/ChildrenUrlRewriteGenerator.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Category/ChildrenUrlRewriteGenerator.php @@ -8,7 +8,7 @@ namespace Magento\CatalogUrlRewrite\Model\Category; use Magento\Catalog\Model\Category; use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGeneratorFactory; use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator; -use Magento\UrlRewrite\Model\UrlRewritesSet; +use Magento\UrlRewrite\Model\UrlRewritesSetFactory; use Magento\Framework\App\ObjectManager; class ChildrenUrlRewriteGenerator @@ -20,21 +20,23 @@ class ChildrenUrlRewriteGenerator protected $categoryUrlRewriteGeneratorFactory; /** @var \Magento\UrlRewrite\Model\UrlRewritesSet */ - private $urlRewritesSet; + private $urlRewritesSetPlaceHolder; /** * @param \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider $childrenCategoriesProvider * @param \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGeneratorFactory $categoryUrlRewriteGeneratorFactory - * @param UrlRewritesSet|null $urlRewritesSet + * @param \Magento\UrlRewrite\Model\UrlRewritesSetFactory|null $urlRewritesSetFactory */ public function __construct( ChildrenCategoriesProvider $childrenCategoriesProvider, CategoryUrlRewriteGeneratorFactory $categoryUrlRewriteGeneratorFactory, - UrlRewritesSet $urlRewritesSet = null + UrlRewritesSetFactory $urlRewritesSetFactory = null ) { $this->childrenCategoriesProvider = $childrenCategoriesProvider; $this->categoryUrlRewriteGeneratorFactory = $categoryUrlRewriteGeneratorFactory; - $this->urlRewritesSet = $urlRewritesSet ?: ObjectManager::getInstance()->get(UrlRewritesSet::class); + $urlRewritesSetFactory = $urlRewritesSetFactory ?: ObjectManager::getInstance() + ->get(UrlRewritesSetFactory::class); + $this->urlRewritesSetPlaceHolder = $urlRewritesSetFactory->create(); } /** @@ -47,18 +49,19 @@ class ChildrenUrlRewriteGenerator */ public function generate($storeId, Category $category, $rootCategoryId = null) { + $urlRewritesSet = clone $this->urlRewritesSetPlaceHolder; foreach ($this->childrenCategoriesProvider->getChildren($category, true) as $childCategory) { $childCategory->setStoreId($storeId); $childCategory->setData('save_rewrites_history', $category->getData('save_rewrites_history')); /** @var CategoryUrlRewriteGenerator $categoryUrlRewriteGenerator */ $categoryUrlRewriteGenerator = $this->categoryUrlRewriteGeneratorFactory->create(); - $this->urlRewritesSet->merge( + $urlRewritesSet->merge( $categoryUrlRewriteGenerator->generate($childCategory, false, $rootCategoryId) ); } - $result = $this->urlRewritesSet->getData(); - $this->urlRewritesSet->resetData(); + $result = $urlRewritesSet->getData(); + $urlRewritesSet->resetData(); return $result; } } diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php index becdab0e8c1..6988efcabbb 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php @@ -14,7 +14,7 @@ use Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory; use Magento\UrlRewrite\Service\V1\Data\UrlRewrite; use Magento\CatalogUrlRewrite\Model\Map\UrlRewriteMap; use Magento\Framework\App\ObjectManager; -use Magento\UrlRewrite\Model\UrlRewritesSet; +use Magento\UrlRewrite\Model\UrlRewritesSetFactory; class CurrentUrlRewritesRegenerator { @@ -37,28 +37,30 @@ class CurrentUrlRewritesRegenerator private $urlRewriteMap; /** @var \Magento\UrlRewrite\Model\UrlRewritesSet */ - private $urlRewritesSet; + private $urlRewritesSetPlaceHolder; /** * @param \Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator $categoryUrlPathGenerator * @param \Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory $urlRewriteFactory * @param UrlFinderInterface $urlFinder * @param UrlRewriteMap|null $urlRewriteMap - * @param \Magento\UrlRewrite\Model\UrlRewritesSet|null $urlRewritesSet + * @param \Magento\UrlRewrite\Model\UrlRewritesSetFactory|null $urlRewritesSetFactory */ public function __construct( CategoryUrlPathGenerator $categoryUrlPathGenerator, UrlRewriteFactory $urlRewriteFactory, UrlFinderInterface $urlFinder, UrlRewriteMap $urlRewriteMap = null, - UrlRewritesSet $urlRewritesSet = null + UrlRewritesSetFactory $urlRewritesSetFactory = null ) { $this->categoryUrlPathGenerator = $categoryUrlPathGenerator; $this->urlRewriteFactory = $urlRewriteFactory; $this->urlRewritePlaceholder = $urlRewriteFactory->create(); $this->urlFinder = $urlFinder; $this->urlRewriteMap = $urlRewriteMap ?: ObjectManager::getInstance()->get(UrlRewriteMap::class); - $this->urlRewritesSet = $urlRewritesSet ?: ObjectManager::getInstance()->get(UrlRewritesSet::class); + $urlRewritesSetFactory = $urlRewritesSetFactory ?: ObjectManager::getInstance() + ->get(UrlRewritesSetFactory::class); + $this->urlRewritesSetPlaceHolder = $urlRewritesSetFactory->create(); } /** @@ -71,6 +73,7 @@ class CurrentUrlRewritesRegenerator */ public function generate($storeId, Category $category, $rootCategoryId = null) { + $urlRewritesSet = clone $this->urlRewritesSetPlaceHolder; $currentUrlRewrites = $this->urlRewriteMap->getByIdentifiers( $category->getEntityId(), $storeId, @@ -79,15 +82,15 @@ class CurrentUrlRewritesRegenerator ); foreach ($currentUrlRewrites as $rewrite) { - $this->urlRewritesSet->merge( + $urlRewritesSet->merge( $rewrite->getIsAutogenerated() ? $this->generateForAutogenerated($rewrite, $storeId, $category) : $this->generateForCustom($rewrite, $storeId, $category) ); } - $result = $this->urlRewritesSet->getData(); - $this->urlRewritesSet->resetData(); + $result = $urlRewritesSet->getData(); + $urlRewritesSet->resetData(); return $result; } @@ -109,7 +112,7 @@ class CurrentUrlRewritesRegenerator ->setTargetPath($targetPath) ->setRedirectType(OptionProvider::PERMANENT) ->setStoreId($storeId) - ->setIsAutogenerated(1); + ->setIsAutogenerated(0); return [$generatedUrl]; } } diff --git a/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGenerator.php index 8d8f4f2895c..fcf434fdb53 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGenerator.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGenerator.php @@ -12,8 +12,8 @@ use Magento\CatalogUrlRewrite\Model\Category\CurrentUrlRewritesRegenerator; use Magento\CatalogUrlRewrite\Service\V1\StoreViewService; use Magento\Store\Model\Store; use Magento\Catalog\Api\CategoryRepositoryInterface; -use Magento\UrlRewrite\Model\UrlRewritesSet; use Magento\Framework\App\ObjectManager; +use Magento\UrlRewrite\Model\UrlRewritesSetFactory; class CategoryUrlRewriteGenerator { @@ -33,7 +33,7 @@ class CategoryUrlRewriteGenerator protected $childrenUrlRewriteGenerator; /** @var \Magento\UrlRewrite\Model\UrlRewritesSet */ - private $urlRewritesSet; + private $urlRewritesSetPlaceHolder; /** * @var bool @@ -46,7 +46,7 @@ class CategoryUrlRewriteGenerator * @param \Magento\CatalogUrlRewrite\Model\Category\ChildrenUrlRewriteGenerator $childrenUrlRewriteGenerator * @param \Magento\CatalogUrlRewrite\Service\V1\StoreViewService $storeViewService * @param \Magento\Catalog\Api\CategoryRepositoryInterface $categoryRepository - * @param \Magento\UrlRewrite\Model\UrlRewritesSet|null $urlRewritesSet + * @param \Magento\UrlRewrite\Model\UrlRewritesSetFactory|null $urlRewritesSetFactory */ public function __construct( CanonicalUrlRewriteGenerator $canonicalUrlRewriteGenerator, @@ -54,14 +54,16 @@ class CategoryUrlRewriteGenerator ChildrenUrlRewriteGenerator $childrenUrlRewriteGenerator, StoreViewService $storeViewService, CategoryRepositoryInterface $categoryRepository, - UrlRewritesSet $urlRewritesSet = null + UrlRewritesSetFactory $urlRewritesSetFactory = null ) { $this->storeViewService = $storeViewService; $this->canonicalUrlRewriteGenerator = $canonicalUrlRewriteGenerator; $this->childrenUrlRewriteGenerator = $childrenUrlRewriteGenerator; $this->currentUrlRewritesRegenerator = $currentUrlRewritesRegenerator; $this->categoryRepository = $categoryRepository; - $this->urlRewritesSet = $urlRewritesSet ?: ObjectManager::getInstance()->get(UrlRewritesSet::class); + $urlRewritesSetFactory = $urlRewritesSetFactory ?: ObjectManager::getInstance() + ->get(UrlRewritesSetFactory::class); + $this->urlRewritesSetPlaceHolder = $urlRewritesSetFactory->create(); } /** @@ -94,17 +96,18 @@ class CategoryUrlRewriteGenerator */ protected function generateForGlobalScope(Category $category, $overrideStoreUrls, $rootCategoryId = null) { + $urlRewritesSet = clone $this->urlRewritesSetPlaceHolder; $categoryId = $category->getId(); foreach ($category->getStoreIds() as $storeId) { if (!$this->isGlobalScope($storeId) && $this->isOverrideUrlsForStore($storeId, $categoryId, $overrideStoreUrls) ) { $this->updateCategoryUrlForStore($category, $storeId); - $this->urlRewritesSet->merge($this->generateForSpecificStoreView($category, $storeId, $rootCategoryId)); + $urlRewritesSet->merge($this->generateForSpecificStoreView($category, $storeId, $rootCategoryId)); } } - $result = $this->urlRewritesSet->getData(); - $this->urlRewritesSet->resetData(); + $result = $urlRewritesSet->getData(); + $urlRewritesSet->resetData(); return $result; } @@ -162,17 +165,18 @@ class CategoryUrlRewriteGenerator */ protected function generateForSpecificStoreView(Category $category, $storeId, $rootCategoryId = null) { - $this->urlRewritesSet->merge( + $urlRewritesSet = clone $this->urlRewritesSetPlaceHolder; + $urlRewritesSet->merge( $this->canonicalUrlRewriteGenerator->generate($storeId, $category) ); - $this->urlRewritesSet->merge( + $urlRewritesSet->merge( $this->childrenUrlRewriteGenerator->generate($storeId, $category, $rootCategoryId) ); - $this->urlRewritesSet->merge( + $urlRewritesSet->merge( $this->currentUrlRewritesRegenerator->generate($storeId, $category, $rootCategoryId) ); - $result = $this->urlRewritesSet->getData(); - $this->urlRewritesSet->resetData(); + $result = $urlRewritesSet->getData(); + $urlRewritesSet->resetData(); return $result; } } diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Product/CurrentUrlRewritesRegenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/Product/CurrentUrlRewritesRegenerator.php index 94acb5b592b..1f85f5a3d27 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Product/CurrentUrlRewritesRegenerator.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Product/CurrentUrlRewritesRegenerator.php @@ -16,7 +16,7 @@ use Magento\CatalogUrlRewrite\Model\ProductUrlPathGenerator; use Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory; use Magento\CatalogUrlRewrite\Model\Map\UrlRewriteMap; use Magento\Framework\App\ObjectManager; -use Magento\UrlRewrite\Model\UrlRewritesSet; +use Magento\UrlRewrite\Model\UrlRewritesSetFactory; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) @@ -42,28 +42,30 @@ class CurrentUrlRewritesRegenerator private $urlRewriteMap; /** @var \Magento\UrlRewrite\Model\UrlRewritesSet */ - private $urlRewritesSet; + private $urlRewritesSetPlaceHolder; /** * @param UrlFinderInterface $urlFinder * @param ProductUrlPathGenerator $productUrlPathGenerator * @param UrlRewriteFactory $urlRewriteFactory * @param UrlRewriteMap|null $urlRewriteMap - * @param \Magento\UrlRewrite\Model\UrlRewritesSet|null $urlRewritesSet + * @param \Magento\UrlRewrite\Model\UrlRewritesSetFactory|null $urlRewritesSetFactory */ public function __construct( UrlFinderInterface $urlFinder, ProductUrlPathGenerator $productUrlPathGenerator, UrlRewriteFactory $urlRewriteFactory, UrlRewriteMap $urlRewriteMap = null, - UrlRewritesSet $urlRewritesSet = null + UrlRewritesSetFactory $urlRewritesSetFactory = null ) { $this->urlFinder = $urlFinder; $this->productUrlPathGenerator = $productUrlPathGenerator; $this->urlRewriteFactory = $urlRewriteFactory; $this->urlRewritePlaceholder = $urlRewriteFactory->create(); $this->urlRewriteMap = $urlRewriteMap ?: ObjectManager::getInstance()->get(UrlRewriteMap::class); - $this->urlRewritesSet = $urlRewritesSet ?: ObjectManager::getInstance()->get(UrlRewritesSet::class); + $urlRewritesSetFactory = $urlRewritesSetFactory ?: ObjectManager::getInstance() + ->get(UrlRewritesSetFactory::class); + $this->urlRewritesSetPlaceHolder = $urlRewritesSetFactory->create(); } /** @@ -77,6 +79,7 @@ class CurrentUrlRewritesRegenerator */ public function generate($storeId, Product $product, ObjectRegistry $productCategories, $rootCategoryId = null) { + $urlRewritesSet = clone $this->urlRewritesSetPlaceHolder; $currentUrlRewrites = $this->urlRewriteMap->getByIdentifiers( $product->getEntityId(), $storeId, @@ -89,15 +92,15 @@ class CurrentUrlRewritesRegenerator if ($category === false) { continue; } - $this->urlRewritesSet->merge( + $urlRewritesSet->merge( $currentUrlRewrite->getIsAutogenerated() ? $this->generateForAutogenerated($currentUrlRewrite, $storeId, $category, $product) : $this->generateForCustom($currentUrlRewrite, $storeId, $category, $product) ); } - $result = $this->urlRewritesSet->getData(); - $this->urlRewritesSet->resetData(); + $result = $urlRewritesSet->getData(); + $urlRewritesSet->resetData(); return $result; } @@ -121,7 +124,7 @@ class CurrentUrlRewritesRegenerator ->setRedirectType(OptionProvider::PERMANENT) ->setStoreId($storeId) ->setDescription($url->getDescription()) - ->setIsAutogenerated(1) + ->setIsAutogenerated(0) ->setMetadata($url->getMetadata()); return [$generatedUrl]; } diff --git a/app/code/Magento/CatalogUrlRewrite/Model/ProductScopeRewriteGenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/ProductScopeRewriteGenerator.php index 4ed01e4909c..cc64dc99962 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/ProductScopeRewriteGenerator.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/ProductScopeRewriteGenerator.php @@ -14,7 +14,7 @@ use Magento\CatalogUrlRewrite\Model\Product\AnchorUrlRewriteGenerator; use Magento\CatalogUrlRewrite\Service\V1\StoreViewService; use Magento\Store\Model\Store; use Magento\Store\Model\StoreManagerInterface; -use Magento\UrlRewrite\Model\UrlRewritesSet; +use Magento\UrlRewrite\Model\UrlRewritesSetFactory; use Magento\Framework\App\ObjectManager; /** @@ -59,7 +59,7 @@ class ProductScopeRewriteGenerator private $canonicalUrlRewriteGenerator; /** @var \Magento\UrlRewrite\Model\UrlRewritesSet */ - private $urlRewritesSet; + private $urlRewritesSetPlaceHolder; /** * @param StoreViewService $storeViewService @@ -69,7 +69,7 @@ class ProductScopeRewriteGenerator * @param CategoriesUrlRewriteGenerator $categoriesUrlRewriteGenerator * @param CurrentUrlRewritesRegenerator $currentUrlRewritesRegenerator * @param AnchorUrlRewriteGenerator $anchorUrlRewriteGenerator - * @param UrlRewritesSet|null $urlRewritesSet + * @param \Magento\UrlRewrite\Model\UrlRewritesSetFactory|null $urlRewritesSetFactory */ public function __construct( StoreViewService $storeViewService, @@ -79,7 +79,7 @@ class ProductScopeRewriteGenerator CategoriesUrlRewriteGenerator $categoriesUrlRewriteGenerator, CurrentUrlRewritesRegenerator $currentUrlRewritesRegenerator, AnchorUrlRewriteGenerator $anchorUrlRewriteGenerator, - UrlRewritesSet $urlRewritesSet = null + UrlRewritesSetFactory $urlRewritesSetFactory = null ) { $this->storeViewService = $storeViewService; $this->storeManager = $storeManager; @@ -88,7 +88,9 @@ class ProductScopeRewriteGenerator $this->categoriesUrlRewriteGenerator = $categoriesUrlRewriteGenerator; $this->currentUrlRewritesRegenerator = $currentUrlRewritesRegenerator; $this->anchorUrlRewriteGenerator = $anchorUrlRewriteGenerator; - $this->urlRewritesSet = $urlRewritesSet ?: ObjectManager::getInstance()->get(UrlRewritesSet::class); + $urlRewritesSetFactory = $urlRewritesSetFactory ?: ObjectManager::getInstance() + ->get(UrlRewritesSetFactory::class); + $this->urlRewritesSetPlaceHolder = $urlRewritesSetFactory->create(); } /** @@ -113,6 +115,7 @@ class ProductScopeRewriteGenerator public function generateForGlobalScope($productCategories, Product $product, $rootCategoryId = null) { $productId = $product->getEntityId(); + $urlRewritesSet = clone $this->urlRewritesSetPlaceHolder; foreach ($product->getStoreIds() as $id) { if (!$this->isGlobalScope($id) && @@ -121,14 +124,14 @@ class ProductScopeRewriteGenerator $productId, Product::ENTITY )) { - $this->urlRewritesSet->merge( + $urlRewritesSet->merge( $this->generateForSpecificStoreView($id, $productCategories, $product, $rootCategoryId) ); } } - $result = $this->urlRewritesSet->getData(); - $this->urlRewritesSet->resetData(); + $result = $urlRewritesSet->getData(); + $urlRewritesSet->resetData(); return $result; } @@ -143,6 +146,7 @@ class ProductScopeRewriteGenerator */ public function generateForSpecificStoreView($storeId, $productCategories, Product $product, $rootCategoryId = null) { + $urlRewritesSet = clone $this->urlRewritesSetPlaceHolder; $categories = []; foreach ($productCategories as $category) { if ($this->isCategoryProperForGenerating($category, $storeId)) { @@ -151,13 +155,13 @@ class ProductScopeRewriteGenerator } $productCategories = $this->objectRegistryFactory->create(['entities' => $categories]); - $this->urlRewritesSet->merge( + $urlRewritesSet->merge( $this->canonicalUrlRewriteGenerator->generate($storeId, $product) ); - $this->urlRewritesSet->merge( + $urlRewritesSet->merge( $this->categoriesUrlRewriteGenerator->generate($storeId, $product, $productCategories) ); - $this->urlRewritesSet->merge( + $urlRewritesSet->merge( $this->currentUrlRewritesRegenerator->generate( $storeId, $product, @@ -165,12 +169,12 @@ class ProductScopeRewriteGenerator $rootCategoryId ) ); - $this->urlRewritesSet->merge( + $urlRewritesSet->merge( $this->anchorUrlRewriteGenerator->generate($storeId, $product, $productCategories) ); - $result = $this->urlRewritesSet->getData(); - $this->urlRewritesSet->resetData(); + $result = $urlRewritesSet->getData(); + $urlRewritesSet->resetData(); return $result; } diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/AfterImportDataObserver.php b/app/code/Magento/CatalogUrlRewrite/Observer/AfterImportDataObserver.php index 065293a7041..2d15d4f6273 100644 --- a/app/code/Magento/CatalogUrlRewrite/Observer/AfterImportDataObserver.php +++ b/app/code/Magento/CatalogUrlRewrite/Observer/AfterImportDataObserver.php @@ -21,7 +21,7 @@ use Magento\UrlRewrite\Model\UrlFinderInterface; use Magento\Framework\Event\ObserverInterface; use Magento\Catalog\Model\Product\Visibility; use Magento\Framework\App\ObjectManager; -use Magento\UrlRewrite\Model\UrlRewritesSet; +use Magento\UrlRewrite\Model\UrlRewritesSetFactory; /** * Class AfterImportDataObserver @@ -100,7 +100,7 @@ class AfterImportDataObserver implements ObserverInterface ]; /** @var \Magento\UrlRewrite\Model\UrlRewritesSet */ - private $urlRewritesSet; + private $urlRewritesSetPlaceHolder; /** * @param \Magento\Catalog\Model\ProductFactory $catalogProductFactory @@ -111,7 +111,7 @@ class AfterImportDataObserver implements ObserverInterface * @param UrlPersistInterface $urlPersist * @param UrlRewriteFactory $urlRewriteFactory * @param UrlFinderInterface $urlFinder - * @param \Magento\UrlRewrite\Model\UrlRewritesSet|null $urlRewritesSet + * @param \Magento\UrlRewrite\Model\UrlRewritesSetFactory|null $urlRewritesSetFactory * @throws \InvalidArgumentException * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ @@ -124,7 +124,7 @@ class AfterImportDataObserver implements ObserverInterface UrlPersistInterface $urlPersist, UrlRewriteFactory $urlRewriteFactory, UrlFinderInterface $urlFinder, - UrlRewritesSet $urlRewritesSet = null + UrlRewritesSetFactory $urlRewritesSetFactory = null ) { $this->urlPersist = $urlPersist; $this->catalogProductFactory = $catalogProductFactory; @@ -134,7 +134,9 @@ class AfterImportDataObserver implements ObserverInterface $this->storeManager = $storeManager; $this->urlRewriteFactory = $urlRewriteFactory; $this->urlFinder = $urlFinder; - $this->urlRewritesSet = $urlRewritesSet ?: ObjectManager::getInstance()->get(UrlRewritesSet::class); + $urlRewritesSetFactory = $urlRewritesSetFactory ?: ObjectManager::getInstance() + ->get(UrlRewritesSetFactory::class); + $this->urlRewritesSetPlaceHolder = $urlRewritesSetFactory->create(); } /** @@ -267,16 +269,17 @@ class AfterImportDataObserver implements ObserverInterface */ protected function generateUrls() { - $this->urlRewritesSet->merge($this->canonicalUrlRewriteGenerate()); - $this->urlRewritesSet->merge($this->categoriesUrlRewriteGenerate()); - $this->urlRewritesSet->merge($this->currentUrlRewritesRegenerate()); + $urlRewritesSet = clone $this->urlRewritesSetPlaceHolder; + $urlRewritesSet->merge($this->canonicalUrlRewriteGenerate()); + $urlRewritesSet->merge($this->categoriesUrlRewriteGenerate()); + $urlRewritesSet->merge($this->currentUrlRewritesRegenerate()); $this->productCategories = null; unset($this->products); $this->products = []; - $result = $this->urlRewritesSet->getData(); - $this->urlRewritesSet->resetData(); + $result = $urlRewritesSet->getData(); + $urlRewritesSet->resetData(); return $result; } diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php b/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php index 92ceff1c434..4c52725e5e9 100644 --- a/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php +++ b/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php @@ -13,7 +13,7 @@ use Magento\Framework\App\ObjectManager; use Magento\Framework\Event\Observer as EventObserver; use Magento\UrlRewrite\Model\UrlPersistInterface; use Magento\UrlRewrite\Service\V1\Data\UrlRewrite; -use Magento\UrlRewrite\Model\UrlRewritesSet; +use Magento\UrlRewrite\Model\UrlRewritesSetFactory; class UrlRewriteHandler { @@ -41,7 +41,7 @@ class UrlRewriteHandler private $categoryBasedProductRewriteGenerator; /** @var \Magento\UrlRewrite\Model\UrlRewritesSet */ - private $urlRewritesSet; + private $urlRewritesSetPlaceHolder; /** * @param \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider $childrenCategoriesProvider @@ -49,7 +49,7 @@ class UrlRewriteHandler * @param ProductUrlRewriteGenerator $productUrlRewriteGenerator * @param UrlPersistInterface $urlPersist * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory - * @param \Magento\UrlRewrite\Model\UrlRewritesSet|null $urlRewritesSet + * @param \Magento\UrlRewrite\Model\UrlRewritesSetFactory|null $urlRewritesSetFactory */ public function __construct( \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider $childrenCategoriesProvider, @@ -57,14 +57,16 @@ class UrlRewriteHandler ProductUrlRewriteGenerator $productUrlRewriteGenerator, UrlPersistInterface $urlPersist, \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory, - UrlRewritesSet $urlRewritesSet = null + UrlRewritesSetFactory $urlRewritesSetFactory = null ) { $this->childrenCategoriesProvider = $childrenCategoriesProvider; $this->categoryUrlRewriteGenerator = $categoryUrlRewriteGenerator; $this->productUrlRewriteGenerator = $productUrlRewriteGenerator; $this->urlPersist = $urlPersist; $this->productCollectionFactory = $productCollectionFactory; - $this->urlRewritesSet = $urlRewritesSet ?: ObjectManager::getInstance()->get(UrlRewritesSet::class); + $urlRewritesSetFactory = $urlRewritesSetFactory ?: ObjectManager::getInstance() + ->get(UrlRewritesSetFactory::class); + $this->urlRewritesSetPlaceHolder = $urlRewritesSetFactory->create(); } /** @@ -75,6 +77,7 @@ class UrlRewriteHandler */ public function generateProductUrlRewrites(Category $category) { + $urlRewritesSet = clone $this->urlRewritesSetPlaceHolder; $this->isSkippedProduct = []; $saveRewriteHistory = $category->getData('save_rewrites_history'); $storeId = $category->getStoreId(); @@ -90,12 +93,12 @@ class UrlRewriteHandler foreach ($collection as $product) { $product->setStoreId($storeId); $product->setData('save_rewrites_history', $saveRewriteHistory); - $this->urlRewritesSet->merge( + $urlRewritesSet->merge( $this->productUrlRewriteGenerator->generate($product, $category->getEntityId()) ); } } else { - $this->urlRewritesSet->merge( + $urlRewritesSet->merge( $this->getCategoryProductsUrlRewrites( $category, $storeId, @@ -105,7 +108,7 @@ class UrlRewriteHandler ); } foreach ($this->childrenCategoriesProvider->getChildren($category, true) as $childCategory) { - $this->urlRewritesSet->merge( + $urlRewritesSet->merge( $this->getCategoryProductsUrlRewrites( $childCategory, $storeId, @@ -115,8 +118,8 @@ class UrlRewriteHandler ); } - $result = $this->urlRewritesSet->getData(); - $this->urlRewritesSet->resetData(); + $result = $urlRewritesSet->getData(); + $urlRewritesSet->resetData(); return $result; } @@ -133,6 +136,7 @@ class UrlRewriteHandler $saveRewriteHistory, $rootCategoryId = null ) { + $urlRewritesSet = clone $this->urlRewritesSetPlaceHolder; /** @var \Magento\Catalog\Model\ResourceModel\Product\Collection $productCollection */ $productCollection = $category->getProductCollection() ->addAttributeToSelect('name') @@ -146,13 +150,13 @@ class UrlRewriteHandler $this->isSkippedProduct[] = $product->getId(); $product->setStoreId($storeId); $product->setData('save_rewrites_history', $saveRewriteHistory); - $this->urlRewritesSet->merge( + $urlRewritesSet->merge( $this->getCategoryBasedProductRewriteGenerator()->generate($product, $category, $rootCategoryId) ); } - $result = $this->urlRewritesSet->getData(); - $this->urlRewritesSet->resetData(); + $result = $urlRewritesSet->getData(); + $urlRewritesSet->resetData(); return $result; } diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/ChildrenUrlRewriteGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/ChildrenUrlRewriteGeneratorTest.php index 03812de828d..bb50afca698 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/ChildrenUrlRewriteGeneratorTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/ChildrenUrlRewriteGeneratorTest.php @@ -40,14 +40,22 @@ class ChildrenUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase $this->categoryUrlRewriteGenerator = $this->getMockBuilder( \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator::class )->disableOriginalConstructor()->getMock(); + $urlRewritesSetFactory = $this->getMock( + \Magento\UrlRewrite\Model\UrlRewritesSetFactory::class, + ['create'], + [], + '', + false + ); $this->urlRewritesSet = new \Magento\UrlRewrite\Model\UrlRewritesSet; + $urlRewritesSetFactory->expects($this->once())->method('create')->willReturn($this->urlRewritesSet); $this->childrenUrlRewriteGenerator = (new ObjectManager($this))->getObject( \Magento\CatalogUrlRewrite\Model\Category\ChildrenUrlRewriteGenerator::class, [ 'childrenCategoriesProvider' => $this->childrenCategoriesProvider, 'categoryUrlRewriteGeneratorFactory' => $this->categoryUrlRewriteGeneratorFactory, - 'urlRewritesSet' => $this->urlRewritesSet + 'urlRewritesSetFactory' => $urlRewritesSetFactory ] ); } diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/CurrentUrlRewritesRegeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/CurrentUrlRewritesRegeneratorTest.php index ad16a988528..cae82e325cc 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/CurrentUrlRewritesRegeneratorTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/CurrentUrlRewritesRegeneratorTest.php @@ -50,14 +50,22 @@ class CurrentUrlRewritesRegeneratorTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor()->getMock(); $this->urlRewriteFactory->expects($this->once())->method('create') ->willReturn($this->urlRewrite); - + $urlRewritesSetFactory = $this->getMock( + \Magento\UrlRewrite\Model\UrlRewritesSetFactory::class, + ['create'], + [], + '', + false + ); $this->urlRewritesSet = new \Magento\UrlRewrite\Model\UrlRewritesSet; - $this->currentUrlRewritesRegenerator = (new ObjectManager($this))->getObject( + $urlRewritesSetFactory->expects($this->once())->method('create')->willReturn($this->urlRewritesSet); + + $this->currentUrlRewritesRegenerator = (new ObjectManager($this))->getObject( \Magento\CatalogUrlRewrite\Model\Category\CurrentUrlRewritesRegenerator::class, [ 'categoryUrlPathGenerator' => $this->categoryUrlPathGenerator, 'urlRewriteFactory' => $this->urlRewriteFactory, - 'urlRewritesSet' => $this->urlRewritesSet, + 'urlRewritesSetFactory' => $urlRewritesSetFactory, 'urlRewriteMap' => $this->urlRewriteMap ] ); @@ -128,7 +136,7 @@ class CurrentUrlRewritesRegeneratorTest extends \PHPUnit_Framework_TestCase $this->categoryUrlPathGenerator->expects($this->once())->method('getUrlPathWithSuffix') ->will($this->returnValue($targetPath)); - $this->prepareUrlRewriteMock($storeId, $categoryId, $requestPath, $targetPath, OptionProvider::PERMANENT, 1); + $this->prepareUrlRewriteMock($storeId, $categoryId, $requestPath, $targetPath, OptionProvider::PERMANENT, 0); $this->assertEquals( ['autogenerated.html_2' => $this->urlRewrite], diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php index e6c035334c8..9edbf862ebe 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php @@ -55,7 +55,15 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor()->getMock(); $this->category = $this->getMock(\Magento\Catalog\Model\Category::class, [], [], '', false); $this->categoryRepository = $this->getMock(\Magento\Catalog\Api\CategoryRepositoryInterface::class); + $urlRewritesSetFactory = $this->getMock( + \Magento\UrlRewrite\Model\UrlRewritesSetFactory::class, + ['create'], + [], + '', + false + ); $this->urlRewritesSet = new \Magento\UrlRewrite\Model\UrlRewritesSet; + $urlRewritesSetFactory->expects($this->once())->method('create')->willReturn($this->urlRewritesSet); $this->categoryUrlRewriteGenerator = (new ObjectManager($this))->getObject( \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator::class, @@ -65,7 +73,7 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase 'currentUrlRewritesRegenerator' => $this->currentUrlRewritesRegenerator, 'storeViewService' => $this->storeViewService, 'categoryRepository' => $this->categoryRepository, - 'urlRewritesSet' => $this->urlRewritesSet + 'urlRewritesSetFactory' => $urlRewritesSetFactory ] ); } diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Product/CurrentUrlRewritesRegeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Product/CurrentUrlRewritesRegeneratorTest.php index c8137f94408..f093145cea5 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Product/CurrentUrlRewritesRegeneratorTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Product/CurrentUrlRewritesRegeneratorTest.php @@ -62,13 +62,21 @@ class CurrentUrlRewritesRegeneratorTest extends \PHPUnit_Framework_TestCase $this->productUrlPathGenerator = $this->getMockBuilder( \Magento\CatalogUrlRewrite\Model\ProductUrlPathGenerator::class )->disableOriginalConstructor()->getMock(); + $urlRewritesSetFactory = $this->getMock( + \Magento\UrlRewrite\Model\UrlRewritesSetFactory::class, + ['create'], + [], + '', + false + ); $this->urlRewritesSet = new \Magento\UrlRewrite\Model\UrlRewritesSet; + $urlRewritesSetFactory->expects($this->once())->method('create')->willReturn($this->urlRewritesSet); $this->currentUrlRewritesRegenerator = (new ObjectManager($this))->getObject( \Magento\CatalogUrlRewrite\Model\Product\CurrentUrlRewritesRegenerator::class, [ 'productUrlPathGenerator' => $this->productUrlPathGenerator, 'urlRewriteFactory' => $this->urlRewriteFactory, - 'urlRewritesSet' => $this->urlRewritesSet, + 'urlRewritesSetFactory' => $urlRewritesSetFactory, 'urlRewriteMap' => $this->urlRewriteMap ] ); @@ -134,7 +142,7 @@ class CurrentUrlRewritesRegeneratorTest extends \PHPUnit_Framework_TestCase $productId, $requestPath, $targetPath, - $autoGenerated, + 0, OptionProvider::PERMANENT, [], $description @@ -177,7 +185,7 @@ class CurrentUrlRewritesRegeneratorTest extends \PHPUnit_Framework_TestCase $productId, $requestPath, $targetPath, - $autoGenerated, + 0, OptionProvider::PERMANENT, $metadata, $description diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php index a7f2642fd97..f3be4ee454a 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php @@ -64,7 +64,15 @@ class ProductScopeRewriteGeneratorTest extends \PHPUnit_Framework_TestCase $this->storeViewService = $this->getMockBuilder(\Magento\CatalogUrlRewrite\Service\V1\StoreViewService::class) ->disableOriginalConstructor()->getMock(); $this->storeManager = $this->getMock(StoreManagerInterface::class); + $urlRewritesSetFactory = $this->getMock( + \Magento\UrlRewrite\Model\UrlRewritesSetFactory::class, + ['create'], + [], + '', + false + ); $this->urlRewritesSet = new \Magento\UrlRewrite\Model\UrlRewritesSet; + $urlRewritesSetFactory->expects($this->once())->method('create')->willReturn($this->urlRewritesSet); $this->productScopeGenerator = (new ObjectManager($this))->getObject( \Magento\CatalogUrlRewrite\Model\ProductScopeRewriteGenerator::class, @@ -76,7 +84,7 @@ class ProductScopeRewriteGeneratorTest extends \PHPUnit_Framework_TestCase 'objectRegistryFactory' => $this->objectRegistryFactory, 'storeViewService' => $this->storeViewService, 'storeManager' => $this->storeManager, - 'urlRewritesSet' => $this->urlRewritesSet + 'urlRewritesSetFactory' => $urlRewritesSetFactory ] ); } diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/AfterImportDataObserverTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/AfterImportDataObserverTest.php index 271e4bf3d4f..f9cc23bceb8 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/AfterImportDataObserverTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/AfterImportDataObserverTest.php @@ -276,7 +276,15 @@ class AfterImportDataObserverTest extends \PHPUnit_Framework_TestCase ->expects($this->any()) ->method('getCategoryProcessor') ->willReturn($categoryProcessor); + $urlRewritesSetFactory = $this->getMock( + \Magento\UrlRewrite\Model\UrlRewritesSetFactory::class, + ['create'], + [], + '', + false + ); $this->urlRewritesSet = new \Magento\UrlRewrite\Model\UrlRewritesSet; + $urlRewritesSetFactory->expects($this->once())->method('create')->willReturn($this->urlRewritesSet); $this->objectManager = new ObjectManager($this); $this->import = $this->objectManager->getObject( @@ -290,7 +298,7 @@ class AfterImportDataObserverTest extends \PHPUnit_Framework_TestCase 'urlPersist' => $this->urlPersist, 'urlRewriteFactory' => $this->urlRewriteFactory, 'urlFinder' => $this->urlFinder, - 'urlRewritesSet' => $this->urlRewritesSet + 'urlRewritesSetFactory' => $urlRewritesSetFactory ] ); } diff --git a/app/code/Magento/UrlRewrite/etc/di.xml b/app/code/Magento/UrlRewrite/etc/di.xml index 8e426647f90..b7485a7ef21 100644 --- a/app/code/Magento/UrlRewrite/etc/di.xml +++ b/app/code/Magento/UrlRewrite/etc/di.xml @@ -9,5 +9,4 @@ <preference for="Magento\UrlRewrite\Model\StorageInterface" type="Magento\UrlRewrite\Model\Storage\DbStorage"/> <preference for="Magento\UrlRewrite\Model\UrlFinderInterface" type="Magento\UrlRewrite\Model\Storage\DbStorage"/> <preference for="Magento\UrlRewrite\Model\UrlPersistInterface" type="Magento\UrlRewrite\Model\Storage\DbStorage"/> - <type name="Magento\UrlRewrite\Model\ArrayMerger" shared="false" /> </config> diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php index 5d3ec055385..93fe95f83cb 100644 --- a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php +++ b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php @@ -76,12 +76,12 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase ['new-url.html', 'catalog/category/view/id/3', 1, 0], ['new-url/category-1-1.html', 'catalog/category/view/id/4', 1, 0], ['new-url/category-1-1/category-1-1-1.html', 'catalog/category/view/id/5', 1, 0], - ['category-1.html', 'new-url.html', 1, OptionProvider::PERMANENT], - ['category-1/category-1-1.html', 'new-url/category-1-1.html', 1, OptionProvider::PERMANENT], + ['category-1.html', 'new-url.html', 0, OptionProvider::PERMANENT], + ['category-1/category-1-1.html', 'new-url/category-1-1.html', 0, OptionProvider::PERMANENT], [ 'category-1/category-1-1/category-1-1-1.html', 'new-url/category-1-1/category-1-1-1.html', - 1, + 0, OptionProvider::PERMANENT ], ]; -- GitLab