From dbcc425f5f1340e8d5190b987ec418e12c2365b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 28 Feb 2023 17:22:54 +0100 Subject: [PATCH] DX: improve performance for counting feature linked to person --- src/Bundle/ChillPersonBundle/Entity/Person.php | 17 +++++++++++++++++ .../Menu/PersonMenuBuilder.php | 15 ++++++++++++--- .../Repository/ResidentialAddressRepository.php | 10 ++++++++++ .../Resources/views/menu.html.twig | 8 ++++---- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Entity/Person.php b/src/Bundle/ChillPersonBundle/Entity/Person.php index 4e2bd4e89..d107ff4bd 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person.php @@ -680,6 +680,11 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI $this->proxyAccompanyingPeriodOpenState = false; } + public function countResources(): int + { + return $this->resources->count(); + } + /** * This public function is the same but return only true or false. */ @@ -764,6 +769,18 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI return $result; } + public function countAccompanyingPeriodInvolved( + bool $asParticipantOpen = true, + bool $asRequestor = true + ): int { + // TODO should be optimized to avoid loading accompanying period ? + return $this->getAccompanyingPeriodInvolved($asParticipantOpen, $asRequestor) + ->filter(function (AccompanyingPeriod $p) { + return $p->getStep() !== AccompanyingPeriod::STEP_DRAFT; + }) + ->count(); + } + /** * Get AccompanyingPeriodParticipations Collection. * diff --git a/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php b/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php index bf11a6c01..8c46b571e 100644 --- a/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php +++ b/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php @@ -12,6 +12,7 @@ declare(strict_types=1); namespace Chill\PersonBundle\Menu; use Chill\MainBundle\Routing\LocalMenuBuilderInterface; +use Chill\PersonBundle\Entity\Person; use Chill\PersonBundle\Repository\ResidentialAddressRepository; use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodVoter; use Knp\Menu\MenuItem; @@ -53,6 +54,12 @@ class PersonMenuBuilder implements LocalMenuBuilderInterface $this->residentialAddressRepo = $residentialAddressRepo; } + /** + * @param $menuId + * @param MenuItem $menu + * @param array{person: Person} $parameters + * @return void + */ public function buildMenu($menuId, MenuItem $menu, array $parameters) { $menu->addChild($this->translator->trans('Person details'), [ @@ -73,8 +80,8 @@ class PersonMenuBuilder implements LocalMenuBuilderInterface ]) ->setExtras([ 'order' => 60, - 'counter' => count($this->residentialAddressRepo->findBy(['person' => $parameters['person']])) > 0 ? - count($this->residentialAddressRepo->findBy(['person' => $parameters['person']])) : null, + 'counter' => 0 < ($nbResidentials = $this->residentialAddressRepo->countByPerson($parameters['person'])) ? + $nbResidentials : null, ]); $menu->addChild($this->translator->trans('person_resources_menu'), [ @@ -85,7 +92,7 @@ class PersonMenuBuilder implements LocalMenuBuilderInterface ]) ->setExtras([ 'order' => 70, - 'counter' => count($parameters['person']->getResources()) > 0 ? count($parameters['person']->getResources()) : null, + 'counter' => 0 < ($nbResources = $parameters['person']->countResources()) ? $nbResources : null, ]); $menu->addChild($this->translator->trans('household.person history'), [ @@ -120,6 +127,8 @@ class PersonMenuBuilder implements LocalMenuBuilderInterface ]) ->setExtras([ 'order' => 100, + 'counter' => 0 < ($nbAccompanyingPeriod = $parameters['person']->countAccompanyingPeriodInvolved()) + ? $nbAccompanyingPeriod : null, ]); } } diff --git a/src/Bundle/ChillPersonBundle/Repository/ResidentialAddressRepository.php b/src/Bundle/ChillPersonBundle/Repository/ResidentialAddressRepository.php index 96eb872cd..424411a72 100644 --- a/src/Bundle/ChillPersonBundle/Repository/ResidentialAddressRepository.php +++ b/src/Bundle/ChillPersonBundle/Repository/ResidentialAddressRepository.php @@ -32,6 +32,16 @@ class ResidentialAddressRepository extends ServiceEntityRepository parent::__construct($registry, ResidentialAddress::class); } + public function countByPerson(Person $person): int + { + return $this->createQueryBuilder('ra') + ->select('COUNT(ra)') + ->where('ra.person = :person') + ->setParameter('person', $person) + ->getQuery() + ->getSingleScalarResult(); + } + public function buildQueryFindCurrentResidentialAddresses(Person $person, ?DateTimeImmutable $at = null): QueryBuilder { $date = null === $at ? new DateTimeImmutable('today') : $at; diff --git a/src/Bundle/ChillPersonBundle/Resources/views/menu.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/menu.html.twig index cf60e31b7..931c84699 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/menu.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/menu.html.twig @@ -18,12 +18,12 @@