Язык запросов в формате 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
: Текущая дата.$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
запроса или источников.