diff options
author | Jeremy Benoist <jeremy.benoist@gmail.com> | 2016-09-25 11:26:15 +0200 |
---|---|---|
committer | Jeremy Benoist <jeremy.benoist@gmail.com> | 2016-09-25 12:03:49 +0200 |
commit | 401135852c6b25c8d5ab97beaefb02d1bd023ec9 (patch) | |
tree | 5922f4bd40af0ceb61db2c55755bc006f18410fb /src | |
parent | faa86e06ba3032fdb98f3c0f79c72e8581d3c96f (diff) | |
download | wallabag-401135852c6b25c8d5ab97beaefb02d1bd023ec9.tar.gz wallabag-401135852c6b25c8d5ab97beaefb02d1bd023ec9.tar.zst wallabag-401135852c6b25c8d5ab97beaefb02d1bd023ec9.zip |
Use scheduled entity insertions to avoid tag duplicate
Using `getScheduledEntityInsertions()` we can retrieve not yet flushed but already persisted entities and then avoid tags duplication on import.
Diffstat (limited to 'src')
-rw-r--r-- | src/Wallabag/CoreBundle/Helper/ContentProxy.php | 25 | ||||
-rw-r--r-- | src/Wallabag/ImportBundle/Import/PocketImport.php | 3 | ||||
-rw-r--r-- | src/Wallabag/ImportBundle/Import/WallabagImport.php | 3 |
3 files changed, 24 insertions, 7 deletions
diff --git a/src/Wallabag/CoreBundle/Helper/ContentProxy.php b/src/Wallabag/CoreBundle/Helper/ContentProxy.php index 5dd684f2..a65a21e8 100644 --- a/src/Wallabag/CoreBundle/Helper/ContentProxy.php +++ b/src/Wallabag/CoreBundle/Helper/ContentProxy.php | |||
@@ -96,13 +96,24 @@ class ContentProxy | |||
96 | * | 96 | * |
97 | * @param Entry $entry | 97 | * @param Entry $entry |
98 | * @param array|string $tags An array of tag or a string coma separated of tag | 98 | * @param array|string $tags An array of tag or a string coma separated of tag |
99 | * @param array $entitiesReady Entities from the EntityManager which are persisted but not yet flushed | ||
100 | * It is mostly to fix duplicate tag on import | ||
101 | * @see http://stackoverflow.com/a/7879164/569101 | ||
99 | */ | 102 | */ |
100 | public function assignTagsToEntry(Entry $entry, $tags) | 103 | public function assignTagsToEntry(Entry $entry, $tags, array $entitiesReady = []) |
101 | { | 104 | { |
102 | if (!is_array($tags)) { | 105 | if (!is_array($tags)) { |
103 | $tags = explode(',', $tags); | 106 | $tags = explode(',', $tags); |
104 | } | 107 | } |
105 | 108 | ||
109 | // keeps only Tag entity from the "not yet flushed entities" | ||
110 | $tagsNotYetFlushed = []; | ||
111 | foreach ($entitiesReady as $entity) { | ||
112 | if ($entity instanceof Tag) { | ||
113 | $tagsNotYetFlushed[$entity->getLabel()] = $entity; | ||
114 | } | ||
115 | } | ||
116 | |||
106 | foreach ($tags as $label) { | 117 | foreach ($tags as $label) { |
107 | $label = trim($label); | 118 | $label = trim($label); |
108 | 119 | ||
@@ -111,11 +122,15 @@ class ContentProxy | |||
111 | continue; | 122 | continue; |
112 | } | 123 | } |
113 | 124 | ||
114 | $tagEntity = $this->tagRepository->findOneByLabel($label); | 125 | if (isset($tagsNotYetFlushed[$label])) { |
126 | $tagEntity = $tagsNotYetFlushed[$label]; | ||
127 | } else { | ||
128 | $tagEntity = $this->tagRepository->findOneByLabel($label); | ||
115 | 129 | ||
116 | if (is_null($tagEntity)) { | 130 | if (is_null($tagEntity)) { |
117 | $tagEntity = new Tag(); | 131 | $tagEntity = new Tag(); |
118 | $tagEntity->setLabel($label); | 132 | $tagEntity->setLabel($label); |
133 | } | ||
119 | } | 134 | } |
120 | 135 | ||
121 | // only add the tag on the entry if the relation doesn't exist | 136 | // only add the tag on the entry if the relation doesn't exist |
diff --git a/src/Wallabag/ImportBundle/Import/PocketImport.php b/src/Wallabag/ImportBundle/Import/PocketImport.php index e00eb44b..327e2500 100644 --- a/src/Wallabag/ImportBundle/Import/PocketImport.php +++ b/src/Wallabag/ImportBundle/Import/PocketImport.php | |||
@@ -227,7 +227,8 @@ class PocketImport extends AbstractImport | |||
227 | if (isset($importedEntry['tags']) && !empty($importedEntry['tags'])) { | 227 | if (isset($importedEntry['tags']) && !empty($importedEntry['tags'])) { |
228 | $this->contentProxy->assignTagsToEntry( | 228 | $this->contentProxy->assignTagsToEntry( |
229 | $entry, | 229 | $entry, |
230 | array_keys($importedEntry['tags']) | 230 | array_keys($importedEntry['tags']), |
231 | $this->em->getUnitOfWork()->getScheduledEntityInsertions() | ||
231 | ); | 232 | ); |
232 | } | 233 | } |
233 | 234 | ||
diff --git a/src/Wallabag/ImportBundle/Import/WallabagImport.php b/src/Wallabag/ImportBundle/Import/WallabagImport.php index 043bb0a2..3754e4a9 100644 --- a/src/Wallabag/ImportBundle/Import/WallabagImport.php +++ b/src/Wallabag/ImportBundle/Import/WallabagImport.php | |||
@@ -111,7 +111,8 @@ abstract class WallabagImport extends AbstractImport | |||
111 | if (array_key_exists('tags', $data)) { | 111 | if (array_key_exists('tags', $data)) { |
112 | $this->contentProxy->assignTagsToEntry( | 112 | $this->contentProxy->assignTagsToEntry( |
113 | $entry, | 113 | $entry, |
114 | $data['tags'] | 114 | $data['tags'], |
115 | $this->em->getUnitOfWork()->getScheduledEntityInsertions() | ||
115 | ); | 116 | ); |
116 | } | 117 | } |
117 | 118 | ||