Fix performance of fetching configuration and relation objects (skip count query)
This commit is contained in:
parent
8fe64d7400
commit
6f8f485c87
3 changed files with 38 additions and 5 deletions
|
@ -152,7 +152,7 @@ class kolab_config extends rcube_plugin
|
||||||
|
|
||||||
$query = array(array('type','=',self::O_TYPE), array('tags','=',$lang));
|
$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 ($object['language'] == $lang || $object['language'] == 'XX') {
|
||||||
if (is_array($this->dicts[$lang]))
|
if (is_array($this->dicts[$lang]))
|
||||||
$this->dicts[$lang]['e'] = array_merge((array)$this->dicts[$lang]['e'], $object['e']);
|
$this->dicts[$lang]['e'] = array_merge((array)$this->dicts[$lang]['e'], $object['e']);
|
||||||
|
|
|
@ -43,7 +43,9 @@ class kolab_tags_backend
|
||||||
$filter[] = array('type', '=', self::O_TYPE);
|
$filter[] = array('type', '=', self::O_TYPE);
|
||||||
$cat_filter = array('category' => self::O_CATEGORY);
|
$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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -94,10 +94,11 @@ class kolab_storage_config
|
||||||
* @param array $filter Search filter
|
* @param array $filter Search filter
|
||||||
* @param bool $default Enable to get objects only from default folder
|
* @param bool $default Enable to get objects only from default folder
|
||||||
* @param array $data_filter Additional object data filter
|
* @param array $data_filter Additional object data filter
|
||||||
|
* @param int $limit Max. number of records (per-folder)
|
||||||
*
|
*
|
||||||
* @return array List of objects
|
* @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();
|
$list = array();
|
||||||
|
|
||||||
|
@ -107,6 +108,11 @@ class kolab_storage_config
|
||||||
continue;
|
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 ($folder->select($filter) as $object) {
|
||||||
foreach ($data_filter as $key => $val) {
|
foreach ($data_filter as $key => $val) {
|
||||||
if ($object[$key] != $val) {
|
if ($object[$key] != $val) {
|
||||||
|
@ -121,6 +127,28 @@ class kolab_storage_config
|
||||||
return $list;
|
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
|
* Create/update configuration object
|
||||||
*
|
*
|
||||||
|
@ -151,8 +179,12 @@ class kolab_storage_config
|
||||||
*/
|
*/
|
||||||
public function delete($uid)
|
public function delete($uid)
|
||||||
{
|
{
|
||||||
|
if (!$this->enabled) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// fetch the object to find folder
|
// fetch the object to find folder
|
||||||
$list = $this->get_objects(array(array('uid', '=', $uid)));
|
$list = $this->get_object($uid);
|
||||||
$object = $list[0];
|
$object = $list[0];
|
||||||
|
|
||||||
if (!$object) {
|
if (!$object) {
|
||||||
|
@ -313,5 +345,4 @@ class kolab_storage_config
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue