X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2FWallabag%2FCoreBundle%2FRepository%2FEntryRepository.php;h=879e66719a60ef39d561d5f65424c8d2a7da96a6;hb=9a57653aec85b0f5220436d5cb76545e66c24a11;hp=a26de0a83a5d7e8ea3282d55f4cb999242f4e025;hpb=09ef25c3c3882db94b3941f3ba33ebc78b5dbe4d;p=github%2Fwallabag%2Fwallabag.git diff --git a/src/Wallabag/CoreBundle/Repository/EntryRepository.php b/src/Wallabag/CoreBundle/Repository/EntryRepository.php index a26de0a8..879e6671 100644 --- a/src/Wallabag/CoreBundle/Repository/EntryRepository.php +++ b/src/Wallabag/CoreBundle/Repository/EntryRepository.php @@ -435,37 +435,45 @@ class EntryRepository extends EntityRepository * Returns a random entry, filtering by status. * * @param $userId - * @param string $status can be unread, archive or starred + * @param string $type can be unread, archive, starred, etc * * @throws \Doctrine\ORM\NoResultException * @throws \Doctrine\ORM\NonUniqueResultException * + * @see https://github.com/doctrine/doctrine2/issues/5479#issuecomment-403862934 + * * @return Entry */ - public function getRandomEntry($userId, $status = '') + public function getRandomEntry($userId, $type = '') { - $max = $this->getEntityManager() - ->createQuery('SELECT MAX(e.id) FROM Wallabag\CoreBundle\Entity\Entry e WHERE e.user = :userId') - ->setParameter('userId', $userId) - ->getSingleScalarResult(); - - $qb = $this->createQueryBuilder('e') - ->where('e.user = :user_id')->setParameter('user_id', $userId); - - if ('unread' === $status) { - $qb->andWhere('e.isArchived = false'); + $qb = $this->getQueryBuilderByUser($userId) + ->select('MIN(e.id)', 'MAX(e.id)'); + + switch ($type) { + case 'unread': + $qb->andWhere('e.isArchived = false'); + break; + case 'archive': + $qb->andWhere('e.isArchived = true'); + break; + case 'starred': + $qb->andWhere('e.isStarred = true'); + break; + case 'untagged': + $qb->leftJoin('e.tags', 't'); + $qb->andWhere('t.id is null'); + break; } - if ('archive' === $status) { - $qb->andWhere('e.isArchived = true'); - } - - if ('starred' === $status) { - $qb->andWhere('e.isStarred = true'); - } + $idLimits = $qb + ->getQuery() + ->getOneOrNullResult(); + $randomPossibleIds = rand($idLimits[1], $idLimits[2]); - return $qb->andWhere('e.id >= :rand') - ->setParameter('rand', rand(0, $max)) + return $qb + ->select('e') + ->andWhere('e.id >= :random_id') + ->setParameter('random_id', $randomPossibleIds) ->setMaxResults(1) ->getQuery() ->getSingleResult();