Query kolab_cache_configuration with category filter for better performance (#3286)
Warning: this requires DELETE FROM kolab_folders WHERE type = 'configuration';
This commit is contained in:
parent
afed2435d7
commit
e3d29617ae
6 changed files with 49 additions and 26 deletions
|
@ -1109,11 +1109,13 @@ class kolab_notes extends rcube_plugin
|
|||
{
|
||||
if (!isset($this->relations)) {
|
||||
$config = kolab_storage_config::get_instance();
|
||||
$filter = array(array('type', '=', 'relation'));
|
||||
$default = true;
|
||||
$data_filter = array('category' => 'generic');
|
||||
$filter = array(
|
||||
array('type', '=', 'relation'),
|
||||
array('category', '=', 'generic')
|
||||
);
|
||||
|
||||
$this->relations = $config->get_objects($filter, $default, $data_filter);
|
||||
$this->relations = $config->get_objects($filter, $default);
|
||||
}
|
||||
|
||||
if ($uid === null) {
|
||||
|
|
|
@ -293,7 +293,7 @@ function tag_form_dialog(id)
|
|||
|
||||
if (tag) {
|
||||
name_input.val(tag.name);
|
||||
color_input.val(tag.color.replace(/^#/, ''));
|
||||
color_input.val(tag.color ? tag.color.replace(/^#/, '') : '');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -41,11 +41,11 @@ class kolab_tags_backend
|
|||
$config = kolab_storage_config::get_instance();
|
||||
$default = true;
|
||||
$filter[] = array('type', '=', self::O_TYPE);
|
||||
$cat_filter = array('category' => self::O_CATEGORY);
|
||||
$filter[] = array('category', '=', self::O_CATEGORY);
|
||||
|
||||
// for performance reasons assume there will be no more than 100 tags (per-folder)
|
||||
|
||||
return $config->get_objects($filter, $default, $cat_filter, 100);
|
||||
return $config->get_objects($filter, $default, 100);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -208,8 +208,14 @@ class kolab_format_configuration extends kolab_format
|
|||
{
|
||||
$tags = array();
|
||||
|
||||
if ($this->data['type'] == 'dictionary') {
|
||||
switch ($this->data['type']) {
|
||||
case 'dictionary':
|
||||
$tags = array($this->data['language']);
|
||||
break;
|
||||
|
||||
case 'relation':
|
||||
$tags = array('category:' . $this->data['category']);
|
||||
break;
|
||||
}
|
||||
|
||||
return $tags;
|
||||
|
|
|
@ -37,4 +37,24 @@ class kolab_storage_cache_configuration extends kolab_storage_cache
|
|||
|
||||
return $sql_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method to compose a valid SQL query from pseudo filter triplets
|
||||
*/
|
||||
protected function _sql_where($query)
|
||||
{
|
||||
if (is_array($query)) {
|
||||
foreach ($query as $idx => $param) {
|
||||
// convert category filter
|
||||
if ($param[0] == 'category') {
|
||||
$param[2] = array_map(function($n) { return 'category:' . $n; }, (array) $param[2]);
|
||||
|
||||
$query[$idx][0] = 'tags';
|
||||
$query[$idx][2] = count($param[2]) > 1 ? $param[2] : $param[2][0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return parent::_sql_where($query);
|
||||
}
|
||||
}
|
|
@ -105,12 +105,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(), $limit = 0)
|
||||
public function get_objects($filter = array(), $default = false, $limit = 0)
|
||||
{
|
||||
$list = array();
|
||||
|
||||
|
@ -126,12 +125,6 @@ class kolab_storage_config
|
|||
}
|
||||
|
||||
foreach ($folder->select($filter) as $object) {
|
||||
foreach ($data_filter as $key => $val) {
|
||||
if ($object[$key] != $val) {
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
|
||||
$list[] = $object;
|
||||
}
|
||||
}
|
||||
|
@ -624,11 +617,13 @@ class kolab_storage_config
|
|||
public function get_tags($uid = '*')
|
||||
{
|
||||
if (!isset($this->tags)) {
|
||||
$filter = array(array('type', '=', 'relation'));
|
||||
$default = true;
|
||||
$data_filter = array('category' => 'tag');
|
||||
$filter = array(
|
||||
array('type', '=', 'relation'),
|
||||
array('category', '=', 'tag')
|
||||
);
|
||||
|
||||
$this->tags = $this->get_objects($filter, $default, $data_filter);
|
||||
$this->tags = $this->get_objects($filter, $default);
|
||||
}
|
||||
|
||||
if ($uid === '*') {
|
||||
|
|
Loading…
Add table
Reference in a new issue