- Модуль: tasks
- Путь к файлу: ~/bitrix/modules/tasks/classes/general/task.php
- Класс: CTasks
- Вызов: CTasks::tryOptimizeFilter
static function tryOptimizeFilter(array $filter, $sourceTableAlias = 'T', $joinTableAlias = 'TM')
{
$additionalJoins = [];
$roleKey = '::SUBFILTER-ROLEID';
$joinAlias = $joinTableAlias;
$sourceAlias = $sourceTableAlias;
// get rid of ::SUBFILTER-ROOT if can
if (array_key_exists('::SUBFILTER-ROOT', $filter) && count($filter) == 1)
{
// we have only one element in the root, and logic is not "OR". then we could remove subfilter-root
$filter = $filter['::SUBFILTER-ROOT'];
}
// we can optimize only if there is no "or-logic"
if (
(!array_key_exists('::LOGIC', $filter) || $filter['::LOGIC'] !== 'OR')
&& (!array_key_exists('LOGIC', $filter) || $filter['LOGIC'] !== 'OR')
)
{
// MEMBER
if (
array_key_exists('MEMBER', $filter)
|| isset($filter[$roleKey])
&& array_key_exists('MEMBER', $filter[$roleKey])
)
{
if (array_key_exists('MEMBER', $filter))
{
$member = intval($filter['MEMBER']);
unset($filter['MEMBER']);
}
else
{
$member = intval($filter[$roleKey]['MEMBER']);
unset($filter[$roleKey]);
}
$additionalJoins[] = "INNER JOIN b_tasks_member {$joinAlias} ON {$joinAlias}.TASK_ID = {$sourceAlias}.ID AND {$joinAlias}.USER_ID = {$member}";
}
// DOER
elseif (array_key_exists('DOER', $filter))
{
$doer = intval($filter['DOER']);
unset($filter['DOER']);
$additionalJoins[] = "INNER JOIN b_tasks_member {$joinAlias} ON {$joinAlias}.TASK_ID = {$sourceAlias}.ID AND {$joinAlias}.USER_ID = {$doer} AND {$joinAlias}.TYPE in ('R', 'A')";
}
// RESPONSIBLE
elseif (isset($filter[$roleKey]) && array_key_exists('=RESPONSIBLE_ID', $filter[$roleKey]))
{
$responsible = (int)$filter[$roleKey]['=RESPONSIBLE_ID'];
unset($filter[$roleKey]);
$additionalJoins[] = "INNER JOIN b_tasks_member {$joinAlias} ON {$joinAlias}.TASK_ID = {$sourceAlias}.ID AND {$joinAlias}.USER_ID = {$responsible} AND {$joinAlias}.TYPE = 'R'";
}
// CREATOR
elseif (isset($filter[$roleKey]) && array_key_exists('=CREATED_BY', $filter[$roleKey]))
{
$creator = (int)$filter[$roleKey]['=CREATED_BY'];
unset($filter[$roleKey]['=CREATED_BY']);
if (!empty($filter[$roleKey]))
{
$filter += $filter[$roleKey];
}
unset($filter[$roleKey]);
$additionalJoins[] = "INNER JOIN b_tasks_member {$joinAlias} ON {$joinAlias}.TASK_ID = {$sourceAlias}.ID AND {$joinAlias}.USER_ID = {$creator} AND {$joinAlias}.TYPE = 'O'";
}
// ACCOMPLICE
elseif (
array_key_exists('ACCOMPLICE', $filter)
|| isset($filter[$roleKey])
&& array_key_exists('=ACCOMPLICE', $filter[$roleKey])
)
{
if (array_key_exists('ACCOMPLICE', $filter))
{
if (!is_array($filter['ACCOMPLICE'])) // we have single value, not array which will cause "in ()" instead of =
{
$accomplice = intval($filter['ACCOMPLICE']);
unset($filter['ACCOMPLICE']);
$additionalJoins[] = "INNER JOIN b_tasks_member {$joinAlias} ON {$joinAlias}.TASK_ID = {$sourceAlias}.ID AND {$joinAlias}.USER_ID = {$accomplice} AND {$joinAlias}.TYPE = 'A'";
}
}
else
{
if (!is_array($filter[$roleKey]['=ACCOMPLICE']))
{
$accomplice = intval($filter[$roleKey]['=ACCOMPLICE']);
unset($filter[$roleKey]);
$additionalJoins[] = "INNER JOIN b_tasks_member {$joinAlias} ON {$joinAlias}.TASK_ID = {$sourceAlias}.ID AND {$joinAlias}.USER_ID = {$accomplice} AND {$joinAlias}.TYPE = 'A'";
}
}
}
// AUDITOR
elseif (
array_key_exists('AUDITOR', $filter)
|| isset($filter[$roleKey])
&& array_key_exists('=AUDITOR', $filter[$roleKey])
)
{
if (array_key_exists('AUDITOR', $filter))
{
if (!is_array($filter['AUDITOR'])) // we have single value, not array which will cause "in ()" instead of =
{
$auditor = intval($filter['AUDITOR']);
unset($filter['AUDITOR']);
$additionalJoins[] = "INNER JOIN b_tasks_member {$joinAlias} ON {$joinAlias}.TASK_ID = {$sourceAlias}.ID AND {$joinAlias}.USER_ID = {$auditor} AND {$joinAlias}.TYPE = 'U'";
}
}
else
{
if (!is_array($filter[$roleKey]['=AUDITOR']))
{
$auditor = intval($filter[$roleKey]['=AUDITOR']);
unset($filter[$roleKey]);
$additionalJoins[] = "INNER JOIN b_tasks_member {$joinAlias} ON {$joinAlias}.TASK_ID = {$sourceAlias}.ID AND {$joinAlias}.USER_ID = {$auditor} AND {$joinAlias}.TYPE = 'U'";
}
}
}
}
return [
'FILTER' => $filter,
'JOINS' => $additionalJoins,
];
}