From f42f687872f4887f557e8dec9226c8a2f318597c Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Willms <tleilax+studip@gmail.com> Date: Fri, 23 Aug 2024 13:07:39 +0000 Subject: [PATCH] use correct join type to avoid reading way too many courses, fixes #4518 Closes #4518 Merge request studip/studip!3319 --- lib/extern/ExternPagePersonDetails.php | 45 ++++++++++++-------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/lib/extern/ExternPagePersonDetails.php b/lib/extern/ExternPagePersonDetails.php index a62d48216bb..2624c08937f 100644 --- a/lib/extern/ExternPagePersonDetails.php +++ b/lib/extern/ExternPagePersonDetails.php @@ -135,29 +135,24 @@ class ExternPagePersonDetails extends ExternPage { $grouped_courses = []; $semesters = $this->getSemesters(); - $query = " - SELECT - IFNULL(`semester_courses`.`semester_id`, '-1') AS `group_id`, - `seminare`.* - FROM - `seminare` - LEFT JOIN `semester_courses` + $query = "SELECT IFNULL(`semester_courses`.`semester_id`, '-1') AS `group_id`, + `seminare`.* + FROM `seminare` + LEFT JOIN `semester_courses` ON `semester_courses`.`course_id` = `seminare`.`Seminar_id` - LEFT JOIN `seminar_user` USING(`seminar_id`) - LEFT JOIN `sem_types` - ON `sem_types`.`id` = `seminare`.`status` - WHERE `seminare`.`visible` = 1 - AND `semester_courses`.`semester_id` IN (:semester_ids) OR ISNULL(`semester_id`) - AND `seminar_user`.`user_id` = :user_id - AND `seminar_user`.`status` = 'dozent' - AND `sem_types`.`class` IN (:semclasses)"; - - $grouped_results = DBManager::get()->fetchGrouped($query, - [ - 'semester_ids' => $semesters, - 'semclasses' => (array) $this->semclass, - 'user_id' => $user->id - ]); + JOIN `seminar_user` USING(`seminar_id`) + JOIN `sem_types` ON `sem_types`.`id` = `seminare`.`status` + WHERE `seminare`.`visible` = 1 + AND (`semester_courses`.`semester_id` IN (:semester_ids) OR ISNULL(`semester_id`)) + AND `seminar_user`.`user_id` = :user_id + AND `seminar_user`.`status` = 'dozent' + AND `sem_types`.`class` IN (:semclasses)"; + + $grouped_results = DBManager::get()->fetchGrouped($query, [ + 'semester_ids' => $semesters, + 'semclasses' => (array) $this->semclass, + 'user_id' => $user->id + ]); // handle unlimited courses if (isset($grouped_results['-1'])) { @@ -171,9 +166,9 @@ class ExternPagePersonDetails extends ExternPage unset($grouped_results['-1']); } foreach ($grouped_results as $group_id => $group_result) { - $grouped_courses[$group_id] = - SimpleORMapCollection::createFromArray( - Course::findMany($group_result)); + $grouped_courses[$group_id] = SimpleORMapCollection::createFromArray( + Course::findMany($group_result) + ); } return $grouped_courses; } -- GitLab