Polecenie SELECT
Każde polecenie SELECT w systemie RetractorDB tworzy ciągłe zapytania. Zapytania te realizowane są od momentu pojawienia się w systemie aż do zakończenia pracy systemu.
Składnia polecenia SELECT przedstawia się następująco:
SELECT wyrażenie_algebraiczne [, wyrażenie_algebraiczne]
STREAM nazwa_budowanego_strumienia
FROM strumieniowe_wyrażnie_algebraiczne
[FILE 'nazwa_pliku_artefaktu']
[RETENTION pojemność [segmenty]]
[VOLATILE]
[STORAGE profile]
Rys. 4. Diagram składni polecenia SELECT
Diagram składni (railroad) przedstawiony na Rys. 4 został wygenerowany na podstawie reguły select_statement z gramatyki ANTLR4 systemu (RQL.g4). Diagram czyta się, podążając liniami od lewej do prawej: zaokrąglone zielone pola to słowa kluczowe i symbole wpisywane dosłownie, prostokąty to wartości podawane przez użytkownika. Rozgałęzienie za słowem SELECT pokazuje, że lista pól to albo gwiazdka (pełny rekord), albo jedno lub więcej wyrażeń rozdzielonych przecinkami (pętla powracająca przez przecinek). Tory omijające klauzule FILE, RETENTION (z opcjonalnym drugim parametrem — liczbą segmentów), VOLATILE i STORAGE oznaczają, że każda z nich jest opcjonalna.
Osoby posługujące się językiem SQL zauważą od razu że przedstawione powyżej polecenie odbiega znacząco od tego co znają z zakresu relacyjnych baz danych.
Pierwsza różnica poza składnią to fakt że polecenia te wprowadzone do systemu realizują się aż do zakończenia pracy systemu. Każde polecenie SELECT jest zapytaniem ciągłym. Klauzula STREAM wymaga nadania przez twórcę każdemu zapytaniu unikalnej nazwy. O ile wyrażenia algebraiczne na liście klauzuli SELECT nie odbiegają od formy znanej z systemów relacyjnych o tyle strumieniowe wyrażenie algebraiczne musi spełniać warunki przedstawione w poprzednim rozdziale dotyczącym wyrażeń algebraicznych. Opcjonalne klauzule FILE oraz RETENTION zapewniają procesy kierowania wyników i zarządzania formą ich retencji. Stare, podzielone pliki wynikowe mogą być usuwane na bieżąco zapewniając systemowi miejsce na nowe dane w ruchu ciągłym.
Przykładem zapytania tworzącego nowy strumień danych może być następujące polecenie w języku RQL.
SELECT str1[0]*10 + str1[1]*10, str1[2] \
STREAM str1 \
FROM A+B
Tak zbudowane zapytanie zakłada że ktoś zadeklarował strumienie A i B. Operację tą mógł wykonać za pomocą słowa kluczowego DECLARE lub innego polecenia SELECT. W oparciu tylko o wiersz zawierający zapytanie nie jesteśmy w stanie stwierdzić jak szybko dane strumienia str1 napływają. Ta informacja jest wyliczana na etapie kompilacji w oparciu o strumienie A i B i wyrażenie algebraiczne w klauzuli FROM.
NOTE: Opisana funkcjonalność ma pokrycie w testach:
simple,Pattern2opisanych w załączniku pt. Testy Integracyjne.
Klauzula VOLATILE - tworzy ulotną formę zapytania. Zapytanie z tą klauzulą przechowują tylko jeden rekord w pamięci - na dysku pojawia się tylko deskryptor opisujący strukturę danych.
Klauzula STORAGE umożliwia wybór sposobu tworzenia i zarządzania tworzonymi artefaktami. Pełna tabela typów z opisem każdego z nich znajduje się w rozdziale Typy STORAGE.
Operatory klauzuli FROM
Strumieniowe wyrażenie algebraiczne w klauzuli FROM może zawierać:
| Operator | Składnia | Opis |
|---|---|---|
| Suma | A + B | Połączenie dwóch strumieni — patrz Sekwencjonowanie sumowania |
| Przeplot | A # B | Interleaving dwóch strumieni — patrz Sekwencjonowanie przeplotu |
| Przesunięcie | A > N | Przesuwa okno odczytu o N próbek |
| Okno AGSE | A @ (k, w) | Ruchome okno danych — patrz Ruchome okno danych AGSE |
| Agregat | A.min / A.max / A.avg / A.sumc | Redukuje wielopolowy rekord do jednej wartości — patrz Operatory agregujące |
NOTE: Operator przesunięcia
A > Nma pokrycie w teście:issue56_timeshiftopisanym w załączniku pt. Testy Integracyjne.
NOTE: Propagacja wartości null przez wyrażenia SELECT ma pokrycie w teście:
issue121_null_propagationopisanym w załączniku pt. Testy Integracyjne.