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