• Модуль: 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,
	];
}