diff options
| author | André Noack <noack@data-quest.de> | 2024-03-25 15:09:39 +0000 |
|---|---|---|
| committer | André Noack <noack@data-quest.de> | 2024-03-25 15:09:39 +0000 |
| commit | fe0b89903289f69eb0a99dd553ccc28880435f1e (patch) | |
| tree | 4fd5bda29de6048a69a5d29120227b24be0fc9a9 /lib/models | |
| parent | bf57b4bbb8f84a9c49f94c1de866e0e07cf05050 (diff) | |
Resolve #3893 "Performance des persönlichen Kalenders / Gruppenkalender ist schlecht"
Closes #3893
Merge request studip/studip!2746
Diffstat (limited to 'lib/models')
| -rw-r--r-- | lib/models/calendar/CalendarDateAssignment.class.php | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/lib/models/calendar/CalendarDateAssignment.class.php b/lib/models/calendar/CalendarDateAssignment.class.php index 18cd610..fbd21a7 100644 --- a/lib/models/calendar/CalendarDateAssignment.class.php +++ b/lib/models/calendar/CalendarDateAssignment.class.php @@ -232,29 +232,35 @@ class CalendarDateAssignment extends SimpleORMap implements Event $sql = "JOIN `calendar_dates` ON calendar_date_id = `calendar_dates`.`id` WHERE - `calendar_date_assignments`.`range_id` = :range_id "; + `calendar_date_assignments`.`range_id` = :range_id + AND + `access` IN ( :access_levels ) "; if (!$with_declined) { $sql .= "AND `calendar_date_assignments`.`participation` <> 'DECLINED' "; } - $sql .= "AND ( - `calendar_dates`.`begin` BETWEEN :begin AND :end - OR - (`calendar_dates`.`begin` <= :end AND `calendar_dates`.`repetition_type` <> '' - AND `calendar_dates`.`repetition_end` > :begin) - OR - :begin BETWEEN `calendar_dates`.`begin` AND `calendar_dates`.`end` - ) - AND - `access` IN ( :access_levels ) - ORDER BY `calendar_dates`.`begin` ASC"; + $sql_single = $sql . " AND + `calendar_dates`.`begin` < :end AND :begin < `calendar_dates`.`end` + "; - $events = self::findBySql($sql, [ + $events = self::findBySql($sql_single, [ 'range_id' => $range_id, 'begin' => $begin->getTimestamp(), 'end' => $end->getTimestamp(), 'access_levels' => $access_levels ]); + + $sql_repetition = $sql . " AND `calendar_dates`.`begin` < :end AND `calendar_dates`.`repetition_type` IN ('DAYLY', 'WEEKLY', 'MONTHLY', 'YEARLY') + AND `calendar_dates`.`repetition_end` > :begin + "; + + $events = array_merge($events, self::findBySql($sql_repetition, [ + 'range_id' => $range_id, + 'begin' => $begin->getTimestamp(), + 'end' => $end->getTimestamp(), + 'access_levels' => $access_levels + ])); + $m_start = clone $begin; $m_end = clone $end; $events_created = []; |
