From 137c8ab756538e979547c1339782dc1b647069d0 Mon Sep 17 00:00:00 2001 From: Simounet Date: Thu, 31 Aug 2023 12:13:15 +0200 Subject: [PATCH] Count queries simplified --- .../CoreBundle/Repository/EntryRepository.php | 91 +++++++++++++++++++ .../CoreBundle/Twig/WallabagExtension.php | 24 ++--- 2 files changed, 101 insertions(+), 14 deletions(-) diff --git a/src/Wallabag/CoreBundle/Repository/EntryRepository.php b/src/Wallabag/CoreBundle/Repository/EntryRepository.php index 9dded5e57..3e0b4effd 100644 --- a/src/Wallabag/CoreBundle/Repository/EntryRepository.php +++ b/src/Wallabag/CoreBundle/Repository/EntryRepository.php @@ -37,6 +37,20 @@ class EntryRepository extends ServiceEntityRepository ; } + /** + * Retrieves all entries count for a user. + * + * @param int $userId + * + * @return QueryBuilder + */ + public function getCountBuilderForAllByUser($userId) + { + return $this + ->getQueryBuilderByUser($userId) + ; + } + /** * Retrieves unread entries for a user. * @@ -52,6 +66,21 @@ class EntryRepository extends ServiceEntityRepository ; } + /** + * Retrieves unread entries count for a user. + * + * @param int $userId + * + * @return QueryBuilder + */ + public function getCountBuilderForUnreadByUser($userId) + { + return $this + ->getQueryBuilderByUser($userId) + ->andWhere('e.isArchived = false') + ; + } + /** * Retrieves entries with the same domain. * @@ -94,6 +123,21 @@ class EntryRepository extends ServiceEntityRepository ; } + /** + * Retrieves read entries count for a user. + * + * @param int $userId + * + * @return QueryBuilder + */ + public function getCountBuilderForArchiveByUser($userId) + { + return $this + ->getQueryBuilderByUser($userId) + ->andWhere('e.isArchived = true') + ; + } + /** * Retrieves starred entries for a user. * @@ -109,6 +153,21 @@ class EntryRepository extends ServiceEntityRepository ; } + /** + * Retrieves starred entries count for a user. + * + * @param int $userId + * + * @return QueryBuilder + */ + public function getCountBuilderForStarredByUser($userId) + { + return $this + ->getQueryBuilderByUser($userId) + ->andWhere('e.isStarred = true') + ; + } + /** * Retrieves entries filtered with a search term for a user. * @@ -167,6 +226,21 @@ class EntryRepository extends ServiceEntityRepository ; } + /** + * Retrieve entries with annotations count for a user. + * + * @param int $userId + * + * @return QueryBuilder + */ + public function getCountBuilderForAnnotationsByUser($userId) + { + return $this + ->getQueryBuilderByUser($userId) + ->innerJoin('e.annotations', 'a') + ; + } + /** * Retrieve untagged entries for a user. * @@ -563,6 +637,23 @@ class EntryRepository extends ServiceEntityRepository return $qb->getQuery()->getArrayResult(); } + /** + * @param int $userId + * + * @return array + */ + public function findEmptyEntriesIdByUserId($userId = null) + { + $qb = $this->createQueryBuilder('e') + ->select('e.id'); + + if (null !== $userId) { + $qb->where('e.user = :userid AND e.content IS NULL')->setParameter(':userid', $userId); + } + + return $qb->getQuery()->getArrayResult(); + } + /** * Find all entries by url and owner. * diff --git a/src/Wallabag/CoreBundle/Twig/WallabagExtension.php b/src/Wallabag/CoreBundle/Twig/WallabagExtension.php index e94bf3603..a31cacf0e 100644 --- a/src/Wallabag/CoreBundle/Twig/WallabagExtension.php +++ b/src/Wallabag/CoreBundle/Twig/WallabagExtension.php @@ -88,35 +88,32 @@ class WallabagExtension extends AbstractExtension implements GlobalsInterface switch ($type) { case 'starred': - $qb = $this->entryRepository->getBuilderForStarredByUser($user->getId()); + $qb = $this->entryRepository->getCountBuilderForStarredByUser($user->getId()); break; case 'archive': - $qb = $this->entryRepository->getBuilderForArchiveByUser($user->getId()); + $qb = $this->entryRepository->getCountBuilderForArchiveByUser($user->getId()); break; case 'unread': - $qb = $this->entryRepository->getBuilderForUnreadByUser($user->getId()); + $qb = $this->entryRepository->getCountBuilderForUnreadByUser($user->getId()); break; case 'annotated': - $qb = $this->entryRepository->getBuilderForAnnotationsByUser($user->getId()); + $qb = $this->entryRepository->getCountBuilderForAnnotationsByUser($user->getId()); break; case 'all': - $qb = $this->entryRepository->getBuilderForAllByUser($user->getId()); + $qb = $this->entryRepository->getCountBuilderForAllByUser($user->getId()); break; default: throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type)); } - // THANKS to PostgreSQL we CAN'T make a DEAD SIMPLE count(e.id) - // ERROR: column "e0_.id" must appear in the GROUP BY clause or be used in an aggregate function $query = $qb - ->select('e.id') - ->groupBy('e.id') + ->select('COUNT(e.id)') ->getQuery(); $query->useQueryCache(true); $query->enableResultCache($this->lifeTime); - return \count($query->getArrayResult()); + return $query->getSingleScalarResult(); } /** @@ -148,15 +145,14 @@ class WallabagExtension extends AbstractExtension implements GlobalsInterface return 0; } - $query = $this->entryRepository->getBuilderForArchiveByUser($user->getId()) - ->select('e.id') - ->groupBy('e.id') + $query = $this->entryRepository->getCountBuilderForArchiveByUser($user->getId()) + ->select('COUNT(e.id)') ->getQuery(); $query->useQueryCache(true); $query->enableResultCache($this->lifeTime); - $nbArchives = \count($query->getArrayResult()); + $nbArchives = $query->getSingleScalarResult(); $interval = $user->getCreatedAt()->diff(new \DateTime('now')); $nbDays = (int) $interval->format('%a') ?: 1;