chg: [internal] Optimise fetching events by tags

pull/7908/head
Jakub Onderka 2021-10-30 15:34:51 +02:00
parent 9855fc5ced
commit ab432a02d6
4 changed files with 54 additions and 39 deletions

View File

@ -1702,7 +1702,7 @@ class Attribute extends AppModel
}
} else {
foreach ($args as $arg) {
if (substr($arg, 0, 1) == '!') {
if ($arg[0] === '!') {
$result[1][] = substr($arg, 1);
} else {
$result[0][] = $arg;

View File

@ -5807,7 +5807,7 @@ class Event extends AppModel
} else {
$filters = array();
$args = $this->Attribute->dissectArgs($tagRules);
$tagArray = $this->EventTag->Tag->fetchEventTagIds($args[0], $args[1]);
$tagArray = $this->EventTag->fetchEventTagIds($args[0], $args[1]);
if (!empty($tagArray[0])) {
$filters[] = ['OR' => ['Event.id' => $tagArray[0]]];
} else {

View File

@ -141,6 +141,50 @@ class EventTag extends AppModel
return false;
}
/**
* Find all of the event Ids that belong to the accepted tags and the rejected tags
* @param array $accept
* @param array $reject
* @return array[]
*/
public function fetchEventTagIds(array $accept = array(), array $reject = array())
{
$acceptIds = array();
$rejectIds = array();
if (!empty($accept)) {
$acceptIds = $this->findEventIdsByTagNames($accept);
if (empty($acceptIds)) {
$acceptIds = [-1];
}
}
if (!empty($reject)) {
$rejectIds = $this->findEventIdsByTagNames($reject);
}
return array($acceptIds, $rejectIds);
}
/**
* @param array $tagIdsOrNames
* @return array|int|null
*/
private function findEventIdsByTagNames(array $tagIdsOrNames)
{
$conditions = [];
foreach ($tagIdsOrNames as $tagIdOrName) {
if (is_numeric($tagIdOrName)) {
$conditions[] = array('Tag.id' => $tagIdOrName);
} else {
$conditions[] = array('LOWER(Tag.name)' => mb_strtolower($tagIdOrName));
}
}
return $this->find('column', array(
'recursive' => -1,
'contain' => 'Tag',
'conditions' => ['OR' => $conditions],
'fields' => ['EventTag.event_id'],
));
}
public function getSortedTagList($context = false)
{
$conditions = array();

View File

@ -237,21 +237,14 @@ class Tag extends AppModel
return $results;
}
// find all of the event Ids that belong to the accepted tags and the rejected tags
public function fetchEventTagIds($accept = array(), $reject = array())
/**
* @param array $accept
* @param array $reject
* @deprecated Use EventTag::fetchEventTagIds instead
*/
public function fetchEventTagIds($accept, $reject)
{
$acceptIds = array();
$rejectIds = array();
if (!empty($accept)) {
$acceptIds = $this->findEventIdsByTagNames($accept);
if (empty($acceptIds)) {
$acceptIds[] = -1;
}
}
if (!empty($reject)) {
$rejectIds = $this->findEventIdsByTagNames($reject);
}
return array($acceptIds, $rejectIds);
$this->EventTag->fetchEventTagIds($accept, $reject);
}
// find all of the tag Ids that belong to the accepted tags and the rejected tags
@ -314,29 +307,7 @@ class Tag extends AppModel
return array_values($tag_ids);
}
private function findEventIdsByTagNames($array)
{
$ids = array();
foreach ($array as $a) {
if (is_numeric($a)) {
$conditions['OR'][] = array('id' => $a);
} else {
$conditions['OR'][] = array('LOWER(name) like' => strtolower($a));
}
}
$params = array(
'recursive' => 1,
'contain' => 'EventTag',
'conditions' => $conditions
);
$result = $this->find('all', $params);
foreach ($result as $tag) {
foreach ($tag['EventTag'] as $eventTag) {
$ids[] = $eventTag['event_id'];
}
}
return $ids;
}
/**
* @param array $tag