From 446cd0dfe171d9c9ff9e6be3aeb0d9fe657d7e60 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sat, 13 Feb 2016 13:09:59 +0100 Subject: [PATCH] Performance: Limit number of SQL queries needed for "object relations update" operation --- .../calendar/drivers/kolab/kolab_calendar.php | 8 +----- plugins/kolab_notes/kolab_notes.php | 6 +---- plugins/libkolab/lib/kolab_storage_config.php | 26 +++++++++++-------- .../drivers/kolab/tasklist_kolab_driver.php | 8 +----- 4 files changed, 18 insertions(+), 30 deletions(-) diff --git a/plugins/calendar/drivers/kolab/kolab_calendar.php b/plugins/calendar/drivers/kolab/kolab_calendar.php index 9043b4a9..a2ff6ee9 100644 --- a/plugins/calendar/drivers/kolab/kolab_calendar.php +++ b/plugins/calendar/drivers/kolab/kolab_calendar.php @@ -572,14 +572,8 @@ class kolab_calendar extends kolab_storage_folder_api */ protected function save_links($uid, $links) { - // make sure we have a valid array - if (empty($links)) { - $links = array(); - } - $storage = kolab_storage_config::get_instance(); - $remove = array_diff($storage->get_object_links($uid), $links); - return $storage->save_object_links($uid, $links, $remove); + return $storage->save_object_links($uid, (array) $links); } /** diff --git a/plugins/kolab_notes/kolab_notes.php b/plugins/kolab_notes/kolab_notes.php index 58741c65..18e15444 100644 --- a/plugins/kolab_notes/kolab_notes.php +++ b/plugins/kolab_notes/kolab_notes.php @@ -1247,12 +1247,8 @@ class kolab_notes extends rcube_plugin private function save_links($uid, $links) { - if (empty($links)) { - $links = array(); - } $config = kolab_storage_config::get_instance(); - $remove = array_diff($config->get_object_links($uid), $links); - return $config->save_object_links($uid, $links, $remove); + return $config->save_object_links($uid, (array) $links); } /** diff --git a/plugins/libkolab/lib/kolab_storage_config.php b/plugins/libkolab/lib/kolab_storage_config.php index e843e976..cd295267 100644 --- a/plugins/libkolab/lib/kolab_storage_config.php +++ b/plugins/libkolab/lib/kolab_storage_config.php @@ -711,7 +711,8 @@ class kolab_storage_config * Find objects linked with the given groupware object through a relation * * @param string Object UUID - * @param array List of related URIs + * + * @return array List of related URIs */ public function get_object_links($uid) { @@ -735,27 +736,30 @@ class kolab_storage_config } /** + * Save relations of an object. + * Note, that we already support only one-to-one relations. + * So, all relations to the object that are not provided in $links + * argument will be removed. * + * @param string $uid Object UUID + * @param array $links List of related-object URIs + * + * @return bool True on success, False on failure */ - public function save_object_links($uid, $links, $remove = array()) + public function save_object_links($uid, $links) { $object_uri = self::build_member_url($uid); - $relations = $this->get_relations_for_member($uid); - $done = false; + $relations = $this->get_relations_for_member($uid); + $done = false; foreach ($relations as $relation) { // make relation members up-to-date kolab_storage_config::resolve_members($relation); // remove and add links - $members = array_diff($relation['members'], (array)$remove); + $members = array($object_uri); $members = array_unique(array_merge($members, $links)); - // make sure the object_uri is still a member - if (!in_array($object_uri, $members)) { - $members[$object_uri]; - } - // remove relation if no other members remain if (count($members) <= 1) { $done = $this->delete($relation['uid']); @@ -768,7 +772,7 @@ class kolab_storage_config } // no changes, we're happy else { - $done = true; + $done = true; $links = array(); } } diff --git a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php index 885340ed..9de33dc4 100644 --- a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php +++ b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php @@ -1114,14 +1114,8 @@ class tasklist_kolab_driver extends tasklist_driver */ private function save_links($uid, $links) { - // make sure we have a valid array - if (empty($links)) { - $links = array(); - } - $config = kolab_storage_config::get_instance(); - $remove = array_diff($config->get_object_links($uid), $links); - return $config->save_object_links($uid, $links, $remove); + return $config->save_object_links($uid, (array) $links); } /**