• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/orm/query/query.php
  • Класс: Bitrix\Main\ORM\Query\Query
  • Вызов: Query::buildGroup
protected function buildGroup()
{
	$sql = array();

	if ($this->hasAggregation())
	{
		// add non-aggr fields to group
		foreach ($this->global_chains as $chain)
		{
			$alias = $chain->getAlias();

			// skip constants
			if ($chain->isConstant())
			{
				continue;
			}

			if (isset($this->select_chains[$alias]) || isset($this->order_chains[$alias]) || isset($this->having_chains[$alias]))
			{
				if (isset($this->group_chains[$alias]))
				{
					// skip already grouped
					continue;
				}
				elseif (!$chain->hasAggregation() && !$chain->hasSubquery())
				{
					// skip subqueries and already aggregated
					$this->registerChain('group', $chain);
				}
				elseif (!$chain->hasAggregation() && $chain->hasSubquery() && $chain->getLastElement()->getValue() instanceof ExpressionField)
				{
					// but include build_from of subqueries
					$sub_chains = $chain->getLastElement()->getValue()->getBuildFromChains();

					foreach ($sub_chains as $sub_chain)
					{
						// build real subchain starting from init entity
						$real_sub_chain = clone $chain;

						foreach (array_slice($sub_chain->getAllElements(), 1) as $sub_chain_elem)
						{
							$real_sub_chain->addElement($sub_chain_elem);
						}

						// add to query
						$this->registerChain('group', $this->global_chains[$real_sub_chain->getAlias()]);
					}
				}
			}
			elseif (isset($this->having_expr_chains[$alias]))
			{
				if (!$chain->hasAggregation() && $chain->hasSubquery())
				{
					$this->registerChain('group', $chain);
				}
			}
		}
	}

	foreach ($this->group_chains as $chain)
	{
		$connection = $this->entity->getConnection();
		$sqlDefinition = $chain->getSqlDefinition();
		$valueField = $chain->getLastElement()->getValue();

		if ($valueField instanceof ExpressionField)
		{
			$valueField = $valueField->getValueField();
		}

		if (($connection instanceof Main\DB\OracleConnection || $connection instanceof Main\DB\MssqlConnection)
			&& $valueField instanceof TextField)
		{
			// softTextCast
			$sqlDefinition = $connection->getSqlHelper()->softCastTextToChar($sqlDefinition);
		}

		$sql[] = $sqlDefinition;
	}

	return join(', ', $sql);
}