Язык запросов в формате JSON предназначен для выполнения операций над данными, аналогично SQL. Он предоставляет структурированный способ описания запросов, включая выборку данных, фильтрацию, группировку, сортировку и агрегацию. Ниже приведено подробное описание основных компонентов языка.
Основной запрос в Cubisio представлен объектом, который содержит ключевые поля, такие как $from, $filter, $select, $groupBy, $sort и другие. Пример структуры:
{
"$from": { ... }, // Источник данных
"$filter": { ... }, // (Опционально) Условия фильтрации
"$select": { ... }, // Выходные поля
"$groupBy": [ ... ], // (Опционально) Группировка
"$sort": [ ... ], // (Опционально) Сортировка
"$distinct": true, // (Опционально) Удаление дубликатов
"$postFilter": { ... }, // (Опционально) Условие фильтрации результата
"$context": "..." // Контекст запроса
"$limit": 100, // (Опционально) Ограничение выборки
"$offset": 0 // (Опционально) Пропуск элементов
"$params": { ... }, // (Опционально) Параметры запроса
"$views": { ... } // (Опционально) Именованные представления (CTE)
}
$from:
$slice:
$cube:
$join:
$joinType (например, inner, left, right).$union:
$provider:
$recursive:
$filter:
$and, $or, $not) и операторы сравнения ($eq, $lt, $gt и т.д.).$select:
$over и подзапросы $select с единственным выходным полем).$groupBy:
$groupBy равнозначно его включению как значени для $group при использовании внутри $select.$sort:
$params:
$defaultValue.null, то значие заменяет ранее заданные в источниках.$limit и $offset:
$context:
Поля и выражения используются для работы с данными внутри запроса.
$field:
{ "$field": "Имя_поля" }.{ "$field": "дата_1", "$sourceContext": "идентификатор_среза_1" }$const:
{ "$const": 42 }.{ "$const": 42, $type: "number" }.{ "$const": 42, $type: "number", $nativeType: "Nullable(Int)" }.$param:
{ "$param": "${имя_параметра}" }.Пример запроса, который объединяет данные из двух срезов, фильтрует их и выполняет агрегацию:
{
"$from": {
"$join": {
"$left": {
"$slice": "идентификатор_среза_1"
},
"$right": {
"$slice": "идентификатор_среза_2"
},
"$filter": {
"$and": [
{
"$eq": [
{ "$field": "поле_1", "$sourceContext": "идентификатор_среза_1" },
{ "$field": "поле_2", "$sourceContext": "идентификатор_среза_2" }
]
}
]
},
"$joinType": "inner"
}
},
"$filter": {
"$gt": [
{ "$field": "дата_1", "$sourceContext": "идентификатор_среза_1" },
{ "$field": "дата_2", "$sourceContext": "идентификатор_среза_2" }
]
},
"$select": {
"поле_1": { "$group": { "$field": "поле_1", "$sourceContext": "идентификатор_среза_1" } },
"сумма": { "$sum": { "$field": "значение", "$sourceContext": "идентификатор_среза_2" } }
}
}
Операторы начинаются с символа $ и используются для выполнения различных операций. Они могут быть условными, математическими, строковыми, агрегирующими и т.д. Все аргументы операторов так же начинаются с $.
Логические и условные операторы используются для создания условий фильтрации:
$and: Логическое "И".$or: Логическое "ИЛИ".$not: Логическое "НЕ".$eq: Равно.$ne: Не равно.$gt: Больше.$lt: Меньше.$gte: Больше или равно.$lte: Меньше или равно.Условия сравнения используются для фильтрации данных:
Пример:
"$filter": {
"$and": [
{ "$gt": [{"$field": "field1"}, {"$const": 20}] },
{ "$not": { "$lt": [{"$field": "field1"}, {"$const": 20}] } },
]
}
$add: Сложение.$sub: Вычитание.$mul: Умножение.$div: Деление.$divz: Деление с игнорированием нуля в знаменателе.$mod: Деление по модулю.$pow: Возведение в степень.$pow2: Возведение в квадрат.$sqrt: Квадратный корень.$abs: Абсолютное значение.$round: Округление.$round2: Точное округление.$floor: Ближайшее меньшее целое.$ceil: Ближайшее большее целое.$greatest: Максимальное значение из списка.$least: Минимальное значение из списка.Для работы со строками доступны следующие функции:
$like: Поиск по шаблону (с учетом регистра).$ilike: Поиск по шаблону (без учета регистра).$in: Проверка на вхождение в массив.$nin: Проверка на отсутствие в массиве.$regexp: Поиск по регулярному выражению.$replace: Замена подстроки.$regexpReplace: Замена по шаблону.$regexpMatches: Извлечение по шаблону.$lowerCase: Преобразование к нижнему регистру.$upperCase: Преобразование к верхнему регистру.$titleCase: Каждое слово с заглавной буквы.$trim: Удаление пробелов.$substring: Извлечение подстроки.$splitString: Разделение строки на массив.$concat: Склеивание строк.$concatStringsArray: Склеивание массива строк.$stringLength: Длина строки.$extractNumber: Извлечение числа из строки.$md5: Вычисление MD5 хэша строки.$similarity: Вычисление степени похожести строк.Пример:
"$filter": {
"$like": [{"$field": "field1"}, { "$const": "%текст%" } ]
}
Функции для работы с датами и временем:
$dateYear: Извлечение года.$dateMonth: Извлечение месяца.$dateMonthDay: Извлечение дня месяца.$dateWeekDay: Извлечение дня недели.$dateYearDay: Извлечение дня в году.$dateTotalSeconds: Извлечение секунд с 1970-01-01.$timeHour: Извлечение часа.$timeMinute: Извлечение минут.$timeSecond: Извлечение секунд.$dateIntervalOrder: Разбиение даты на интервалы.$dateFormat: Форматирование даты.$timeZone: Преобразование часового пояса.$dateNow: Текущая дата.$datetimeNow: Текущая дата-время.$timestampNow: Текущая временная метка.Пример:
"$select": {
"current_year": { "$dateYear": {"$field": "field1"} }
}
Агрегатные функции используются для вычисления значений на группах данных:
$count: Количество элементов.$sum: Сумма значений.$avg: Среднее значение.$min: Минимальное значение.$max: Максимальное значение.$first: Первое значение в группе.$last: Последнее значение в группе.$firstNotNull: Первое не NULL значение.$lastNotNull: Последнее не NULL значение.$any: Любое значение в группе.$corr: Коэффициент корреляции.$array: Все элементы группы в массив.$concatStrings: Склеивание строк группы через разделитель.Пример:
"$select": {
"total_sum": { "$sum": {"$field": "field1"} }
}
Глобальные агрегатные функции игнорируют группировку и работают со всеми данными (все строки будут содержать одно значение):
$gcount: Глобальное количество.$gsum: Глобальная сумма.$gavg: Глобальное среднее.$gmin: Глобальный минимум.$gmax: Глобальный максимум.Пример:
"$select": {
"global_max": { "$gmax": {"$field": "field1"} }
}
Операторв агрегации над группами позволяют выполнять агрегационные вычисления не только внутри одной группы, но и между группами данных. (все строки будут содержать одно значение):
$grmin: Принимает значение агрегирующего оператора и возвращает минимальное значение.$grmax: Принимает значение агрегирующего оператора и возвращает максимальное значение.$gravg: Принимает значение агрегирующего оператора и возвращает среднее значение.$grmaxcount: Принимает не агрегированное значение и возвращает максимальное среди результатов суммирования по группам.$grmaxsum: Принимает не агрегированное значение и возвращает максимальное среди результатов суммирования по группам.$grmaxavg: Принимает не агрегированное значение и возвращает среднее среди результатов суммирования по группам.{
"$gravg": {
"$sum": {
"$field": "Значение",
"$sourceContext": "контекст_источника"
}
}
}
Для обхода деревьев и иерархических структур при подсчёте значения используется оператор:
$recursiveSelect: Рекурсивная агрегация.Пример:
"$select": {
"recursive_result": { "$recursiveSelect": { ... } }
}
Функции для работы с оконными выражениями:
$over: Оконная функция.$rowNumber: Нумерация строк.$accumulateSum: Агрегирование с накоплением.Пример:
"$select": {
"row_number": { "$rowNumber": true }
}
Для работы с массивами доступны следующие функции:
$arrayElement: Получение элемента массива по индексу.$arrayAppend: Добавление элемента в конец массива.$arrayPrepend: Добавление элемента в начало массива.$expandArray: Разложение массива на множество элементов.$expandNullArray: Разложение массива с добавлением NULL.$flatArray: Объединение массивов группы в один массив.$concatArray: Формирование массива из заданных значений.$arrayWithoutNulls: Массив без NULL-значений.Пример:
"$select": {
"expanded_array": { "$expandArray": {"$field": "field1"} }
}
Функции преобразования типов позволяют изменять тип данных:
$toInt: Преобразование к целому числу.$toLong: Преобразование к целому числу двойной размерности.$toDouble: Преобразование к числу с плавающей точкой.$toNumeric: Преобразование к числу с фиксированной точностью.$toBoolean: Преобразование к логическому типу.$toDate: Преобразование к дате.$toTimestamp: Преобразование к временной метке.$toString: Преобразование к строке.$toBinary: Преобразование к массиву байт.$toJson: Преобразование к JSON.Пример:
"$select": {
"numeric_value": { "$toInt": {"$field": "field1"} }
}
$random: Произвольное число.$randomUUID: Генерация UUID.$coalesce: Первое не NULL значение.$if: Условное выражение.$switch: Выбор по значению.$sql: Прямая вставка SQL-выражения.$complexRegexpReplace: Комплексная замена строк.Для работы с JSON-данными доступны следующие функции:
$jsonGet: Извлечение элемента по пути.$toJson: Преобразование к JSON.Пример:
"$select": {
"json_value": { "$jsonGet": { "$value": {"$field": "field1"}, "$path": ["key"] } }
}
Если встроенные операторы языка запросов не поддерживают необходимую функциональность, можно использовать оператор $sql для прямой вставки в запрос выражение на SQL.
Аргументы оператора $sql:
$sqlExpr: Содержит SQL-выражение, которое будет вставлено в запрос.$values: Массив значений или выражений, которые будут подставлены в SQL-выражение. Используется для выражений-вставок (например, ${0}, ${1} или ${param}).$type: Указывает тип результата SQL-выражения. Может принимать значения, такие как string, number, boolean и т.д.$nativeType (опционально): Указывает тип результата на диалекте СУБД. Это поле используется для точной настройки типа данных в зависимости от используемой СУБД.{
"$sql": {
"$sqlExpr": "${0} * ${param} - ${1}",
"$values": [
{ "$const": 18 },
{ "$field": "field" }
],
"$type": "number"
}
}
Здесь:
${0} заменяется на значение 18.${1} заменяется на значение поля.${param} заменяется на значение соответствующего параметра в $params запроса или источников.