mirror of
https://github.com/wallabag/wallabag.git
synced 2024-11-27 11:31:05 +00:00
Merge pull request #3309 from wallabag/fix-multiple-tag-search
Multiple tag search, which was broken from API
This commit is contained in:
commit
f6d042f56d
5 changed files with 36 additions and 10 deletions
|
@ -19,7 +19,7 @@ class LoadTagData extends AbstractFixture implements OrderedFixtureInterface
|
||||||
|
|
||||||
$manager->persist($tag1);
|
$manager->persist($tag1);
|
||||||
|
|
||||||
$this->addReference('foo-tag', $tag1);
|
$this->addReference('foo-bar-tag', $tag1);
|
||||||
|
|
||||||
$tag2 = new Tag();
|
$tag2 = new Tag();
|
||||||
$tag2->setLabel('bar');
|
$tag2->setLabel('bar');
|
||||||
|
@ -35,6 +35,13 @@ class LoadTagData extends AbstractFixture implements OrderedFixtureInterface
|
||||||
|
|
||||||
$this->addReference('baz-tag', $tag3);
|
$this->addReference('baz-tag', $tag3);
|
||||||
|
|
||||||
|
$tag4 = new Tag();
|
||||||
|
$tag4->setLabel('foo');
|
||||||
|
|
||||||
|
$manager->persist($tag4);
|
||||||
|
|
||||||
|
$this->addReference('foo-tag', $tag4);
|
||||||
|
|
||||||
$manager->flush();
|
$manager->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -133,7 +133,7 @@ class EntryRepository extends EntityRepository
|
||||||
{
|
{
|
||||||
$qb = $this->createQueryBuilder('e')
|
$qb = $this->createQueryBuilder('e')
|
||||||
->leftJoin('e.tags', 't')
|
->leftJoin('e.tags', 't')
|
||||||
->where('e.user =:userId')->setParameter('userId', $userId);
|
->where('e.user = :userId')->setParameter('userId', $userId);
|
||||||
|
|
||||||
if (null !== $isArchived) {
|
if (null !== $isArchived) {
|
||||||
$qb->andWhere('e.isArchived = :isArchived')->setParameter('isArchived', (bool) $isArchived);
|
$qb->andWhere('e.isArchived = :isArchived')->setParameter('isArchived', (bool) $isArchived);
|
||||||
|
@ -152,8 +152,23 @@ class EntryRepository extends EntityRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('' !== $tags) {
|
if ('' !== $tags) {
|
||||||
foreach (explode(',', $tags) as $tag) {
|
foreach (explode(',', $tags) as $i => $tag) {
|
||||||
$qb->andWhere('t.label = :label')->setParameter('label', $tag);
|
$entryAlias = 'e' . $i;
|
||||||
|
$tagAlias = 't' . $i;
|
||||||
|
|
||||||
|
// Complexe queries to ensure multiple tags are associated to an entry
|
||||||
|
// https://stackoverflow.com/a/6638146/569101
|
||||||
|
$qb->andWhere($qb->expr()->in(
|
||||||
|
'e.id',
|
||||||
|
$this->createQueryBuilder($entryAlias)
|
||||||
|
->select($entryAlias . '.id')
|
||||||
|
->leftJoin($entryAlias . '.tags', $tagAlias)
|
||||||
|
->where($tagAlias . '.label = :label' . $i)
|
||||||
|
->getDQL()
|
||||||
|
));
|
||||||
|
|
||||||
|
// bound parameter to the main query builder
|
||||||
|
$qb->setParameter('label' . $i, $tag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,7 +196,7 @@ class EntryRepository extends EntityRepository
|
||||||
->innerJoin('e.tags', 't')
|
->innerJoin('e.tags', 't')
|
||||||
->innerJoin('e.user', 'u')
|
->innerJoin('e.user', 'u')
|
||||||
->addSelect('t', 'u')
|
->addSelect('t', 'u')
|
||||||
->where('e.user=:userId')->setParameter('userId', $userId)
|
->where('e.user = :userId')->setParameter('userId', $userId)
|
||||||
;
|
;
|
||||||
|
|
||||||
return $qb->getQuery()->getResult();
|
return $qb->getQuery()->getResult();
|
||||||
|
@ -323,7 +338,7 @@ class EntryRepository extends EntityRepository
|
||||||
{
|
{
|
||||||
$qb = $this->createQueryBuilder('e')
|
$qb = $this->createQueryBuilder('e')
|
||||||
->select('count(e)')
|
->select('count(e)')
|
||||||
->where('e.user=:userId')->setParameter('userId', $userId)
|
->where('e.user = :userId')->setParameter('userId', $userId)
|
||||||
;
|
;
|
||||||
|
|
||||||
return (int) $qb->getQuery()->getSingleScalarResult();
|
return (int) $qb->getQuery()->getSingleScalarResult();
|
||||||
|
|
|
@ -292,6 +292,9 @@ class EntryRestControllerTest extends WallabagApiTestCase
|
||||||
$this->assertSame(1, $content['page']);
|
$this->assertSame(1, $content['page']);
|
||||||
$this->assertGreaterThanOrEqual(1, $content['pages']);
|
$this->assertGreaterThanOrEqual(1, $content['pages']);
|
||||||
|
|
||||||
|
$this->assertContains('foo', array_column($content['_embedded']['items'][0]['tags'], 'label'), 'Entries tags should have "foo" tag');
|
||||||
|
$this->assertContains('bar', array_column($content['_embedded']['items'][0]['tags'], 'label'), 'Entries tags should have "bar" tag');
|
||||||
|
|
||||||
$this->assertArrayHasKey('_links', $content);
|
$this->assertArrayHasKey('_links', $content);
|
||||||
$this->assertArrayHasKey('self', $content['_links']);
|
$this->assertArrayHasKey('self', $content['_links']);
|
||||||
$this->assertArrayHasKey('first', $content['_links']);
|
$this->assertArrayHasKey('first', $content['_links']);
|
||||||
|
|
|
@ -239,7 +239,8 @@ class ExportControllerTest extends WallabagCoreTestCase
|
||||||
$this->assertSame($contentInDB->getLanguage(), $content[0]['language']);
|
$this->assertSame($contentInDB->getLanguage(), $content[0]['language']);
|
||||||
$this->assertSame($contentInDB->getReadingtime(), $content[0]['reading_time']);
|
$this->assertSame($contentInDB->getReadingtime(), $content[0]['reading_time']);
|
||||||
$this->assertSame($contentInDB->getDomainname(), $content[0]['domain_name']);
|
$this->assertSame($contentInDB->getDomainname(), $content[0]['domain_name']);
|
||||||
$this->assertSame(['foo bar', 'baz'], $content[0]['tags']);
|
$this->assertContains('baz', $content[0]['tags']);
|
||||||
|
$this->assertContains('foo', $content[0]['tags']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testXmlExport()
|
public function testXmlExport()
|
||||||
|
|
|
@ -184,13 +184,13 @@ class RssControllerTest extends WallabagCoreTestCase
|
||||||
$em->flush();
|
$em->flush();
|
||||||
|
|
||||||
$client = $this->getClient();
|
$client = $this->getClient();
|
||||||
$client->request('GET', '/admin/SUPERTOKEN/tags/foo-bar.xml');
|
$client->request('GET', '/admin/SUPERTOKEN/tags/foo.xml');
|
||||||
|
|
||||||
$this->assertSame(200, $client->getResponse()->getStatusCode());
|
$this->assertSame(200, $client->getResponse()->getStatusCode());
|
||||||
|
|
||||||
$this->validateDom($client->getResponse()->getContent(), 'tag (foo bar)', 'tags/foo-bar');
|
$this->validateDom($client->getResponse()->getContent(), 'tag (foo)', 'tags/foo');
|
||||||
|
|
||||||
$client->request('GET', '/admin/SUPERTOKEN/tags/foo-bar.xml?page=3000');
|
$client->request('GET', '/admin/SUPERTOKEN/tags/foo.xml?page=3000');
|
||||||
$this->assertSame(302, $client->getResponse()->getStatusCode());
|
$this->assertSame(302, $client->getResponse()->getStatusCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue