Internal: Improve query to get users in session - refs BT#22063

pull/5832/head
christianbeeznst 11 months ago
parent df16082c13
commit d8a0bbca51
  1. 11
      src/CoreBundle/Command/LpProgressReminderCommand.php
  2. 3
      src/CoreBundle/Entity/SessionRelCourseRelUser.php
  3. 17
      src/CoreBundle/Repository/CourseRelUserRepository.php
  4. 40
      src/CoreBundle/Repository/SessionRelCourseRelUserRepository.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";
}
}
}

@ -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: [

@ -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();
}
}

@ -0,0 +1,40 @@
<?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\SessionRelCourseRelUser;
use Chamilo\CourseBundle\Entity\CLp;
use Chamilo\CourseBundle\Entity\CLpView;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
class SessionRelCourseRelUserRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, SessionRelCourseRelUser::class);
}
/**
* Retrieves users from a course session and their LP progress.
*/
public function getSessionCourseUsers(int $courseId, array $lpIds): array
{
$qb = $this->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();
}
}
Loading…
Cancel
Save