diff options
| author | Thomas Hackl <hackl@data-quest.de> | 2024-03-21 08:04:46 +0000 |
|---|---|---|
| committer | Thomas Hackl <hackl@data-quest.de> | 2024-03-21 08:04:46 +0000 |
| commit | 9315424f1ff73d9a5d9461c37d00991bf6047484 (patch) | |
| tree | c66bfaa144e9fea42180fd4ab1305e0e671283ba /lib/models/RangeTreeNode.php | |
| parent | 62cbeb6fab048eab48833854ba16da9c22822a5a (diff) | |
Resolve "Anzahl der Veranstaltungen in der Unterebene beim VVZ passt nicht"
Closes #3852
Merge request studip/studip!2714
Diffstat (limited to 'lib/models/RangeTreeNode.php')
| -rw-r--r-- | lib/models/RangeTreeNode.php | 101 |
1 files changed, 45 insertions, 56 deletions
diff --git a/lib/models/RangeTreeNode.php b/lib/models/RangeTreeNode.php index 4c4ae0d..29d4bcd 100644 --- a/lib/models/RangeTreeNode.php +++ b/lib/models/RangeTreeNode.php @@ -122,33 +122,28 @@ class RangeTreeNode extends SimpleORMap implements StudipTreeNode */ public function countCourses($semester_id = '', $semclass = 0, $with_children = false): int { - if ($semester_id) { - $query = "SELECT COUNT(DISTINCT i.`seminar_id`) - FROM `seminar_inst` i - JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`) - LEFT JOIN `semester_courses` sc ON (i.`seminar_id` = sc.`course_id`) - WHERE i.`institut_id` IN ( - SELECT DISTINCT `studip_object_id` - FROM `range_tree` - WHERE `item_id` IN (:ids) - ) AND ( - sc.`semester_id` = :semester - OR sc.`semester_id` IS NULL - )"; + $query = "SELECT COUNT(DISTINCT i.`seminar_id`) FROM `seminar_inst` i"; + + if ($semester_id !== 'all') { + $query .= " JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`) + LEFT JOIN `semester_courses` sc ON (i.`seminar_id` = sc.`course_id`) + WHERE sc.`semester_id` = :semester"; $parameters = [ - 'ids' => $with_children ? $this->getDescendantIds() : [$this->id], 'semester' => $semester_id ]; } else { - $query = "SELECT COUNT(DISTINCT `seminar_id`) - FROM `seminar_inst` i - JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`) - WHERE `institut_id` IN ( - SELECT DISTINCT `studip_object_id` - FROM `range_tree` - WHERE `item_id` IN (:ids) - )"; - $parameters = ['ids' => $with_children ? $this->getDescendantIds() : [$this->id]]; + $query .= " JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`)"; + $parameters = []; + } + + if ($with_children) { + $query .= " AND i.`institut_id` IN ( + SELECT DISTINCT `studip_object_id` FROM `range_tree` WHERE `item_id` IN (:ids) + )"; + $parameters['ids'] = array_merge([$this->id], $this->getDescendantIds()); + } else { + $query .= " AND i.`institut_id` = :id"; + $parameters['id'] = $this->studip_object_id; } if (!$GLOBALS['perm']->have_perm(Config::get()->SEM_VISIBILITY_PERM)) { @@ -179,48 +174,32 @@ class RangeTreeNode extends SimpleORMap implements StudipTreeNode array $courses = [] ): array { - if ($semester_id !== 'all') { - $query = "SELECT DISTINCT s.* - FROM `seminare` s - JOIN `seminar_inst` i ON (i.`seminar_id` = s.`Seminar_id`) - LEFT JOIN `semester_courses` sem ON (sem.`course_id` = s.`Seminar_id`) - WHERE i.`institut_id` IN ( - SELECT DISTINCT `studip_object_id` - FROM `range_tree` - WHERE `item_id` IN (:ids) - ) AND ( - sem.`semester_id` = :semester - OR sem.`semester_id` IS NULL - )"; + $query = "SELECT DISTINCT s.* FROM `seminar_inst` i"; + if ($semester_id !== 'all') { + $query .= " JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`) + LEFT JOIN `semester_courses` sc ON (i.`seminar_id` = sc.`course_id`) + WHERE sc.`semester_id` = :semester"; $parameters = [ - 'ids' => $with_children ? $this->getDescendantIds() : [$this->id], 'semester' => $semester_id ]; } else { - $query = "SELECT DISTINCT s.* - FROM `seminare` s - JOIN `seminar_inst` i ON (i.`seminar_id` = s.`Seminar_id`) - WHERE i.`institut_id` IN ( - SELECT DISTINCT `studip_object_id` - FROM `range_tree` - WHERE `item_id` IN (:ids) - )"; - $parameters = ['ids' => $with_children ? $this->getDescendantIds() : [$this->id]]; + $query .= " JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`)"; + $parameters = []; } - if (!$GLOBALS['perm']->have_perm(Config::get()->SEM_VISIBILITY_PERM)) { - $query .= " AND s.`visible` = 1"; - } - - if ($searchterm) { - $query .= " AND s.`Name` LIKE :searchterm"; - $parameters['searchterm'] = '%' . trim($searchterm) . '%'; + if ($with_children) { + $query .= " AND i.`institut_id` IN ( + SELECT DISTINCT `studip_object_id` FROM `range_tree` WHERE `item_id` IN (:ids) + )"; + $parameters['ids'] = array_merge([$this->id], $this->getDescendantIds()); + } else { + $query .= " AND i.`institut_id` = :id"; + $parameters['id'] = $this->studip_object_id; } - if ($courses) { - $query .= " AND s.`Seminar_id` IN (:courses)"; - $parameters['courses'] = $courses; + if (!$GLOBALS['perm']->have_perm(Config::get()->SEM_VISIBILITY_PERM)) { + $query .= " AND s.`visible` = 1"; } if ($semclass !== 0) { @@ -236,6 +215,16 @@ class RangeTreeNode extends SimpleORMap implements StudipTreeNode ); } + if ($searchterm) { + $query .= " AND s.`Name` LIKE :searchterm"; + $parameters['searchterm'] = '%' . trim($searchterm) . '%'; + } + + if ($courses) { + $query .= " AND t.`seminar_id` IN (:courses)"; + $parameters['courses'] = $courses; + } + if (Config::get()->IMPORTANT_SEMNUMBER) { $query .= " ORDER BY s.`start_time`, s.`VeranstaltungsNummer`, s.`Name`"; } else { |
