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