]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Multiple tag search was broken from API
authorJeremy Benoist <jeremy.benoist@gmail.com>
Thu, 3 Aug 2017 10:46:20 +0000 (12:46 +0200)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Wed, 6 Sep 2017 20:49:15 +0000 (22:49 +0200)
First, the setParameter() were done on the same parameter which in fact
just duplicated the condition in the SQL query (like `where t.label =
'test' and t.label = 'test'`.

Changed the parameter doesn't help because the query was then wrong.

Changing the way to match associated tags for an entry and it worked.

src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTagData.php
src/Wallabag/CoreBundle/Repository/EntryRepository.php
tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php
tests/Wallabag/CoreBundle/Controller/ExportControllerTest.php
tests/Wallabag/CoreBundle/Controller/RssControllerTest.php

index 6de561e0d5843908e414fe44473380f172a008ff..0ecfd18b55ddab8c00f1616586f78a9f576af5c3 100644 (file)
@@ -19,7 +19,7 @@ class LoadTagData extends AbstractFixture implements OrderedFixtureInterface
 
         $manager->persist($tag1);
 
-        $this->addReference('foo-tag', $tag1);
+        $this->addReference('foo-bar-tag', $tag1);
 
         $tag2 = new Tag();
         $tag2->setLabel('bar');
@@ -35,6 +35,13 @@ class LoadTagData extends AbstractFixture implements OrderedFixtureInterface
 
         $this->addReference('baz-tag', $tag3);
 
+        $tag4 = new Tag();
+        $tag4->setLabel('foo');
+
+        $manager->persist($tag4);
+
+        $this->addReference('foo-tag', $tag4);
+
         $manager->flush();
     }
 
index ecc159fc0463b8585c75d90e1a8ba53d76e99d80..44f95dcba2ebd96ee6fe168c11d0d5c9660efe94 100644 (file)
@@ -133,7 +133,7 @@ class EntryRepository extends EntityRepository
     {
         $qb = $this->createQueryBuilder('e')
             ->leftJoin('e.tags', 't')
-            ->where('e.user =:userId')->setParameter('userId', $userId);
+            ->where('e.user = :userId')->setParameter('userId', $userId);
 
         if (null !== $isArchived) {
             $qb->andWhere('e.isArchived = :isArchived')->setParameter('isArchived', (bool) $isArchived);
@@ -152,8 +152,23 @@ class EntryRepository extends EntityRepository
         }
 
         if ('' !== $tags) {
-            foreach (explode(',', $tags) as $tag) {
-                $qb->andWhere('t.label = :label')->setParameter('label', $tag);
+            foreach (explode(',', $tags) as $i => $tag) {
+                $entryAlias = 'e' . $i;
+                $tagAlias = 't' . $i;
+
+                // Complexe queries to ensure multiple tags is 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.user', 'u')
             ->addSelect('t', 'u')
-            ->where('e.user=:userId')->setParameter('userId', $userId)
+            ->where('e.user = :userId')->setParameter('userId', $userId)
         ;
 
         return $qb->getQuery()->getResult();
@@ -323,7 +338,27 @@ class EntryRepository extends EntityRepository
     {
         $qb = $this->createQueryBuilder('e')
             ->select('count(e)')
-            ->where('e.user=:userId')->setParameter('userId', $userId)
+            ->where('e.user = :userId')->setParameter('userId', $userId)
+        ;
+
+        return (int) $qb->getQuery()->getSingleScalarResult();
+    }
+
+    /**
+     * Count all entries for a tag and a user.
+     *
+     * @param int $userId
+     * @param int $tagId
+     *
+     * @return int
+     */
+    public function countAllEntriesByUserIdAndTagId($userId, $tagId)
+    {
+        $qb = $this->createQueryBuilder('e')
+            ->select('count(e.id)')
+            ->leftJoin('e.tags', 't')
+            ->where('e.user = :userId')->setParameter('userId', $userId)
+            ->andWhere('t.id = :tagId')->setParameter('tagId', $tagId)
         ;
 
         return (int) $qb->getQuery()->getSingleScalarResult();
index f4c8a6304f7477b1907932384793472cb652cc14..fcec3f3b2fba1ad15f11c55ba3d8d318fbc833c5 100644 (file)
@@ -292,6 +292,9 @@ class EntryRestControllerTest extends WallabagApiTestCase
         $this->assertSame(1, $content['page']);
         $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('self', $content['_links']);
         $this->assertArrayHasKey('first', $content['_links']);
index 3e216381eb797903c2b7b38dfcafe33327201d66..02ad26aede970cc57e98058072be15ac6396ccd6 100644 (file)
@@ -239,7 +239,7 @@ class ExportControllerTest extends WallabagCoreTestCase
         $this->assertSame($contentInDB->getLanguage(), $content[0]['language']);
         $this->assertSame($contentInDB->getReadingtime(), $content[0]['reading_time']);
         $this->assertSame($contentInDB->getDomainname(), $content[0]['domain_name']);
-        $this->assertSame(['foo bar', 'baz'], $content[0]['tags']);
+        $this->assertSame(['baz', 'foo'], $content[0]['tags']);
     }
 
     public function testXmlExport()
index 6167fe2dbf82d2a880f0f34ca5f397b181297351..c6ca49374cd002086226fa66714102b7992d462e 100644 (file)
@@ -184,13 +184,13 @@ class RssControllerTest extends WallabagCoreTestCase
         $em->flush();
 
         $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->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());
     }
 }