From 7e9090bd6acaa3633a73498ca933c561fbcac37a Mon Sep 17 00:00:00 2001 From: SebastianKrupinski Date: Sat, 10 May 2025 20:54:33 -0400 Subject: [PATCH 1/2] pref: improve caledar object query performance and accuracy Signed-off-by: SebastianKrupinski --- apps/dav/lib/CalDAV/CalDavBackend.php | 37 ++++++++++++++++--- .../Listener/AddMissingIndicesListener.php | 5 +++ .../Version1006Date20180628111625.php | 1 + 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index e69fe9ed3f0..2e97b6e3c70 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -1778,11 +1778,38 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription $query->andWhere($query->expr()->eq('componenttype', $query->createNamedParameter($componentType))); } - if ($timeRange && $timeRange['start']) { - $query->andWhere($query->expr()->gt('lastoccurence', $query->createNamedParameter($timeRange['start']->getTimeStamp()))); - } - if ($timeRange && $timeRange['end']) { - $query->andWhere($query->expr()->lt('firstoccurence', $query->createNamedParameter($timeRange['end']->getTimeStamp()))); + // time range + if ($timeRange) { + // case 1: event starts and ends within range + // case 2: event starts before range and ends within range + // case 3: event starts within range and ends after range + // case 4: event starts before range and ends after range + $rangerStart = $timeRange['start']->getTimeStamp(); + $rangerEnd = $timeRange['end']->getTimeStamp(); + $query->andWhere($query->expr()->orX( + // case 1 + $query->expr()->andX( + $query->expr()->gte('firstoccurence', $query->createNamedParameter($rangerStart)), + $query->expr()->lte('lastoccurence', $query->createNamedParameter($rangerEnd)), + ), + // case 2 + $query->expr()->andX( + $query->expr()->lt('firstoccurence', $query->createNamedParameter($rangerStart)), + $query->expr()->gte('lastoccurence', $query->createNamedParameter($rangerStart)), + $query->expr()->lte('lastoccurence', $query->createNamedParameter($rangerEnd)) + ), + // case 3 + $query->expr()->andX( + $query->expr()->gte('firstoccurence', $query->createNamedParameter($rangerStart)), + $query->expr()->lte('firstoccurence', $query->createNamedParameter($rangerEnd)), + $query->expr()->gt('lastoccurence', $query->createNamedParameter($rangerEnd)) + ), + // case 4 + $query->expr()->andX( + $query->expr()->lt('firstoccurence', $query->createNamedParameter($rangerStart)), + $query->expr()->gt('lastoccurence', $query->createNamedParameter($rangerEnd)) + ) + )); } $stmt = $query->executeQuery(); diff --git a/apps/dav/lib/Listener/AddMissingIndicesListener.php b/apps/dav/lib/Listener/AddMissingIndicesListener.php index d3a1cf4b224..c4bc6edc433 100644 --- a/apps/dav/lib/Listener/AddMissingIndicesListener.php +++ b/apps/dav/lib/Listener/AddMissingIndicesListener.php @@ -35,6 +35,11 @@ class AddMissingIndicesListener implements IEventListener { 'calobjects_by_uid_index', ['calendarid', 'calendartype', 'uid'] ); + $event->addMissingIndex( + 'calendarobjects', + 'calobjects_by_time_index', + ['calendarid', 'calendartype', 'firstoccurence', 'lastoccurence'] + ); } } diff --git a/apps/dav/lib/Migration/Version1006Date20180628111625.php b/apps/dav/lib/Migration/Version1006Date20180628111625.php index f4be26e6ad0..67c5c912f0c 100644 --- a/apps/dav/lib/Migration/Version1006Date20180628111625.php +++ b/apps/dav/lib/Migration/Version1006Date20180628111625.php @@ -50,6 +50,7 @@ class Version1006Date20180628111625 extends SimpleMigrationStep { } $calendarObjectsTable->addUniqueIndex(['calendarid', 'calendartype', 'uri'], 'calobjects_index'); $calendarObjectsTable->addUniqueIndex(['calendarid', 'calendartype', 'uid'], 'calobjects_by_uid_index'); + $calendarObjectsTable->addUniqueIndex(['calendarid', 'calendartype', 'firstoccurence', 'lastoccurence'], 'calobjects_by_time_index'); } if ($schema->hasTable('calendarobjects_props')) { From f45acf9b6b2a7ecc2def60f5d89856a024a35b57 Mon Sep 17 00:00:00 2001 From: SebastianKrupinski Date: Sun, 11 May 2025 13:17:32 -0400 Subject: [PATCH 2/2] fixup! pref: improve caledar object query performance and accuracy Signed-off-by: SebastianKrupinski --- apps/dav/lib/Migration/Version1006Date20180628111625.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dav/lib/Migration/Version1006Date20180628111625.php b/apps/dav/lib/Migration/Version1006Date20180628111625.php index 67c5c912f0c..70f717580b1 100644 --- a/apps/dav/lib/Migration/Version1006Date20180628111625.php +++ b/apps/dav/lib/Migration/Version1006Date20180628111625.php @@ -50,7 +50,7 @@ class Version1006Date20180628111625 extends SimpleMigrationStep { } $calendarObjectsTable->addUniqueIndex(['calendarid', 'calendartype', 'uri'], 'calobjects_index'); $calendarObjectsTable->addUniqueIndex(['calendarid', 'calendartype', 'uid'], 'calobjects_by_uid_index'); - $calendarObjectsTable->addUniqueIndex(['calendarid', 'calendartype', 'firstoccurence', 'lastoccurence'], 'calobjects_by_time_index'); + $calendarObjectsTable->addIndex(['calendarid', 'calendartype', 'firstoccurence', 'lastoccurence'], 'calobjects_by_time_index'); } if ($schema->hasTable('calendarobjects_props')) {