Kompaktowa notacja stringowa do generowania warunków SQL z JSON
Przy budowaniu zapytań SQL na podstawie plików JSON powstają długie wyrażenia warunkowe. Początkowe podejście wykorzystywało tablice typu "vendor_id": [17,-23], przekształcane w vendor_id = 17 OR NOT vendor_id = 23. To kompaktowe, ale niekompletne: brak wsparcia dla zakresów, agregacji MIN/MAX i niejednoznaczna składnia.
Nowa notacja rozwiązuje problem w formie ciągu znaków, walidowanego wyrażeniami regularnymi. Obejmuje porównania, zbiory, zakresy i negacje dla dowolnych typów z operacjami =, <, >, !. Znak minusu oznacza logiczne zaprzeczenie, niezależnie od typu danych.
Główne konstrukcje notacji
Notacja przekształca ciągi typu X=operand w standardowy SQL. Obsługiwane są binarne funkcje MIN, MAX, BETWEEN.
X=y -> X = y
X<y -> X < y
X>y -> X > y
X!=y -> X < y OR X > y
X<=y -> X < y OR X = y
X>=y -> X > y OR X = y
Dla zbiorów dwuelementowych:
X=[y1, y2] -> (X = y1 OR X = y2)
X>[y1, y2] -> (X > MAX(y1, y2))
X<[y1, y2] -> (X < MIN(y1, y2))
X!=[y1, y2] -> (X != y1 AND X != y2)
X<=[y1, y2] -> (X <= MIN(y1, y2))
X>=[y1, y2] -> (X >= MAX(y1, y2))
X>>[y1, y2] -> BETWEEN(y1, y2)
X><[y1, y2] -> (NOT BETWEEN(y1, y2))
Dla zbiorów dowolnej wielkości logika jest analogiczna: OR dla równości, AND dla negacji, MIN/MAX dla granic.
Zalety nad tablicami
Przejście od tablic JSON do ciągów upraszcza parsowanie i walidację:
- Walidacja: Wyrażenia regularne zamiast sprawdzania schematów element po elemencie.
- Kompletność: Wsparcie dla zakresów i agregacji bez rozszerzeń.
- Czytelność: Matematyczna intuicja —
X>[y1,y2]oznacza X większe od wszystkich elementów.
Przykład skrócenia:
Tradycyjny SQL: WHERE (age >= 18 AND age <= 65) OR age > 70
Notacja: age>=[18,65] OR age>70
Ocena od modelu AI
Analiza DeepSeek potwierdza mocne strony:
- Kompaktowość: Wysoka gęstość bez utraty sensu.
- Intuicyjność:
X!=[y1,y2]— nierówne żadnemu. - Rozszerzalność: Łatwo dodać zakresy z
>>(rozszerzenie) i><(przerwa).
Potencjalne problemy:
- Niejednoznaczność dla nowicjuszy:
X>[5,10]wymaga zrozumienia MAX. - Puste zbiory: Trzeba zdefiniować zachowanie
X=[]. - Konflikty:
>>może kolidować ze shiftami bitowymi.
Propozycje ulepszeń:
- Alternatywy dla zakresów:
X..[y1,y2],X:[y1,y2]. - Nawiasy dla ścisłych zakresów:
X>>(10,20).
Analogi i unikalność
Najbliższe odpowiedniki:
| Język/DSL | Przykład | Podobieństwo |
|-----------|----------|--------------|
| Quist | 300 <= number < 500 | Podwójne porównania, zbiory |
| SQL++ | lang IN ["en", "de"] | IN dla tablic |
| PRQL | derive full_name = ... | Podejście funkcyjne |
Unikalność notacji:
- Strzałki
>>,><dla BETWEEN/NOT BETWEEN. - Kombinacje
>=[y1,y2]dla granic zbiorów. - Minimalizm z zachowaniem ekspresyjności.
Porównanie:
- Notacja:
age>=[18,65] OR status=[active,pending] - Quist:
(18 <= age <= 65 OR status:in active, pending) - SQL:
(age >= 18 AND age <= 65) OR status IN ('active', 'pending')
Co ważne
- Notacja przeznaczona dla preprocesorów SQL lub JSON DSL w backendzie.
- Parsowanie przez regex: szybko, bez skomplikowanych parserów.
- Wsparcie dla dowolnych typów z operacjami porównawczymi.
- Logiczny minus dla negacji upraszcza unifikację.
- Pierwsza wersja — do dyskusji, bez optymalizacji.
— Editorial Team
Brak komentarzy.