aboutsummaryrefslogtreecommitdiff
path: root/app/controllers/course/courseware.php
diff options
context:
space:
mode:
authorMarcus Eibrink-Lunzenauer <lunzenauer@elan-ev.de>2022-01-21 10:10:40 +0000
committerMarcus Eibrink-Lunzenauer <lunzenauer@elan-ev.de>2022-01-21 10:10:40 +0000
commitb6389b549adefbdbd5441e39b6514e7ed1f0e566 (patch)
tree6f0cf3df05b357d9522d67a973678cf133c1e7c0 /app/controllers/course/courseware.php
parent27d90b64023cea588932282b1290325d14c3d26d (diff)
Courseware-Fortschrittseite beschleunigen (SORMless edition)
Diffstat (limited to 'app/controllers/course/courseware.php')
-rwxr-xr-xapp/controllers/course/courseware.php47
1 files changed, 30 insertions, 17 deletions
diff --git a/app/controllers/course/courseware.php b/app/controllers/course/courseware.php
index c4aae64..1d93a0a 100755
--- a/app/controllers/course/courseware.php
+++ b/app/controllers/course/courseware.php
@@ -131,7 +131,7 @@ class Course_CoursewareController extends AuthenticatedController
return array_combine(array_column($elements, 'id'), $elements);
}
- private function computeChildrenOf(iterable $elements): iterable
+ private function computeChildrenOf(iterable &$elements): iterable
{
$childrenOf = [];
foreach ($elements as $elementId => $element) {
@@ -149,19 +149,28 @@ class Course_CoursewareController extends AuthenticatedController
private function computeSelfProgresses(
Instance $instance,
User $user,
- iterable $elements,
+ iterable &$elements,
bool $showProgressForAllParticipants
): iterable {
$progress = [];
/** @var \Course $course */
$course = $instance->getRange();
- $allBlocks = $instance->findAllBlocksGroupedByStructuralElementId();
+ $allBlockIds = $instance->findAllBlocksGroupedByStructuralElementId(function ($row) {
+ return $row['id'];
+ });
$courseMemberIds = $showProgressForAllParticipants
? array_column($course->getMembersWithStatus('autor'), 'user_id')
: [$user->getId()];
- $userProgresses = UserProgress::findBySQL('user_id IN (?)', [$courseMemberIds]);
+
+ $sql =
+ 'SELECT block_id, COUNT(grade) as count, SUM(grade) as grade ' .
+ 'FROM cw_user_progresses ' .
+ 'WHERE block_id IN (?) AND user_id IN (?) ' .
+ 'GROUP BY block_id';
+ $userProgresses = \DBManager::get()->fetchGrouped($sql, [$allBlockIds, $courseMemberIds]);
+
foreach ($elements as $elementId => $element) {
- $selfProgress = $this->getSelfProgresses($allBlocks, $elementId, $userProgresses, $courseMemberIds);
+ $selfProgress = $this->getSelfProgresses($allBlockIds, $elementId, $userProgresses, $courseMemberIds);
$progress[$elementId] = [
'self' => $selfProgress['counter'] ? $selfProgress['progress'] / $selfProgress['counter'] : 1,
];
@@ -171,31 +180,35 @@ class Course_CoursewareController extends AuthenticatedController
}
private function getSelfProgresses(
- array $allBlocks,
+ array &$allBlockIds,
string $elementId,
- array $userProgresses,
- array $courseMemberIds
+ array &$userProgresses,
+ array &$courseMemberIds
): array {
- $blks = $allBlocks[$elementId] ?: [];
+ $blks = $allBlockIds[$elementId] ?: [];
+ if (!count($blks)) {
+ return [
+ 'counter' => 0,
+ 'progress' => 1,
+ ];
+ }
$data = [
'counter' => count($blks),
'progress' => 0,
];
+
$usersCounter = count($courseMemberIds);
foreach ($blks as $blk) {
- $progresses = array_filter($userProgresses, function ($progress) use ($blk, $courseMemberIds) {
- return $progress->block_id === $blk->getId() && in_array($progress->user_id, $courseMemberIds);
- });
- $usersProgress = count($progresses) ? array_sum(array_column($progresses, 'grade')) : 0;
-
+ $progresses = $userProgresses[$blk];
+ $usersProgress = $progresses['count'] ? (float) $progresses['sum'] : 0;
$data['progress'] += $usersProgress / $usersCounter;
}
return $data;
}
- private function computeCumulativeProgresses(Instance $instance, iterable $elements, iterable $progress): iterable
+ private function computeCumulativeProgresses(Instance $instance, iterable &$elements, iterable &$progress): iterable
{
$childrenOf = $this->computeChildrenOf($elements);
@@ -225,7 +238,7 @@ class Course_CoursewareController extends AuthenticatedController
return $progress;
}
- private function prepareProgressData(iterable $elements, iterable $progress): iterable
+ private function prepareProgressData(iterable &$elements, iterable &$progress): iterable
{
$data = [];
foreach ($elements as $elementId => $element) {
@@ -246,7 +259,7 @@ class Course_CoursewareController extends AuthenticatedController
return $data;
}
- private function getChapterCounter(array $chapters): array
+ private function getChapterCounter(array &$chapters): array
{
$finished = 0;
$started = 0;