• Модуль: biconnector
  • Путь к файлу: ~/bitrix/modules/biconnector/lib/service.php
  • Класс: BitrixBIConnectorService
  • Вызов: Service::getData
public function getData($tableName, $parameters)
{
	$tableInfo = $this->manager->getTableDescription($tableName, $this->languageId);
	$tableFields = $tableInfo['FIELDS'];

	$canBeFiltered = true;
	$sqlWhere = $tableInfo['FILTER'] ?? [];

	if (isset($parameters['dateRange']) && is_array($parameters['dateRange']))
	{
		$timeFilterColumn = $parameters['configParams']['timeFilterColumn'] ?? '';
		$this->applyDateFilter($sqlWhere, $tableFields, $parameters['dateRange'], $timeFilterColumn);
	}

	// https://developers.google.com/datastudio/connector/filters?hl=ru
	if (isset($parameters['dimensionsFilters']) && is_array($parameters['dimensionsFilters']))
	{
		$this->applyDimensionsFilters($sqlWhere, $canBeFiltered, $tableFields, $parameters['dimensionsFilters']);
	}

	$queryWhere = new CBIConnectorSqlBuilder;
	$queryWhere->SetFields($tableFields);
	if (isset($tableInfo['FILTER_FIELDS']))
	{
		$queryWhere->AddFields($tableInfo['FILTER_FIELDS']);
	}

	$strQueryWhere = '';
	if ($canBeFiltered && $sqlWhere)
	{
		$strQueryWhere = $queryWhere->GetQuery($sqlWhere);
	}

	$selectedFields = [];
	$concatFields = [];
	if (isset($parameters['fields']) && is_array($parameters['fields']))
	{
		foreach ($parameters['fields'] as $field)
		{
			$fieldName = trim($field['name'], " tnr");
			if ($fieldName && isset($tableFields[$fieldName]))
			{
				$tableField = $tableFields[$fieldName];
				if (
					(!isset($field['forFilterOnly']) || !$field['forFilterOnly'])
					|| !($strQueryWhere && $canBeFiltered)
				)
				{
					if (isset($tableField['CONCAT_KEY']))
					{
						$concatKey = $tableField['CONCAT_KEY'];
						$concatFields[$concatKey] = $tableFields[$concatKey];
						$concatFields[$concatKey]['ID'] = $concatKey;
					}
					$selectedFields[$fieldName] = $tableField;
				}
			}
			else
			{
				//TODO
			}
		}
		if (!$selectedFields)
		{
			return [
				'error' => 'EMPTY_SELECT_FIELDS_LIST',
			];
		}
	}
	else
	{
		$selectedFields = $tableFields;
	}

	$primaryFields = [];
	if ($concatFields)
	{
		foreach ($tableFields as $fieldName => $tableField)
		{
			if (isset($tableField['IS_PRIMARY']) && $tableField['IS_PRIMARY'] == 'Y')
			{
				$tableField['ID'] = $fieldName;
				$primaryFields[$fieldName] = $tableField;
			}
		}
	}

	foreach ($concatFields as $concatKey => $_)
	{
		if (isset($selectedFields[$concatKey]))
		{
			unset($concatFields[$concatKey]);
		}
	}

	foreach ($primaryFields as $primaryKey => $_)
	{
		if (isset($selectedFields[$primaryKey]))
		{
			unset($primaryFields[$primaryKey]);
		}
	}

	$shadowFields = array_merge($primaryFields, $concatFields);

	$queryWhere->SetSelect(array_merge($selectedFields, $shadowFields), static::$dateFormats);

	$additionalJoins = $queryWhere->GetJoins();
	$sql = "selectn  " . $queryWhere->GetSelect()
		. "nfromn  " . $tableInfo['TABLE_NAME'] . ' AS ' . $tableInfo['TABLE_ALIAS']
		. ($additionalJoins ? "n  " . $additionalJoins : '')
		. ($strQueryWhere ? "nWHERE " . $strQueryWhere : '')
		. "n";

	$i = 0;
	$fetchCallbacks = [];
	foreach (array_merge($selectedFields, $shadowFields) as $fieldInfo)
	{
		if (isset($fieldInfo['CALLBACK']))
		{
			$fetchCallbacks[$i] = $fieldInfo['CALLBACK'];
		}
		elseif ($fieldInfo['FIELD_TYPE'] === 'int')
		{
			$fetchCallbacks[$i] = function ($value, $dateFormats)
			{
				return $value === null ? null : (int)$value;
			};
		}
		$i++;
	}

	$schemaFields = $this->getTableFields($tableName);
	$schema = [];
	foreach ($selectedFields as $fieldName => $_)
	{
		foreach ($schemaFields as $fieldInfo)
		{
			if ($fieldName === $fieldInfo['ID'])
			{
				$schema[] = $fieldInfo;
			}
		}
	}

	if (isset($tableInfo['DICTIONARY']))
	{
		foreach ($tableInfo['DICTIONARY'] as $dictionaryId)
		{
			if (!BitrixBIConnectorDictionaryManager::validateCache($dictionaryId))
			{
				return [
					'error' => 'DICTIONARY_' . $dictionaryId . '_UPDATE',
				];
			}
		}
	}

	return [
		'schema' => $schema,
		'sql' => $sql,
		'filtersApplied' => $strQueryWhere && $canBeFiltered,
		'onAfterFetch' => $fetchCallbacks,
		'where' => $sqlWhere,
		'shadowFields' => $shadowFields,
	];
}