3
3
* Copyright © Magento, Inc. All rights reserved.
4
4
* See COPYING.txt for license details.
5
5
*/
6
+
6
7
namespace Magento \UrlRewrite \Model \Storage ;
7
8
8
9
use Magento \Framework \Api \DataObjectHelper ;
9
10
use Magento \Framework \App \ResourceConnection ;
11
+ use Magento \Framework \DB \Select ;
10
12
use Magento \UrlRewrite \Model \OptionProvider ;
11
13
use Magento \UrlRewrite \Service \V1 \Data \UrlRewrite ;
12
14
use Magento \UrlRewrite \Service \V1 \Data \UrlRewriteFactory ;
13
15
use Psr \Log \LoggerInterface ;
14
- use Magento \UrlRewrite \Service \V1 \Data \UrlRewrite as UrlRewriteData ;
16
+ use Magento \Framework \App \ObjectManager ;
17
+ use Magento \Framework \DB \Adapter \AdapterInterface ;
15
18
19
+ /**
20
+ * Url rewrites DB storage.
21
+ *
22
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
23
+ */
16
24
class DbStorage extends AbstractStorage
17
25
{
18
26
/**
@@ -26,7 +34,7 @@ class DbStorage extends AbstractStorage
26
34
const ERROR_CODE_DUPLICATE_ENTRY = 1062 ;
27
35
28
36
/**
29
- * @var \Magento\Framework\DB\Adapter\ AdapterInterface
37
+ * @var AdapterInterface
30
38
*/
31
39
protected $ connection ;
32
40
@@ -36,15 +44,15 @@ class DbStorage extends AbstractStorage
36
44
protected $ resource ;
37
45
38
46
/**
39
- * @var \Psr\Log\ LoggerInterface
47
+ * @var LoggerInterface
40
48
*/
41
49
private $ logger ;
42
50
43
51
/**
44
- * @param \Magento\UrlRewrite\Service\V1\Data\ UrlRewriteFactory $urlRewriteFactory
52
+ * @param UrlRewriteFactory $urlRewriteFactory
45
53
* @param DataObjectHelper $dataObjectHelper
46
- * @param \Magento\Framework\App\ ResourceConnection $resource
47
- * @param \Psr\Log\ LoggerInterface|null $logger
54
+ * @param ResourceConnection $resource
55
+ * @param LoggerInterface|null $logger
48
56
*/
49
57
public function __construct (
50
58
UrlRewriteFactory $ urlRewriteFactory ,
@@ -54,8 +62,8 @@ public function __construct(
54
62
) {
55
63
$ this ->connection = $ resource ->getConnection ();
56
64
$ this ->resource = $ resource ;
57
- $ this ->logger = $ logger ?: \ Magento \ Framework \ App \ ObjectManager::getInstance ()
58
- ->get (\ Psr \ Log \ LoggerInterface::class);
65
+ $ this ->logger = $ logger ?: ObjectManager::getInstance ()
66
+ ->get (LoggerInterface::class);
59
67
60
68
parent ::__construct ($ urlRewriteFactory , $ dataObjectHelper );
61
69
}
@@ -64,7 +72,7 @@ public function __construct(
64
72
* Prepare select statement for specific filter
65
73
*
66
74
* @param array $data
67
- * @return \Magento\Framework\DB\ Select
75
+ * @return Select
68
76
*/
69
77
protected function prepareSelect (array $ data )
70
78
{
@@ -74,6 +82,7 @@ protected function prepareSelect(array $data)
74
82
foreach ($ data as $ column => $ value ) {
75
83
$ select ->where ($ this ->connection ->quoteIdentifier ($ column ) . ' IN (?) ' , $ value );
76
84
}
85
+
77
86
return $ select ;
78
87
}
79
88
@@ -141,17 +150,61 @@ protected function doFindOneByData(array $data)
141
150
}
142
151
143
152
/**
144
- * {@inheritdoc}
153
+ * Delete old URLs from DB.
154
+ *
155
+ * @param UrlRewrite[] $urls
156
+ * @return void
145
157
*/
146
- protected function doReplace (array $ urls )
158
+ private function deleteOldUrls (array $ urls ): void
147
159
{
148
- foreach ($ this ->createFilterDataBasedOnUrls ($ urls ) as $ type => $ urlData ) {
149
- $ urlData [UrlRewrite::ENTITY_TYPE ] = $ type ;
150
- // prevent query locking in a case when nothing to delete
151
- if ($ this ->connection ->fetchRow ($ this ->prepareSelect ($ urlData ))) {
152
- $ this ->deleteByData ($ urlData );
153
- }
160
+ $ oldUrlsSelect = $ this ->connection ->select ();
161
+ $ oldUrlsSelect ->from (
162
+ $ this ->resource ->getTableName (self ::TABLE_NAME )
163
+ );
164
+ /** @var UrlRewrite $url */
165
+ foreach ($ urls as $ url ) {
166
+ $ oldUrlsSelect ->orWhere (
167
+ $ this ->connection ->quoteIdentifier (
168
+ UrlRewrite::ENTITY_TYPE
169
+ ) . ' = ? ' ,
170
+ $ url ->getEntityType ()
171
+ );
172
+ $ oldUrlsSelect ->where (
173
+ $ this ->connection ->quoteIdentifier (
174
+ UrlRewrite::ENTITY_ID
175
+ ) . ' = ? ' ,
176
+ $ url ->getEntityId ()
177
+ );
178
+ $ oldUrlsSelect ->where (
179
+ $ this ->connection ->quoteIdentifier (
180
+ UrlRewrite::STORE_ID
181
+ ) . ' = ? ' ,
182
+ $ url ->getStoreId ()
183
+ );
154
184
}
185
+
186
+ // prevent query locking in a case when nothing to delete
187
+ $ checkOldUrlsSelect = clone $ oldUrlsSelect ;
188
+ $ checkOldUrlsSelect ->reset (Select::COLUMNS );
189
+ $ checkOldUrlsSelect ->columns ('count(*) ' );
190
+ $ hasOldUrls = (bool )$ this ->connection ->fetchOne ($ checkOldUrlsSelect );
191
+
192
+ if ($ hasOldUrls ) {
193
+ $ this ->connection ->query (
194
+ $ oldUrlsSelect ->deleteFromSelect (
195
+ $ this ->resource ->getTableName (self ::TABLE_NAME )
196
+ )
197
+ );
198
+ }
199
+ }
200
+
201
+ /**
202
+ * @inheritDoc
203
+ */
204
+ protected function doReplace (array $ urls )
205
+ {
206
+ $ this ->deleteOldUrls ($ urls );
207
+
155
208
$ data = [];
156
209
foreach ($ urls as $ url ) {
157
210
$ data [] = $ url ->toArray ();
@@ -164,12 +217,12 @@ protected function doReplace(array $urls)
164
217
foreach ($ urls as $ url ) {
165
218
$ urlFound = $ this ->doFindOneByData (
166
219
[
167
- UrlRewriteData ::REQUEST_PATH => $ url ->getRequestPath (),
168
- UrlRewriteData ::STORE_ID => $ url ->getStoreId ()
220
+ UrlRewrite ::REQUEST_PATH => $ url ->getRequestPath (),
221
+ UrlRewrite ::STORE_ID => $ url ->getStoreId (),
169
222
]
170
223
);
171
- if (isset ($ urlFound [UrlRewriteData ::URL_REWRITE_ID ])) {
172
- $ urlConflicted [$ urlFound [UrlRewriteData ::URL_REWRITE_ID ]] = $ url ->toArray ();
224
+ if (isset ($ urlFound [UrlRewrite ::URL_REWRITE_ID ])) {
225
+ $ urlConflicted [$ urlFound [UrlRewrite ::URL_REWRITE_ID ]] = $ url ->toArray ();
173
226
}
174
227
}
175
228
if ($ urlConflicted ) {
@@ -217,6 +270,7 @@ protected function insertMultiple($data)
217
270
*
218
271
* @param UrlRewrite[] $urls
219
272
* @return array
273
+ * @deprecated Not used anymore.
220
274
*/
221
275
protected function createFilterDataBasedOnUrls ($ urls )
222
276
{
@@ -230,6 +284,7 @@ protected function createFilterDataBasedOnUrls($urls)
230
284
}
231
285
}
232
286
}
287
+
233
288
return $ data ;
234
289
}
235
290
0 commit comments