Skip to content

Commit 1856c28

Browse files
author
Joan He
authored
Merge pull request #737 from magento-fearless-kiwis/MAGETWO-58924-just-UrlRewriteMap-develop-final
MAGETWO-58924 - Url rewrite map table lock
2 parents 18a58db + e0bb933 commit 1856c28

File tree

47 files changed

+3284
-454
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+3284
-454
lines changed

app/code/Magento/CatalogUrlRewrite/Model/Category/ChildrenUrlRewriteGenerator.php

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
use Magento\Catalog\Model\Category;
99
use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGeneratorFactory;
10+
use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator;
11+
use Magento\UrlRewrite\Model\MergeDataProviderFactory;
12+
use Magento\Framework\App\ObjectManager;
1013

1114
class ChildrenUrlRewriteGenerator
1215
{
@@ -16,36 +19,48 @@ class ChildrenUrlRewriteGenerator
1619
/** @var \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGeneratorFactory */
1720
protected $categoryUrlRewriteGeneratorFactory;
1821

22+
/** @var \Magento\UrlRewrite\Model\MergeDataProvider */
23+
private $mergeDataProviderPrototype;
24+
1925
/**
2026
* @param \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider $childrenCategoriesProvider
2127
* @param \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGeneratorFactory $categoryUrlRewriteGeneratorFactory
28+
* @param \Magento\UrlRewrite\Model\MergeDataProviderFactory|null $mergeDataProviderFactory
2229
*/
2330
public function __construct(
2431
ChildrenCategoriesProvider $childrenCategoriesProvider,
25-
CategoryUrlRewriteGeneratorFactory $categoryUrlRewriteGeneratorFactory
32+
CategoryUrlRewriteGeneratorFactory $categoryUrlRewriteGeneratorFactory,
33+
MergeDataProviderFactory $mergeDataProviderFactory = null
2634
) {
2735
$this->childrenCategoriesProvider = $childrenCategoriesProvider;
2836
$this->categoryUrlRewriteGeneratorFactory = $categoryUrlRewriteGeneratorFactory;
37+
if (!isset($mergeDataProviderFactory)) {
38+
$mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class);
39+
}
40+
$this->mergeDataProviderPrototype = $mergeDataProviderFactory->create();
2941
}
3042

