From 6f8f485c877210c4f2f030b33ef6dda39d65887f Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sun, 3 Aug 2014 09:02:48 -0400 Subject: [PATCH] Fix performance of fetching configuration and relation objects (skip count query) --- plugins/kolab_config/kolab_config.php | 2 +- plugins/kolab_tags/lib/kolab_tags_backend.php | 4 +- plugins/libkolab/lib/kolab_storage_config.php | 37 +++++++++++++++++-- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/plugins/kolab_config/kolab_config.php b/plugins/kolab_config/kolab_config.php index d3e66367..60fc4cf2 100644 --- a/plugins/kolab_config/kolab_config.php +++ b/plugins/kolab_config/kolab_config.php @@ -152,7 +152,7 @@ class kolab_config extends rcube_plugin $query = array(array('type','=',self::O_TYPE), array('tags','=',$lang)); - foreach ($this->config->get_objects($query, $default) as $object) { + foreach ($this->config->get_objects($query, $default, null, 100) as $object) { if ($object['language'] == $lang || $object['language'] == 'XX') { if (is_array($this->dicts[$lang])) $this->dicts[$lang]['e'] = array_merge((array)$this->dicts[$lang]['e'], $object['e']); diff --git a/plugins/kolab_tags/lib/kolab_tags_backend.php b/plugins/kolab_tags/lib/kolab_tags_backend.php index 032215db..519f962f 100644 --- a/plugins/kolab_tags/lib/kolab_tags_backend.php +++ b/plugins/kolab_tags/lib/kolab_tags_backend.php @@ -43,7 +43,9 @@ class kolab_tags_backend $filter[] = array('type', '=', self::O_TYPE); $cat_filter = array('category' => self::O_CATEGORY); - return $config->get_objects($filter, $default, $cat_filter); + // for performance reasons assume there will be no more than 100 tags (per-folder) + + return $config->get_objects($filter, $default, $cat_filter, 100); } /** diff --git a/plugins/libkolab/lib/kolab_storage_config.php b/plugins/libkolab/lib/kolab_storage_config.php index d253abaf..f5b891d4 100644 --- a/plugins/libkolab/lib/kolab_storage_config.php +++ b/plugins/libkolab/lib/kolab_storage_config.php @@ -94,10 +94,11 @@ class kolab_storage_config * @param array $filter Search filter * @param bool $default Enable to get objects only from default folder * @param array $data_filter Additional object data filter + * @param int $limit Max. number of records (per-folder) * * @return array List of objects */ - public function get_objects($filter = array(), $default = false, $data_filter = array()) + public function get_objects($filter = array(), $default = false, $data_filter = array(), $limit = 0) { $list = array(); @@ -107,6 +108,11 @@ class kolab_storage_config continue; } + // for better performance it's good to assume max. number of records + if ($limit) { + $folder->set_order_and_limit(null, $limit); + } + foreach ($folder->select($filter) as $object) { foreach ($data_filter as $key => $val) { if ($object[$key] != $val) { @@ -121,6 +127,28 @@ class kolab_storage_config return $list; } + /** + * Get configuration object + * + * @param string $uid Object UID + * @param bool $default Enable to get objects only from default folder + * + * @return array Object data + */ + public function get_object($uid, $default = false) + { + foreach ($this->folders as $folder) { + // we only want to read from default folder + if ($default && !$folder->default) { + continue; + } + + if ($object = $folder->get_object($uid)) { + return $object; + } + } + } + /** * Create/update configuration object * @@ -151,8 +179,12 @@ class kolab_storage_config */ public function delete($uid) { + if (!$this->enabled) { + return false; + } + // fetch the object to find folder - $list = $this->get_objects(array(array('uid', '=', $uid))); + $list = $this->get_object($uid); $object = $list[0]; if (!$object) { @@ -313,5 +345,4 @@ class kolab_storage_config ); } } - }