• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/orm/fields/expressionfield.php
  • Класс: Bitrix\Main\ORM\Fields\ExpressionField
  • Вызов: ExpressionField::removeSubqueryBody
static function removeSubqueryBody($query)
{
	$subqPattern = '\(\s*SELECT\s+';

	$matches = null;
	preg_match('/' . $subqPattern . '/i', $query, $matches);

	if (!empty($matches))
	{
		$substring = $matches[0];

		$subqPosition = mb_strpos($query, $substring);
		$subqStartPosition = $subqPosition + mb_strlen($substring);

		$bracketsCount = 1;
		$currentPosition = $subqStartPosition;

		// until initial bracket is closed
		while ($bracketsCount > 0)
		{
			$symbol = mb_substr($query, $currentPosition, 1);

			if ($symbol == '')
			{
				// end of string
				break;
			}

			if ($symbol == '(')
			{
				$bracketsCount++;
			}
			elseif ($symbol == ')')
			{
				$bracketsCount--;
			}

			$currentPosition++;
		}

		$query = mb_substr($query, 0, $subqPosition).mb_substr($query, $currentPosition);
	}

	return $query;
}