aboutsummaryrefslogtreecommitdiff
path: root/lib/models
diff options
context:
space:
mode:
authorAndré Noack <noack@data-quest.de>2024-03-25 15:09:39 +0000
committerAndré Noack <noack@data-quest.de>2024-03-25 15:09:39 +0000
commitfe0b89903289f69eb0a99dd553ccc28880435f1e (patch)
tree4fd5bda29de6048a69a5d29120227b24be0fc9a9 /lib/models
parentbf57b4bbb8f84a9c49f94c1de866e0e07cf05050 (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.php32
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 = [];