]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Better random function
authorJeremy Benoist <jeremy.benoist@gmail.com>
Fri, 12 Oct 2018 19:41:28 +0000 (21:41 +0200)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Sat, 19 Jan 2019 20:09:33 +0000 (21:09 +0100)
src/Wallabag/CoreBundle/Repository/EntryRepository.php

index 6107e19ec65244f32efe322cfc51e2f533ae3795..0556307918c87a9fc6b27644a870ab25da37fc19 100644 (file)
@@ -440,17 +440,14 @@ class EntryRepository extends EntityRepository
      * @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 = '')
     {
-        $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);
+        $qb = $this->getQueryBuilderByUser($userId)
+            ->select('MIN(e.id)', 'MAX(e.id)');
 
         if ('unread' === $status) {
             $qb->andWhere('e.isArchived = false');
@@ -469,8 +466,15 @@ class EntryRepository extends EntityRepository
             $qb->andWhere('t.id is null');
         }
 
-        return $qb->andWhere('e.id >= :rand')
-            ->setParameter('rand', rand(0, $max))
+        $idLimits = $qb
+            ->getQuery()
+            ->getOneOrNullResult();
+        $randomPossibleIds = rand($idLimits[1], $idLimits[2]);
+
+        return $qb
+            ->select('e')
+            ->andWhere('e.id >= :random_id')
+            ->setParameter('random_id', $randomPossibleIds)
             ->setMaxResults(1)
             ->getQuery()
             ->getSingleResult();