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.
This commit is contained in:
Jeremy Benoist 2016-09-25 11:26:15 +02:00
parent faa86e06ba
commit 401135852c
No known key found for this signature in database
GPG key ID: BCA73962457ACC3C
7 changed files with 89 additions and 7 deletions

View file

@ -96,13 +96,24 @@ class ContentProxy
*
* @param Entry $entry
* @param array|string $tags An array of tag or a string coma separated of tag
* @param array $entitiesReady Entities from the EntityManager which are persisted but not yet flushed
* It is mostly to fix duplicate tag on import
* @see http://stackoverflow.com/a/7879164/569101
*/
public function assignTagsToEntry(Entry $entry, $tags)
public function assignTagsToEntry(Entry $entry, $tags, array $entitiesReady = [])
{
if (!is_array($tags)) {
$tags = explode(',', $tags);
}
// keeps only Tag entity from the "not yet flushed entities"
$tagsNotYetFlushed = [];
foreach ($entitiesReady as $entity) {
if ($entity instanceof Tag) {
$tagsNotYetFlushed[$entity->getLabel()] = $entity;
}
}
foreach ($tags as $label) {
$label = trim($label);
@ -111,11 +122,15 @@ class ContentProxy
continue;
}
$tagEntity = $this->tagRepository->findOneByLabel($label);
if (isset($tagsNotYetFlushed[$label])) {
$tagEntity = $tagsNotYetFlushed[$label];
} else {
$tagEntity = $this->tagRepository->findOneByLabel($label);
if (is_null($tagEntity)) {
$tagEntity = new Tag();
$tagEntity->setLabel($label);
if (is_null($tagEntity)) {
$tagEntity = new Tag();
$tagEntity->setLabel($label);
}
}
// only add the tag on the entry if the relation doesn't exist

View file

@ -227,7 +227,8 @@ class PocketImport extends AbstractImport
if (isset($importedEntry['tags']) && !empty($importedEntry['tags'])) {
$this->contentProxy->assignTagsToEntry(
$entry,
array_keys($importedEntry['tags'])
array_keys($importedEntry['tags']),
$this->em->getUnitOfWork()->getScheduledEntityInsertions()
);
}

View file

@ -111,7 +111,8 @@ abstract class WallabagImport extends AbstractImport
if (array_key_exists('tags', $data)) {
$this->contentProxy->assignTagsToEntry(
$entry,
$data['tags']
$data['tags'],
$this->em->getUnitOfWork()->getScheduledEntityInsertions()
);
}

View file

@ -296,6 +296,29 @@ class ContentProxyTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('tag2', $entry->getTags()[1]->getLabel());
}
public function testAssignTagsNotFlushed()
{
$graby = $this->getMockBuilder('Graby\Graby')
->disableOriginalConstructor()
->getMock();
$tagRepo = $this->getTagRepositoryMock();
$tagRepo->expects($this->never())
->method('__call');
$proxy = new ContentProxy($graby, $this->getTaggerMock(), $tagRepo, $this->getLogger());
$tagEntity = new Tag();
$tagEntity->setLabel('tag1');
$entry = new Entry(new User());
$proxy->assignTagsToEntry($entry, 'tag1', [$tagEntity]);
$this->assertCount(1, $entry->getTags());
$this->assertEquals('tag1', $entry->getTags()[0]->getLabel());
}
private function getTaggerMock()
{
return $this->getMockBuilder('Wallabag\CoreBundle\Helper\RuleBasedTagger')

View file

@ -41,6 +41,20 @@ class PocketImportTest extends \PHPUnit_Framework_TestCase
->disableOriginalConstructor()
->getMock();
$this->uow = $this->getMockBuilder('Doctrine\ORM\UnitOfWork')
->disableOriginalConstructor()
->getMock();
$this->em
->expects($this->any())
->method('getUnitOfWork')
->willReturn($this->uow);
$this->uow
->expects($this->any())
->method('getScheduledEntityInsertions')
->willReturn([]);
$pocket = new PocketImport(
$this->em,
$this->contentProxy

View file

@ -26,6 +26,20 @@ class WallabagV1ImportTest extends \PHPUnit_Framework_TestCase
->disableOriginalConstructor()
->getMock();
$this->uow = $this->getMockBuilder('Doctrine\ORM\UnitOfWork')
->disableOriginalConstructor()
->getMock();
$this->em
->expects($this->any())
->method('getUnitOfWork')
->willReturn($this->uow);
$this->uow
->expects($this->any())
->method('getScheduledEntityInsertions')
->willReturn([]);
$this->contentProxy = $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy')
->disableOriginalConstructor()
->getMock();

View file

@ -26,6 +26,20 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
->disableOriginalConstructor()
->getMock();
$this->uow = $this->getMockBuilder('Doctrine\ORM\UnitOfWork')
->disableOriginalConstructor()
->getMock();
$this->em
->expects($this->any())
->method('getUnitOfWork')
->willReturn($this->uow);
$this->uow
->expects($this->any())
->method('getScheduledEntityInsertions')
->willReturn([]);
$this->contentProxy = $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy')
->disableOriginalConstructor()
->getMock();