Czytelny dla człowieka
Intuicyjna składnia zbliżona do SQL dla programistów oraz proste drzewo zapytań YAML/JSON (TugQT) dla narzędzi — każdy może je przejrzeć i edytować.
TugQL to przenośny, czytelny dla człowieka język zapytań. Łączy przejrzystą, zbliżoną do SQL składnię z bezstratną reprezentacją 1:1 w postaci ustrukturyzowanego drzewa zapytań (TugQT) serializowanego jako czysty YAML/JSON. Zapisz zapytanie, edytuj je ręcznie, porównuj diff w systemie kontroli wersji i wykonuj na różnych backendach bez żadnych strat.
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 zamienia zapytanie w zrozumiały dokument z obsługą diff, który możesz przechowywać, recenzować i wersjonować — przenośny na każdym backendzie.
Intuicyjna składnia zbliżona do SQL dla programistów oraz proste drzewo zapytań YAML/JSON (TugQT) dla narzędzi — każdy może je przejrzeć i edytować.
Kanoniczna normalizacja odtwarza zapytania strukturalnie identyczne ze źródłem. Nic nie jest po cichu pomijane ani zniekształcane.
Publikowane z pełną walidacją JSON Schema (draft 2020-12). Dowolne narzędzie w dowolnym języku może sprawdzić strukturę zapytania przed wykonaniem.
Kanoniczne formatowanie i deterministyczna serializacja drzewa. Zapisane zapytania tworzą czyste diffy w Git i można je recenzować jak kod.
TugQL udostępnia funkcjonalność wspólną dla różnych silników — to samo zapytanie działa bez zmian w Git, SQLite, PostgreSQL czy Firestore.
Celowo zdefiniowany, przenośny podzbiór. Nieprzenośne konstrukcje są jawnie odrzucane, zamiast być ryzykownie tłumaczone.
Pisz w składni tekstowej TugQL; przechowuj lub przesyłaj jako ustrukturyzowane drzewo zapytań TugQT.
Autorzy piszą zapytania w składni tekstowej TugQL — czytelnej, zwięzłej i zbliżonej do SQL. Pod spodem parser generuje TugQT (Tug Query Tree) — kanoniczną, czytelną maszynowo reprezentację.
Każdy węzeł mapuje się deterministycznie między składnią a drzewem. Błędy składni lub naruszenia schematu zwracają precyzyjne komunikaty diagnostyczne ze wskazaniem miejsca w kodzie.
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
Każdy obsługiwany węzeł zapytania ma ściśle zdefiniowaną reprezentację strukturalną.
| Węzeł zapytania | Reprezentacja w TugQT |
|---|---|
| From po kolekcji głównej | from: { name, alias? } |
| Kolumna | element w columns: — wyrażenie z opcjonalnym as: |
| Porównanie | { op, left, right } |
| Warunek grupowy (And) | { and: [ … ] } |
| Warunek grupowy (Or) | { or: [ … ] } |
| Wyrażenie sortowania | element w orderBy: — wyrażenie z opcjonalnym desc: true |
| Odwołanie do pola | { field: <nazwa> } |
| Stała | { value: <skalar> } |
| Tablica | { values: [ <skalar>, … ] } |
| Operator | ==, In, >, >=, <, <= |
| Limit / Offset | limit: <int> / offset: <int> |
Wyrażenie ustawia dokładnie jedno z pól: field, value lub values, co odróżnia odwołanie do pola, stałą lub tablicę.
Pojedyncze kolekcje lub złączenia, wybrane kolumny, filtry, sortowanie i stronicowanie. Wszystko poza zakresem jest odrzucane — nigdy po cichu ignorowane.
Źródła kolekcji · wybrane kolumny · drzewa porównań i grupy And/Or · sortowanie · limit / offset · złączenia · parametry. Wyrażenia: pole, stała, tablica. Operatory: ==, !=, In, >, >=, <, <=, And, Or.
Nieograniczone iloczyny kartezjańskie · specyficzna składnia poszczególnych dialektów bazodanowych · nietypowane operatory mutacji poza schematem. Serializacja kończy się błędem, aby nie utracić znaczenia zapytania.
resolve(parse(text)) generuje deterministyczne drzewa zapytań; kanoniczna serializacja sprawia, że zapisane zapytania tworzą czyste diffy między wersjami.
TugQL to przenośna warstwa zapytań. Łączy się z warstwą abstrakcji danych (DALgo), która dostosowuje ją do dowolnego magazynu pod spodem.
Ponieważ TugQL definiuje wspólny, przenośny podzbiór, raz napisane zapytanie działa dokładnie tak samo zarówno w repozytorium Git (inGitDB), jak i w pliku SQLite, bazie PostgreSQL czy Firestore.
Język jest otwartą specyfikacją z opublikowanym schematem oraz implementacjami w Go i TypeScript.
Specyfikacja TugQL, kanoniczny JSON Schema (draft 2020-12) oraz zweryfikowane przykładowe dokumenty. Dawniej DTQL.
Biblioteka w Go: parsowanie, walidacja, rozwiązywanie, formatowanie i wykonywanie zapytań TugQL z gwarancją bezstratności.
DataTug pomaga programistom badać schematy baz danych, tworzyć i uruchamiać zapytania oraz analizować wyniki. Prace nad integracją kontraktów zapytań z TugQL i TugQT trwają nieustannie. Poznaj narzędzia stojące za DataTug.
TugQL czyni zapytanie pierwszorzędnym, weryfikowalnym artefaktem — czytelnym dla ludzi, walidowanym przez narzędzia i przenośnym między silnikami bazodanowymi.