Понятен человеку
Интуитивный SQL-подобный синтаксис для разработчиков плюс дерево запроса YAML/JSON (TugQT) для инструментов — каждый может проверить и изменить его.
TugQL — переносимый, человекочитаемый язык запросов. Он сочетает чистый SQL-подобный синтаксис с эквивалентным представлением 1:1 без потерь в виде дерева запросов (TugQT), сериализуемого в обычный YAML/JSON. Сохраняйте запрос, редактируйте вручную, просматривайте diff в Git и выполняйте на различных хранилищах без потерь данных.
from users as u
select
u.name,
u.age as years
where
u.age >= 18
and (u.status in ('active', 'pending') or u.country == 'US')
order by
u.name,
u.age desc
limit 10
offset 20
TugQL превращает запрос в понятный, версионируемый документ, который можно хранить, рецензировать и сравнивать — переносимый на любой бекенд.
Интуитивный SQL-подобный синтаксис для разработчиков плюс дерево запроса YAML/JSON (TugQT) для инструментов — каждый может проверить и изменить его.
Каноническая нормализация восстанавливает запросы, структурно идентичные исходным. Ничто не отбрасывается и не искажается втихую.
Опубликовано с полной валидацией через JSON Schema (draft 2020-12). Любой инструмент на любом языке может проверить структуру запроса перед выполнением.
Каноническое форматирование и детерминированная сериализация дерева. Сохраненные запросы наглядно диффаются в Git и рецензируются как код.
TugQL предоставляет функциональность, переносимую между базами данных: один и тот же запрос без изменений работает в Git, SQLite, PostgreSQL или Firestore.
Осознанно сфокусированное, четко определенное переносимое подмножество. Непереносимые конструкции явно отклоняются, а не транслируются с рисками.
Пишите в текстовом синтаксисе TugQL; храните или передавайте в виде структурированного дерева TugQT.
Разработчики составляют запросы в текстовом синтаксисе TugQL — наглядном, компактном и близком к SQL. Внутри парсер формирует TugQT (Tug Query Tree) — каноническое машиночитаемое представление.
Каждый узел однозначно сопоставляется между синтаксисом и деревом. Ошибки ввода или нарушения схемы возвращают четкую диагностику с точными координатами в тексте.
from:
name: users
columns:
- field: name
- field: age
as: years
where:
and:
- op: '>='
left:
field: age
right:
value: 18
- or:
- op: In
left:
field: status
right:
values:
- active
- pending
- op: ==
left:
field: country
right:
value: US
orderBy:
- field: name
- field: age
desc: true
limit: 10
offset: 20
Каждый поддерживаемый узел запроса имеет строго определенное представление в структуре.
| Узел запроса | Представление в TugQT |
|---|---|
| From по корневой коллекции | from: { name, alias? } |
| Колонка | элемент в columns: — выражение с необязательным as: |
| Сравнение | { op, left, right } |
| Группа условий (And) | { and: [ … ] } |
| Группа условий (Or) | { or: [ … ] } |
| Выражение сортировки | элемент в orderBy: — выражение с необязательным desc: true |
| Ссылка на поле | { field: <name> } |
| Константа | { value: <скаляр> } |
| Массив | { values: [ <скаляр>, … ] } |
| Оператор | ==, In, >, >=, <, <= |
| Limit / Offset | limit: <int> / offset: <int> |
Выражение задает ровно одно из полей: field, value или values, что определяет ссылку на поле, константу или массив.
Коллекции и деревья объединений, выбираемые колонки, фильтрация, сортировка и пагинация. Все, что вне рамок, отклоняется — и никогда не отбрасывается втихую.
Источники данных · выбранные колонки · сравнения и группы And/Or · сортировка · limit / offset · joins · параметры. Выражения: ссылка на поле, константа, массив. Операторы: ==, !=, In, >, >=, <, <=, And, Or.
Неограниченные декартовы произведения · диалектный синтаксис конкретных СУБД · нетипизированные операторы модификации вне схемы. Сериализация выдает ошибку, чтобы исключить потерю смысла запроса.
resolve(parse(text)) создает детерминированные деревья; сериализация канонична, поэтому сохраненные запросы дают чистые diff при сравнении версий.
TugQL — это переносимый интерфейс запросов. Он опирается на слой абстракции данных (DALgo), который адаптирует его к конкретным базам данных.
Поскольку TugQL охватывает переносимое подмножество, однажды написанный запрос ведет себя одинаково как при выполнении над Git-репозиторием (inGitDB), так и в SQLite, PostgreSQL или Firestore.
Язык представляет собой открытую спецификацию с опубликованной схемой и реализациями на Go и TypeScript.
Спецификация TugQL, каноническая JSON Schema (draft 2020-12) и проверенные примеры документов. Ранее DTQL.
Библиотека на Go: парсинг, валидация, резолвинг, форматирование и выполнение запросов TugQL с гарантией обратимости без потерь.
DataTug помогает разработчикам исследовать схемы БД, составлять и запускать запросы и анализировать результаты. Интеграция контрактов запросов TugQL и TugQT активно развивается. Познакомьтесь с инструментами DataTug.
TugQL превращает запрос в первоклассный артефакт — понятный человеку, валидируемый инструментами и переносимый между любыми хранилищами.