Przejdź do głównej zawartości

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/query
Authorization: Bearer <jwt> # attested delegation chain, see Authentication
Content-Type: application/json

Ciał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

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.

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.

lower() klasyfikuje każde zapytanie do dokładnie jednej formy i waliduje jego gramatykę:

SELECT segment, COUNT(*) AS n
FROM osl.entities.Customer
WHERE country IN ('ES','FR','DE')
GROUP BY segment
ORDER BY n DESC
LIMIT 100

Obniż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).

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 … ON400 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.

X JOIN RETRIEVE(...) ON X.k = R.k to nie jest relacyjny join dwóch fizycznych tabel. Wykonuje się tak:

  1. RETRIEVE (nadzorowany) → fragmenty, każdy niosący swój zdenormalizowany klucz.
  2. Bramka jawności → wartości kluczy albo odmowa (403 E0515).
  3. Prefiltr strukturalny: … WHERE k IN (<keys>)to_trino → nadzorowany SQL (lista IN jest budowana konwersją literałów sqlglot — odporna na injection).
  4. Hash join w komórce na zapieczętowanym kluczu, projektujący kolumny każdej nogi.

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

{ "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.

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.