Данный документ описывает логику работы механизма сборки тела запроса для кубовых срезов (AssemblyQueryBody
), который отвечает за формирование исполняемого тела запроса. Этот механизм важен для аналитиков, так как он определяет, как ваши запросы, включающие ссылки на внешние источники данных (срезы и кубы), преобразуются в конкретные операции над данными.
AssemblyQueryBody
преобразует абстрактный запрос, который может содержать ссылки на срезы ($from
) и кубы ($cube
), в конкретный запрос, который оперирует непосредственно с внутренними представлениями данных ($views
). Он также обрабатывает параметры запроса и оптимизирует выбор источника данных для обеспечения максимальной эффективности.
- Обход запроса: Механизм рекурсивно обходит все части запроса, начиная с корневого. Для каждой части запроса выполняются следующие действия.
- Встраивание срезов:
- Замена ссылок: Когда в
$from
, $left
, $right
или $union
встречается ссылка на внешний срез, AssemblyQueryBody
выполняет следующие действия:
- Находит соответствующий срез в определении куба.
- Клонирует тело запроса этого среза.
- Добавляет его в
$views
корневого запроса, заменяя исходную ссылку на название этой вью.
- Поиск оптимального среза: Если в запросе не указан конкретный срез, а указан только куб (
$cube
) или производится замена среза (allowReplaceSlice = true
), механизм пытается найти наиболее подходящий срез среди доступных. Выбор среза производится на основе следующих критериев.
- Обработка запросов к кубу:
- Определение куба: Если запрос содержит
$cube
, AssemblyQueryBody
определяет соответствующий куб. Если $cube
отсутствует, то запрос определяется как запрос к пустому источнику данных ($from = {}
)
- Выбор лучшего среза: Ищется наиболее подходящий срез для замены
$cube
.
- Замена
$cube
на $from
: После выбора среза, $cube
заменяется на $from
, указывающий на выбранный срез.
- Добавление представления: Тело запроса выбранного среза добавляется в
$views
корневого запроса.
- Обработка параметров:
- Копирование параметров: Параметры из вложенных запросов накапливаются. Родительские параметры имеют приоритет.
- Обработка предопределенных параметров: Добавляются некоторые предопределенные параметры (системные и пользовательские).
- Обработка провайдеров:
- Оборачивание запрос: Если первичный источник не поддерживает операции с
$offset
или $limit
- запрос оборачивается специальным враппером.
- Сбор провайдеров: Собирается список используемых первичных источников и хранилищ.
Если в запросе указан $cube
или требуется заменить срез, движок определяет, какой срез из доступных лучше всего подходит.
Критерии выбора:
- Наличие всех необходимых полей: Срез должен содержать все поля, которые используются в запросе (с учетом контекста).
- Максимальное количество совпавших измерений: Из нескольких подходящих срезов выбирается тот, который содержит максимальное количество измерений, совпадающих с используемыми в запросе.
- Максимальное количество совпавших параметров: Из нескольких подходящих срезов с одинаковым количеством измерений выбирается тот, который содержит максимальное количество параметров, совпадающих с используемыми в запросе.
- Минимальная стоимость: Из нескольких подходящих срезов с одинаковым количеством измерений и параметров выбирается тот, который имеет минимальную стоимость (определяется функцией некоторой функцией, которая зависит от сложности структуры запроса).
Логика selectBestSlice
:
- Единственный срез: Если доступен только один срез, выбирается он.
- Фильтрация: Отбираются срезы, которые содержат все необходимые поля.
- Выбор по измерениям: Из оставшихся выбираются срезы с максимальным количеством совпавших измерений.
- Выбор по параметрам: Из оставшихся выбираются срезы с максимальным количеством совпавших параметров.
- Выбор по стоимости: Из оставшихся выбирается срез с наименьшей стоимостью.
- Ошибка: Если подходящий срез не найден, выбрасывается ошибка.
Особенности фильтрации срезов:
- Подсчитывается количество измерений, совпадающих с измерениями, используемыми в запросе.
- Подсчитывается количество параметров, совпадающих с параметрами, используемыми в запросе.
- Исключение срезов: Удаляются срезы, которые уже были встроены как родители.
- Фильтрация проводится сначала по измерениям и параметрам одновременно, затем если ничего не было найдено - по измерениям или параметрам.
- Срезы с большим количеством совпадений по измерениям и параметрам получают приоритет.
- Предупреждение: Если лучший срез экспортирует меньше измерений, чем используется в запросе - выводится предупреждение в лог.
Что это значит для аналитика:
- Вы можете ссылаться на срезы и кубы в своих запросах, не беспокоясь о деталях их реализации.
- Система автоматически найдет и подставит наиболее подходящий источник данных.
- Запросы автоматически оптимизируются на основе используемых полей, измерений, параметров и стоимости срезов.
- При указании
$entry
выбор срезов дополнительно сужается.
Механизм AssemblyQueryBody
значительно упрощает создание запросов, позволяя аналитикам сосредоточиться на бизнес-логике, не погружаясь в технические детали. Понимание описанных процессов поможет вам более эффективно использовать систему и писать более оптимизированные запросы.
Данное руководство описывает алгоритм, используемый в Cubisio для автоматического формирования тела запроса, включая встраивание срезов-источников и выбор наиболее подходящего среза для источника типа $cube
. Руководство предназначено для аналитиков, работающих с Cubisio и создающих запросы.
Процесс формирования тела запроса (встраивания срезов) происходит в несколько этапов:
- Обход запроса: Система рекурсивно обходит дерево запроса, начиная с корневого запроса (
rootQuery
).
- Поиск внешних источников: На каждом шаге обхода система проверяет наличие внешних источников данных:
- Срезы (slices): Источники, на которые ссылаются через
$from
, $left
, $right
, $union
.
- Кубы (cubes): Источники, указанные через
$cube
.
- Встраивание срезов: Если в запросе обнаружена ссылка на срез, система выполняет следующие действия:
- Находит определение среза в метаданных куба.
- Копирует тело запроса среза (
getQuery()
).
- Добавляет скопированное тело в
$views
корневого запроса, где ключом является имя среза ($from
, $left
, $right
, $union
- указанное ранее).
- Заменяет ссылку на срез в исходном запросе на ссылку на соответствующую вьюху во вьюхах rootQuery.
- Встраивание кубов:
- Если в запросе обнаружен
$cube
, производится поиск наиболее подходящего среза для источника.
- Наиболее подходящий срез копируется.
$cube
удаляется из запроса, вместо него устанавливается $from
- id наиболее подходящего среза.
- Копия тела среза добавляется в
rootQuery.$views
- Сбор параметров: В процессе обхода собираются параметры запроса (
$params
), в том числе параметры, указанные вложенных запросах. Параметры родительских запросов имеют приоритет. Фиксируются типы параметров.
- Сбор используемых измерений: Собирается список всех измерений, которые используются в фильтрах (
$cubeFilter
) в запросе.
- Корректировка источников:
$from
может принимать различные типы, в зависмости от типа источника. Система автоматически определяет этот тип и корректирует source:
Cube
: $from
=> $cube
.
Provider
: $from
=> $provider
.
Join
: $from
=> $join
.
Union
: $from
=> $union
.
Recursive
: $from
=> $recursive
.
Slice
: $from
=> $from
.
- Системные и пользовательские параметры:
- Добавление системных и пользовательских параметров из куба, которые небыли переопределены ранее.
- Замена параметров.
- Производится замена параметров в оригинальном запросе на объединённые.
- Добавление типов параметров.
- Добавляются типы параметров в
$params
.
Если в запросе указан источник типа $cube
, система автоматически выбирает наиболее подходящий срез, используя следующий алгоритм:
- Получение доступных срезов: Из метаданных куба извлекается список всех доступных срезов.
- Фильтрация по используемым полям: Срезы фильтруются по критерию наличия всех используемых в запросе полей.
- Система извлекает все выходные поля, необходимые в запросе.
- Срезы, не содержащие всех требуемых полей, исключаются.
- Фильтрация по контексту
- Учитывается
$context
поля, если указан. Срез должен содержать все поля, у которых $context
равен контексту запроса.
- Подсчет совпавших измерений: Для каждого оставшегося среза подсчитывается количество измерений, которые присутствуют как в срезе, так и в списке используемых измерений (собранных ранее).
- Подсчет параметров. Для каждого оставшегося среза подсчитывается количество параметров, которые есть и в срезе и в списке используемых параметров.
- Выбор по максимальному числу измерений и параметро. Система отбирает срезы с максимальным числом совпадений по измерениям и параметрам.
- Выбор по минимальной стоимости: Если срезов с максимальным числом измерений несколько, выбирается срез с минимальной стоимостью (
getCost()
), так как это означает его большую оптимальность с точки зрения производительности.
- Фильтрация по родительским срезам. Если текущий срез уже встроен в родительский запрос, то он исключается из кандидатов.
- Сужение кандидатов. Процедура
narrowSourceCandidates
среза.
- Ошибка: Если после всех этапов фильтрации не осталось ни одного среза, выбрасывается ошибка "Slice not found for cube source and fields".
- Явное указание срезов: Если требуется использовать конкретный срез, его нужно явно указать в
$from
(или $left
, $right
, $union
).
- Использование
$cube
: Если требуется, чтобы система сама выбрала наиболее подходящий срез, нужно указать источник через $cube
.
- Измерения в
$cubeFilter
: Если в $cubeFilter
используются измерения, система будет учитывать их при выборе среза.
- Выходные поля Не забывайте, что при выборе среза учитываются все выходные поля. Если у вас используются какие-либо выходные поля, их нужно добавить в срез или использовать другой источник.
- Параметры. Чем больше параметров содержит срез, тем предпочтительнее он будет выбран.
- Контекст полей. Учитывайте контекст полей, он должен совпадать.
- По возможности используйте явное указание срезов, если требуется работа с конкретным срезом.
- При необходимости автоматического выбора среза с помощью
$cube
, убедитесь, что необходимые измерения и поля есть в хотя бы одном срезе.
- Используйте именование полей с учетом контекста.
Следуя этому руководству, аналитики смогут более эффективно использовать возможности автоматической сборки запросов и выбора срезов в Cubisio.