diff --git a/calendar/classes/local/event/strategies/raw_event_retrieval_strategy.php b/calendar/classes/local/event/strategies/raw_event_retrieval_strategy.php index 37d1a8038e2..f442a64a15c 100644 --- a/calendar/classes/local/event/strategies/raw_event_retrieval_strategy.php +++ b/calendar/classes/local/event/strategies/raw_event_retrieval_strategy.php @@ -278,7 +278,12 @@ class raw_event_retrieval_strategy implements raw_event_retrieval_strategy_inter // Build the WHERE condition for the sub-query. if (!empty($subqueryconditions)) { - $subquerywhere = 'WHERE ' . implode(" OR ", $subqueryconditions); + $unionstartquery = "SELECT modulename, instance, eventtype, priority + FROM {event} ev + WHERE "; + $subqueryunion = $unionstartquery . implode(" UNION $unionstartquery ", $subqueryconditions); + } else { + $subqueryunion = '{event}'; } // Merge subquery parameters to the parameters of the main query. @@ -291,8 +296,7 @@ class raw_event_retrieval_strategy implements raw_event_retrieval_strategy_inter ev.instance, ev.eventtype, MIN(ev.priority) as priority - FROM {event} ev - $subquerywhere + FROM ($subqueryunion) ev GROUP BY ev.modulename, ev.instance, ev.eventtype"; // Build the main query. diff --git a/lib/db/install.xml b/lib/db/install.xml index fcef7da2b25..9a30e74c4f5 100644 --- a/lib/db/install.xml +++ b/lib/db/install.xml @@ -461,6 +461,8 @@ + + diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index 4c56b3969c5..a80612c7341 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -2145,5 +2145,22 @@ function xmldb_main_upgrade($oldversion) { upgrade_main_savepoint(true, 2019122000.01); } + if ($oldversion < 2020010900.02) { + $table = new xmldb_table('event'); + + // This index will improve the performance when the Events API retrieves category and group events. + $index = new xmldb_index('eventtype', XMLDB_INDEX_NOTUNIQUE, ['eventtype']); + if (!$dbman->index_exists($table, $index)) { + $dbman->add_index($table, $index); + } + + // This index improves the performance of backups, deletion and visibilty changes on activities. + $index = new xmldb_index('modulename-instance', XMLDB_INDEX_NOTUNIQUE, ['modulename', 'instance']); + if (!$dbman->index_exists($table, $index)) { + $dbman->add_index($table, $index); + } + + upgrade_main_savepoint(true, 2020010900.02); + } return true; }