From d8a0bbca51236b4156ca2091693dc0e7cd532b3a Mon Sep 17 00:00:00 2001 From: christianbeeznst Date: Wed, 9 Oct 2024 15:43:04 -0500 Subject: [PATCH] Internal: Improve query to get users in session - refs BT#22063 --- .../Command/LpProgressReminderCommand.php | 11 +++-- .../Entity/SessionRelCourseRelUser.php | 3 +- .../Repository/CourseRelUserRepository.php | 17 ++------ .../SessionRelCourseRelUserRepository.php | 40 +++++++++++++++++++ 4 files changed, 51 insertions(+), 20 deletions(-) create mode 100644 src/CoreBundle/Repository/SessionRelCourseRelUserRepository.php diff --git a/src/CoreBundle/Command/LpProgressReminderCommand.php b/src/CoreBundle/Command/LpProgressReminderCommand.php index 7977fee761..595097dd35 100644 --- a/src/CoreBundle/Command/LpProgressReminderCommand.php +++ b/src/CoreBundle/Command/LpProgressReminderCommand.php @@ -10,6 +10,7 @@ use Chamilo\CoreBundle\Repository\CourseRelUserRepository; use Chamilo\CoreBundle\Repository\ExtraFieldValuesRepository; use Chamilo\CoreBundle\Repository\Node\CourseRepository; use Chamilo\CoreBundle\Repository\Node\UserRepository; +use Chamilo\CoreBundle\Repository\SessionRelCourseRelUserRepository; use Chamilo\CoreBundle\Repository\TrackEDefaultRepository; use DateTime; use DateTimeZone; @@ -31,6 +32,7 @@ class LpProgressReminderCommand extends Command public function __construct( private CourseRepository $courseRepository, private CourseRelUserRepository $courseRelUserRepository, + private SessionRelCourseRelUserRepository $sessionRelCourseRelUserRepository, private ExtraFieldValuesRepository $extraFieldValuesRepository, private TrackEDefaultRepository $trackEDefaultRepository, private UserRepository $userRepository, @@ -88,17 +90,17 @@ class LpProgressReminderCommand extends Command // Retrieve users for the course (without session) $courseUsers = $this->courseRelUserRepository->getCourseUsers($courseId, $lpIds); // Retrieve users for the course session - $sessionCourseUsers = $this->courseRelUserRepository->getCourseUsers($courseId, $lpIds, true); + $sessionCourseUsers = $this->sessionRelCourseRelUserRepository->getSessionCourseUsers($courseId, $lpIds); if ($debugMode && (!empty($courseUsers) || !empty($sessionCourseUsers))) { $output->writeln('Processing course ID: ' . $courseId); if (!empty($courseUsers)) { $output->writeln('Course users retrieved: ' . count($courseUsers)); - $output->writeln('Course retrieved: ' . print_r($courseUsers, true)); + //$output->writeln('Course retrieved: ' . print_r($courseUsers, true)); } if (!empty($sessionCourseUsers)) { $output->writeln('Session users retrieved: ' . count($sessionCourseUsers)); - $output->writeln('Session retrieved: ' . print_r($sessionCourseUsers, true)); + //$output->writeln('Session retrieved: ' . print_r($sessionCourseUsers, true)); } } @@ -149,9 +151,6 @@ class LpProgressReminderCommand extends Command } $this->sendLpReminder($userId, $courseTitle, $progress, $registrationDate, $nbRemind); } - } elseif ($debugMode) { - $sessionInfo = $sessionId > 0 ? "in session ID $sessionId" : "without a session"; - echo "No registration date found for user $userId in course $courseTitle (LP ID: $lpId) $sessionInfo\n"; } } } diff --git a/src/CoreBundle/Entity/SessionRelCourseRelUser.php b/src/CoreBundle/Entity/SessionRelCourseRelUser.php index 641785a474..bfd5b7c9ee 100644 --- a/src/CoreBundle/Entity/SessionRelCourseRelUser.php +++ b/src/CoreBundle/Entity/SessionRelCourseRelUser.php @@ -11,6 +11,7 @@ use ApiPlatform\Doctrine\Orm\Filter\SearchFilter; use ApiPlatform\Metadata\ApiFilter; use ApiPlatform\Metadata\ApiResource; use Chamilo\CoreBundle\Entity\User as UserAlias; +use Chamilo\CoreBundle\Repository\SessionRelCourseRelUserRepository; use Chamilo\CoreBundle\Traits\UserTrait; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Serializer\Annotation\Groups; @@ -33,7 +34,7 @@ use Symfony\Component\Validator\Constraints as Assert; #[ORM\Index(columns: ['user_id'], name: 'idx_session_rel_course_rel_user_id_user')] #[ORM\Index(columns: ['c_id'], name: 'idx_session_rel_course_rel_user_course_id')] #[ORM\UniqueConstraint(name: 'course_session_unique', columns: ['session_id', 'c_id', 'user_id', 'status'])] -#[ORM\Entity] +#[ORM\Entity(repositoryClass: SessionRelCourseRelUserRepository::class)] #[ApiFilter( filterClass: SearchFilter::class, properties: [ diff --git a/src/CoreBundle/Repository/CourseRelUserRepository.php b/src/CoreBundle/Repository/CourseRelUserRepository.php index 8a6078e07f..2586868a45 100644 --- a/src/CoreBundle/Repository/CourseRelUserRepository.php +++ b/src/CoreBundle/Repository/CourseRelUserRepository.php @@ -6,9 +6,7 @@ declare(strict_types=1); namespace Chamilo\CoreBundle\Repository; - use Chamilo\CoreBundle\Entity\CourseRelUser; -use Chamilo\CoreBundle\Entity\SessionRelCourseRelUser; use Chamilo\CourseBundle\Entity\CLp; use Chamilo\CourseBundle\Entity\CLpView; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; @@ -22,28 +20,21 @@ class CourseRelUserRepository extends ServiceEntityRepository } /** - * Retrieves users from a course, with or without a session, and their LP progress. + * Retrieves users from a course and their LP progress (without session). */ - public function getCourseUsers(int $courseId, array $lpIds, bool $checkSession = false): array + public function getCourseUsers(int $courseId, array $lpIds): array { $qb = $this->createQueryBuilder('cu') ->select('u.id AS userId, c.title AS courseTitle, lp.iid AS lpId, lpv.progress') ->innerJoin('cu.user', 'u') ->innerJoin('cu.course', 'c') - ->leftJoin(CLpView::class, 'lpv', 'WITH', 'lpv.user = u.id') - ->leftJoin(CLp::class, 'lp', 'WITH', 'lp.iid = lpv.lp') + ->leftJoin(CLpView::class, 'lpv', 'WITH', 'lpv.user = u.id AND lpv.course = cu.course') + ->leftJoin(CLp::class, 'lp', 'WITH', 'lp.iid = lpv.lp OR lp.iid IN (:lpIds)') ->where('cu.course = :courseId') - ->andWhere('lp.iid IN (:lpIds)') ->setParameter('courseId', $courseId) ->setParameter('lpIds', $lpIds) ->andWhere('(lpv.progress < 100 OR lpv.progress IS NULL)'); - if ($checkSession) { - $qb->addSelect('IDENTITY(scu.session) AS sessionId') - ->leftJoin(SessionRelCourseRelUser::class, 'scu', 'WITH', 'scu.user = u AND scu.course = cu.course') - ->andWhere('scu.session IS NOT NULL'); - } - return $qb->getQuery()->getResult(); } } diff --git a/src/CoreBundle/Repository/SessionRelCourseRelUserRepository.php b/src/CoreBundle/Repository/SessionRelCourseRelUserRepository.php new file mode 100644 index 0000000000..15e52698d4 --- /dev/null +++ b/src/CoreBundle/Repository/SessionRelCourseRelUserRepository.php @@ -0,0 +1,40 @@ +createQueryBuilder('scu') + ->select('u.id AS userId, c.title AS courseTitle, lp.iid AS lpId, lpv.progress, IDENTITY(scu.session) AS sessionId') + ->innerJoin('scu.user', 'u') + ->innerJoin('scu.course', 'c') + ->leftJoin(CLpView::class, 'lpv', 'WITH', 'lpv.user = u.id AND lpv.course = scu.course') + ->leftJoin(CLp::class, 'lp', 'WITH', 'lp.iid = lpv.lp OR lp.iid IN (:lpIds)') + ->where('scu.course = :courseId') + ->setParameter('courseId', $courseId) + ->setParameter('lpIds', $lpIds) + ->andWhere('(lpv.progress < 100 OR lpv.progress IS NULL)'); + + return $qb->getQuery()->getResult(); + } +}