Powierzchnia zapytań (OSL-SQL)
POST /osl/query to jedyny endpoint konsumpcji. Analityka ustrukturyzowana,
metryki, nadzorowany retrieval wektorowy i trawersacja grafu — wszystko wyrażane
jest tutaj; nie uczysz się pięciu powierzchni, by odczytać domenę.
POST /osl/queryAuthorization: Bearer <jwt> # attested delegation chain, see AuthenticationContent-Type: application/jsonCiało to jeden z trzech wzajemnie wykluczających się kształtów (ich mieszanie to
400 E0513); wszystkie trzy przechodzą przez ten sam nadzorowany szew i
współdzielą jeden request_id:
| Ciało | Czym jest |
|---|---|
{ "osql": "…" } |
OSL-SQL — semantyczny dialekt SQL (kanoniczna powierzchnia) |
{ "sql": "…" } |
Surowy, tylko-do-odczytu SELECT nad allowlistą tenanta (wycinek SQL) |
{ "metrics": […], "group_by": […], … } |
Zapytanie o metryki w stylu MetricFlow |
OSL-SQL
Dział zatytułowany „OSL-SQL”osql to semantyczny dialekt SQL. Nazywa wyłącznie obiekty semantyczne —
osl.entities.<model> i zadeklarowane kolumny, albo funkcje tabelaryczne
RETRIEVE(...) / TRAVERSE(...). Nigdy nie nazywa fizycznej tabeli ani surowej
kolumny.
Obniżanie jest granicą bezpieczeństwa
Dział zatytułowany „Obniżanie jest granicą bezpieczeństwa”Silnik parsuje osql (przez sqlglot, dialekt trino) i obniża go do
zamkniętego IR operatorów — deterministycznej drabiny, nad którą egzekwuje
model nadzoru. Obniżanie jest totalne i
default-deny: każda konstrukcja, która nie obniża się do znanego węzła IR, jest
odrzucana.
Pięć form
Dział zatytułowany „Pięć form”lower() klasyfikuje każde zapytanie do dokładnie jednej formy i waliduje jego
gramatykę:
SELECT segment, COUNT(*) AS nFROM osl.entities.CustomerWHERE country IN ('ES','FR','DE')GROUP BY segmentORDER BY n DESCLIMIT 100Obniża się do to_trino() → nadzorowany szew SQL. Joiny między encjami
ustrukturyzowanymi są dozwolone tylko jako equijoin na zapieczętowanym kluczu
(patrz niżej).
SELECT SUMMARIZE(text) AS summary, scoreFROM RETRIEVE(facet => 'meeting_transcripts', query => 'european equity exposure', top_k => 5)Obniża się do nadzorowanego magazynu Lance + retrievalu. Goła kolumna przechodzi
bez zmian; <op>(col) w SELECT to operator projekcji.
SELECT concepto, amount_eurFROM TRAVERSE(anchor => 'customer', target => 'orders', keys => ('c-anna', 'c-bruno'))Obniża się do nadzorowanej trawersacji L2 od kluczy kotwicy (skok po skoku, ograniczona kardynalność + dedup).
SELECT name, segment, recent_meeting_topicsFROM osl.entities.CustomerWHERE customer_id IN ('9c1e…f04a', 'e4f8…2a91')Forma „rekordowa“ (entity-first): kolumny ustrukturyzowane + dowody z Lance + atrybuty derywowane dla podanych kluczy, w jednym rozwiązaniu.
SELECT x.segment, r.text, r.scoreFROM osl.entities.Customer xJOIN RETRIEVE(facet => 'meeting_transcripts', query => 'churn risk') r ON x.customer_id = r.customer_id„Relacja to filtr“: najpierw uruchamia się RETRIEVE, jego klucze wstępnie filtrują nogę strukturalną, a potem hash join w komórce na zapieczętowanym kluczu. Patrz niżej.
R3 jest niewyrażalne, nie blokowane
Dział zatytułowany „R3 jest niewyrażalne, nie blokowane”Jedynym węzłem cross-relacyjnym jest equijoin, którego ON to skalarna równość
na zapieczętowanym kluczu encji (entity_key_columns modelu albo pole
scalar_indexed fasety) na obu nogach. Każdy inny JOIN … ON → 400 E0514.
Nie istnieje składnia, która przekazałaby drugi argument relacyjny operatorowi podobieństwa lub LLM — semantyczny join relacja×relacja w query time (nie-cel R3) jest strukturalną własnością gramatyki, a nie blocklistą do utrzymywania.
Join cross-modalny — wykonanie
Dział zatytułowany „Join cross-modalny — wykonanie”X JOIN RETRIEVE(...) ON X.k = R.k to nie jest relacyjny join dwóch
fizycznych tabel. Wykonuje się tak:
- RETRIEVE (nadzorowany) → fragmenty, każdy niosący swój zdenormalizowany klucz.
- Bramka jawności → wartości kluczy albo odmowa (
403 E0515). - Prefiltr strukturalny:
… WHERE k IN (<keys>)→to_trino→ nadzorowany SQL (listaINjest budowana konwersją literałów sqlglot — odporna na injection). - Hash join w komórce na zapieczętowanym kluczu, projektujący kolumny każdej nogi.
Operatory projekcji
Dział zatytułowany „Operatory projekcji”W formie RETRIEVE <op>(col) w SELECT to operator projekcji (RFC 0004). Są to
mapy unarne — nigdy join.
| Klasa | Operatory | Działa na | Gdy brak |
|---|---|---|---|
| Encoder (deterministyczny) | SIMILARITY, CLASSIFY, TAG, RANK, DEDUP, OUTLIER, CLUSTER |
Na embeddingach już w chunku | — |
| Decoder (inferencja) wymaga LLM | EXTRACT, SUMMARIZE, SCORE, GENERATE, COMPLETE |
Backend LLM | 503 E0521 |
Ciała raw SQL i MetricFlow
Dział zatytułowany „Ciała raw SQL i MetricFlow”{ "sql": "<SELECT>" } to tylko-do-odczytu SELECT walidowany względem
allowlisty tenanta, z zastosowanym punktem egzekwowania polityk (filtry wierszy +
projekcja ze złożonego snapshotu). { "metrics": …, "group_by": … } podąża za
semantyką MetricFlow. Oba współdzielą ten sam nadzorowany szew co osql.
Kody statusu
Dział zatytułowany „Kody statusu”| Kod | Znaczenie |
|---|---|
200 |
Sukces |
400 |
Zniekształcone / poza gramatyką (E0511), obiekt niezadeklarowany (E0512), ciało miesza kształty (E0513), JOIN nie na zapieczętowanym kluczu (E0514), puste sql (E0246) |
403 |
Deny PDP (E2101/E2102), klucz cross-modalny niejawny (E0515), obiekt poza allowlistą (E0512) |
422 |
Poprawne, ale nierozwiązywalne — np. MetricFlow jeszcze niezaimplementowany (E1001) |
503 |
Brak snapshotu PDP (E2001, fail-closed), operacja decoder bez backendu LLM (E0521) |
502 |
Niepowodzenie wykonania Trino (E0510) |
Zobacz Błędy i kody statusu po pełny envelope.