3143
/**
3244
* Generate list of children urls
3345
*
3446
* @param int $storeId
3547
* @param \Magento\Catalog\Model\Category $category
48+
* @param int|null $rootCategoryId
3649
* @return \Magento\UrlRewrite\Service\V1\Data\UrlRewrite[]
3750
*/
38-
public function generate($storeId, Category $category)
51+
public function generate($storeId, Category $category, $rootCategoryId = null)
3952
{
40-
$urls = [];
41-
foreach ($this->childrenCategoriesProvider->getChildren($category) as $childCategory) {
53+
$mergeDataProvider = clone $this->mergeDataProviderPrototype;
54+
foreach ($this->childrenCategoriesProvider->getChildren($category, true) as $childCategory) {
4255
$childCategory->setStoreId($storeId);
4356
$childCategory->setData('save_rewrites_history', $category->getData('save_rewrites_history'));
44-
$urls = array_merge(
45-
$urls,
46-
$this->categoryUrlRewriteGeneratorFactory->create()->generate($childCategory)
57+
/** @var CategoryUrlRewriteGenerator $categoryUrlRewriteGenerator */
58+
$categoryUrlRewriteGenerator = $this->categoryUrlRewriteGeneratorFactory->create();
59+
$mergeDataProvider->merge(
60+
$categoryUrlRewriteGenerator->generate($childCategory, false, $rootCategoryId)
4761
);
4862
}
49-
return $urls;
63+
64+
return $mergeDataProvider->getData();
5065
}
5166
}

app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php

Lines changed: 69 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,8 @@
55
*/
66
namespace Magento\CatalogUrlRewrite\Model\Category;
77

8-
use Magento\Catalog\Model\Category;
9-
use Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator;
108
use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator;
119
use Magento\UrlRewrite\Model\OptionProvider;
12-
use Magento\UrlRewrite\Model\UrlFinderInterface;
13-
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
14-
use Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory;
1510

1611
class CurrentUrlRewritesRegenerator
1712
{
@@ -21,104 +16,133 @@ class CurrentUrlRewritesRegenerator
2116
/** @var \Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory */
2217
protected $urlRewriteFactory;
2318

24-
/** @var UrlFinderInterface */
25-
protected $urlFinder;
19+
/** @var \Magento\UrlRewrite\Service\V1\Data\UrlRewrite */
20+
private $urlRewritePrototype;
2621

27-
/** @var \Magento\Catalog\Model\Category */
22+
/**
23+
* @var \Magento\Catalog\Model\Category
24+
* @deprecated
25+
*/
2826
protected $category;
2927

28+
/**
29+
* @var \Magento\UrlRewrite\Model\UrlFinderInterface
30+
* @deprecated
31+
*/
32+
protected $urlFinder;
33+
34+
/** @var \Magento\CatalogUrlRewrite\Model\Map\UrlRewriteFinder */
35+
private $urlRewriteFinder;
36+
37+
/** @var \Magento\UrlRewrite\Model\MergeDataProvider */
38+
private $mergeDataProviderPrototype;
39+
3040
/**
3141
* @param \Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator $categoryUrlPathGenerator
3242
* @param \Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory $urlRewriteFactory
33-
* @param UrlFinderInterface $urlFinder
43+
* @param \Magento\UrlRewrite\Model\UrlFinderInterface $urlFinder
44+
* @param \Magento\CatalogUrlRewrite\Model\Map\UrlRewriteFinder|null $urlRewriteFinder
45+
* @param \Magento\UrlRewrite\Model\MergeDataProviderFactory|null $mergeDataProviderFactory
3446
*/
3547
public function __construct(
36-
CategoryUrlPathGenerator $categoryUrlPathGenerator,
37-
UrlRewriteFactory $urlRewriteFactory,
38-
UrlFinderInterface $urlFinder
48+
\Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator $categoryUrlPathGenerator,
49+
\Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory $urlRewriteFactory,
50+
\Magento\UrlRewrite\Model\UrlFinderInterface $urlFinder,
51+
\Magento\CatalogUrlRewrite\Model\Map\UrlRewriteFinder $urlRewriteFinder = null,
52+
\Magento\UrlRewrite\Model\MergeDataProviderFactory $mergeDataProviderFactory = null
3953
) {
4054
$this->categoryUrlPathGenerator = $categoryUrlPathGenerator;
4155
$this->urlRewriteFactory = $urlRewriteFactory;
56+
$this->urlRewritePrototype = $urlRewriteFactory->create();
4257
$this->urlFinder = $urlFinder;
58+
$this->urlRewriteFinder = $urlRewriteFinder ?: \Magento\Framework\App\ObjectManager::getInstance()
59+
->get(\Magento\CatalogUrlRewrite\Model\Map\UrlRewriteFinder::class);
60+
if (!isset($mergeDataProviderFactory)) {
61+
$mergeDataProviderFactory = \Magento\Framework\App\ObjectManager::getInstance()->get(
62+
\Magento\UrlRewrite\Model\MergeDataProviderFactory::class
63+
);
64+
}
65+
$this->mergeDataProviderPrototype = $mergeDataProviderFactory->create();
4366
}
4467

4568
/**
4669
* Generate list based on current url rewrites
4770
*
4871
* @param int $storeId
4972
* @param \Magento\Catalog\Model\Category $category
73+
* @param int|null $rootCategoryId
5074
* @return \Magento\UrlRewrite\Service\V1\Data\UrlRewrite[]
5175
*/
52-
public function generate($storeId, Category $category)
76+
public function generate($storeId, \Magento\Catalog\Model\Category $category, $rootCategoryId = null)
5377
{
54-
$this->category = $category;
55-
56-
$currentUrlRewrites = $this->urlFinder->findAllByData(
57-
[
58-
UrlRewrite::STORE_ID => $storeId,
59-
UrlRewrite::ENTITY_ID => $category->getId(),
60-
UrlRewrite::ENTITY_TYPE => CategoryUrlRewriteGenerator::ENTITY_TYPE,
61-
]
78+
$mergeDataProvider = clone $this->mergeDataProviderPrototype;
79+
$currentUrlRewrites = $this->urlRewriteFinder->findAllByData(
80+
$category->getEntityId(),
81+
$storeId,
82+
CategoryUrlRewriteGenerator::ENTITY_TYPE,
83+
$rootCategoryId
6284
);
6385

64-
$urlRewrites = [];
6586
foreach ($currentUrlRewrites as $rewrite) {
66-
if ($rewrite->getIsAutogenerated()) {
67-
$urlRewrites = array_merge($urlRewrites, $this->generateForAutogenerated($rewrite, $storeId));
68-
} else {
69-
$urlRewrites = array_merge($urlRewrites, $this->generateForCustom($rewrite, $storeId));
70-
}
87+
$mergeDataProvider->merge(
88+
$rewrite->getIsAutogenerated()
89+
? $this->generateForAutogenerated($rewrite, $storeId, $category)
90+
: $this->generateForCustom($rewrite, $storeId, $category)
91+
);
7192
}
72-
return $urlRewrites;
93+
94+
return $mergeDataProvider->getData();
7395
}
7496

7597
/**
7698
* @param \Magento\UrlRewrite\Service\V1\Data\UrlRewrite $url
7799
* @param int $storeId
78-
* @return array
100+
* @param \Magento\Catalog\Model\Category|null $category
101+
* @return \Magento\UrlRewrite\Service\V1\Data\UrlRewrite[]
79102
*/
80-
protected function generateForAutogenerated($url, $storeId)
103+
protected function generateForAutogenerated($url, $storeId, \Magento\Catalog\Model\Category $category = null)
81104
{
82-
$urls = [];
83-
if ($this->category->getData('save_rewrites_history')) {
84-
$targetPath = $this->categoryUrlPathGenerator->getUrlPathWithSuffix($this->category, $storeId);
105+
if ($category->getData('save_rewrites_history')) {
106+
$targetPath = $this->categoryUrlPathGenerator->getUrlPathWithSuffix($category, $storeId);
85107
if ($url->getRequestPath() !== $targetPath) {
86-
$urls[$url->getRequestPath() . '_' . $storeId] = $this->urlRewriteFactory->create()
87-
->setEntityType(CategoryUrlRewriteGenerator::ENTITY_TYPE)
88-
->setEntityId($this->category->getId())
108+
$generatedUrl = clone $this->urlRewritePrototype;
109+
$generatedUrl->setEntityType(CategoryUrlRewriteGenerator::ENTITY_TYPE)
110+
->setEntityId($category->getEntityId())
89111
->setRequestPath($url->getRequestPath())
90112
->setTargetPath($targetPath)
91113
->setRedirectType(OptionProvider::PERMANENT)
92114
->setStoreId($storeId)
93115
->setIsAutogenerated(0);
116+
return [$generatedUrl];
94117
}
95118
}
96-
return $urls;
119+
return [];
97120
}
98121

99122
/**
100123
* @param \Magento\UrlRewrite\Service\V1\Data\UrlRewrite $url
101124
* @param int $storeId
102-
* @return array
125+
* @param \Magento\Catalog\Model\Category|null $category
126+
* @return \Magento\UrlRewrite\Service\V1\Data\UrlRewrite[]
103127
*/
104-
protected function generateForCustom($url, $storeId)
128+
protected function generateForCustom($url, $storeId, \Magento\Catalog\Model\Category $category = null)
105129
{
106-
$urls = [];
107130
$targetPath = !$url->getRedirectType()
108131
? $url->getTargetPath()
109-
: $this->categoryUrlPathGenerator->getUrlPathWithSuffix($this->category, $storeId);
132+
: $this->categoryUrlPathGenerator->getUrlPathWithSuffix($category, $storeId);
110133
if ($url->getRequestPath() !== $targetPath) {
111-
$urls[$url->getRequestPath() . '_' . $storeId] = $this->urlRewriteFactory->create()
112-
->setEntityType(CategoryUrlRewriteGenerator::ENTITY_TYPE)
113-
->setEntityId($this->category->getId())
134+
$generatedUrl = clone $this->urlRewritePrototype;
135+
$generatedUrl->setEntityType(CategoryUrlRewriteGenerator::ENTITY_TYPE)
136+
->setEntityId($category->getEntityId())
114137
->setRequestPath($url->getRequestPath())
115138
->setTargetPath($targetPath)
116139
->setRedirectType($url->getRedirectType())
117140
->setStoreId($storeId)
118141
->setDescription($url->getDescription())
119142
->setIsAutogenerated(0)
120143
->setMetadata($url->getMetadata());
144+
return [$generatedUrl];
121145
}
122-
return $urls;
146+
return [];
123147
}
124148
}

app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Storage.php

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,30 @@
55
*/
66
namespace Magento\CatalogUrlRewrite\Model\Category\Plugin;
77

8-
use Magento\CatalogUrlRewrite\Model\Category\ProductFactory;
98
use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
109
use Magento\UrlRewrite\Model\StorageInterface;
1110
use Magento\UrlRewrite\Model\UrlFinderInterface;
1211
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
12+
use Magento\CatalogUrlRewrite\Model\ResourceModel\Category\Product;
1313

1414
class Storage
1515
{
1616
/** @var UrlFinderInterface */
17-
protected $urlFinder;
17+
private $urlFinder;
1818

19-
/** @var ProductFactory */
20-
protected $productFactory;
19+
/** @var Product */
20+
private $productResource;
2121

2222
/**
2323
* @param UrlFinderInterface $urlFinder
24-
* @param ProductFactory $productFactory
24+
* @param Product $productResource
2525
*/
2626
public function __construct(
2727
UrlFinderInterface $urlFinder,
28-
ProductFactory $productFactory
28+
Product $productResource
2929
) {
3030
$this->urlFinder = $urlFinder;
31-
$this->productFactory = $productFactory;
31+
$this->productResource = $productResource;
3232
}
3333

3434
/**
@@ -50,7 +50,7 @@ public function afterReplace(StorageInterface $object, $result, array $urls)
5050
];
5151
}
5252
if ($toSave) {
53-
$this->productFactory->create()->getResource()->saveMultiple($toSave);
53+
$this->productResource->saveMultiple($toSave);
5454
}
5555
}
5656

@@ -62,14 +62,7 @@ public function afterReplace(StorageInterface $object, $result, array $urls)
6262
*/
6363
public function beforeDeleteByData(StorageInterface $object, array $data)
6464
{
65-
$toRemove = [];
66-
$records = $this->urlFinder->findAllByData($data);
67-
foreach ($records as $record) {
68-
$toRemove[] = $record->getUrlRewriteId();
69-
}
70-
if ($toRemove) {
71-
$this->productFactory->create()->getResource()->removeMultiple($toRemove);
72-
}
65+
$this->productResource->removeMultipleByProductCategory($data);
7366
}
7467

7568
/**

app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Store/Group.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class Group
3535
/** @var ProductUrlRewriteGenerator */
3636
protected $productUrlRewriteGenerator;
3737

38-
/** @var StoreManagerInterface */
38+
/** @var StoreManagerInterface */
3939
protected $storeManager;
4040

4141
/**

app/code/Magento/CatalogUrlRewrite/Model/CategoryBasedProductRewriteGenerator.php

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

88
use Magento\Catalog\Model\Category;
99
use Magento\Catalog\Model\Product;
10-
use Magento\CatalogUrlRewrite\Model\Product\CanonicalUrlRewriteGenerator;
11-
use Magento\CatalogUrlRewrite\Model\Product\CategoriesUrlRewriteGenerator;
12-
use Magento\CatalogUrlRewrite\Model\Product\CurrentUrlRewritesRegenerator;
13-
use Magento\CatalogUrlRewrite\Model\Product\AnchorUrlRewriteGenerator;
14-
use Magento\CatalogUrlRewrite\Service\V1\StoreViewService;
1510
use Magento\Store\Model\Store;
1611
use Magento\Catalog\Model\Product\Visibility;
1712

@@ -28,7 +23,7 @@ class CategoryBasedProductRewriteGenerator
2823
private $productScopeRewriteGenerator;
2924

3025
/**
31-
* @param ProductScopeRewriteGenerator $productUrlRewriteGenerator
26+
* @param ProductScopeRewriteGenerator $productScopeRewriteGenerator
3227
*/
3328
public function __construct(
3429
ProductScopeRewriteGenerator $productScopeRewriteGenerator
@@ -41,9 +36,10 @@ public function __construct(
4136
*
4237
* @param \Magento\Catalog\Model\Product $product
4338
* @param \Magento\Catalog\Model\Category $category
39+
* @param int|null $rootCategoryId
4440
* @return \Magento\UrlRewrite\Service\V1\Data\UrlRewrite[]
4541
*/
46-
public function generate(Product $product, Category $category)
42+
public function generate(Product $product, Category $category, $rootCategoryId = null)
4743
{
4844
if ($product->getVisibility() == Visibility::VISIBILITY_NOT_VISIBLE) {
4945
return [];
@@ -52,10 +48,14 @@ public function generate(Product $product, Category $category)
5248
$storeId = $product->getStoreId();
5349

5450
$urls = $this->productScopeRewriteGenerator->isGlobalScope($storeId)
55-
? $this->productScopeRewriteGenerator->generateForGlobalScope([$category], $product)
56-
: $this->productScopeRewriteGenerator->generateForSpecificStoreView($storeId, [$category], $product);
51+
? $this->productScopeRewriteGenerator->generateForGlobalScope([$category], $product, $rootCategoryId)
52+
: $this->productScopeRewriteGenerator->generateForSpecificStoreView(
53+
$storeId,
54+
[$category],
55+
$product,
56+
$rootCategoryId
57+
);
5758

58-
$this->product = null;
5959
return $urls;
6060
}
6161
}

0 commit comments

Comments
 (0)