• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/orm/query/query.php
  • Класс: Bitrix\Main\ORM\Query\Query
  • Вызов: Query::query
protected function query($query)
{
	// check nosql configuration
	$connection = $this->entity->getConnection();
	$configuration = $connection->getConfiguration();

	/** @var Main\DB\Result $result */
	$result = null;

	if (isset($configuration['handlersocket']['read']))
	{
		// optimize through nosql
		$nosqlConnectionName = $configuration['handlersocket']['read'];

		$nosqlConnection = Main\Application::getInstance()->getConnectionPool()->getConnection($nosqlConnectionName);
		$isNosqlCapable = NosqlPrimarySelector::checkQuery($nosqlConnection, $this);

		if ($isNosqlCapable)
		{
			$nosqlResult = NosqlPrimarySelector::relayQuery($nosqlConnection, $this);
			$result = new Main\DB\ArrayResult($nosqlResult);

			// add data converters
			if (!empty($nosqlResult))
			{
				/** @var callable[] $converters */
				$converters = [];

				foreach ($this->getSelectChains() as $selectChain)
				{
					$field = $selectChain->getLastElement()->getValue();

					if ($field instanceof ScalarField)
					{
						$converter = $connection->getSqlHelper()->getConverter($field);

						if (is_callable($converter))
						{
							$converter[$selectChain->getAlias()] = $converter;
						}
					}
				}

				if (!empty($converters))
				{
					$result->setConverters($converters);
				}
			}
		}
	}

	if ($result === null)
	{
		// regular SQL query
		$result = $connection->query($query);
		$result->setReplacedAliases($this->replaced_aliases);

		if($this->countTotal)
		{
			if ($this->limit && ($result->getSelectedRowsCount() < $this->limit))
			{
				// optimization for first and last pages
				$result->setCount((int) $this->offset + $result->getSelectedRowsCount());
			}
			elseif (empty($this->limit))
			{
				// optimization for queries without limit
				$result->setCount($result->getSelectedRowsCount());
			}
			else
			{
				// dedicated query
				$result->setCount($this->queryCountTotal());
			}
		}

		static::$last_query = $query;
	}

	if ($this->isFetchModificationRequired())
	{
		$result->addFetchDataModifier(array($this, 'fetchDataModificationCallback'));
	}

	return $result;
}