Warehouse adapters
El motor Strata se ejecuta hoy contra DuckDB (único driver instalado en el entorno). Otros warehouses — Postgres, BigQuery, Snowflake — pasan por strata/adapters.py que expone un Warehouse ABC con seis operaciones (connect, execute, fetch, materialize, drop, list_views).
Estado actual
| Warehouse | Adapter ABC (strata.adapters) | Ejecución real del motor (strata.exec) | Driver |
|---|---|---|---|
| DuckDB | DuckDBWarehouse ✅ | ✅ duckdb (default dep) | duckdb |
| Postgres | stub E095 — sin Warehouse ABC aún | ✅ cli.open_warehouse("postgres://...") → dbcompat.PGConn (psycopg2, probado contra Postgres 16 efímero en tests/pg_harness.py) | pip install strata[postgres] |
| BigQuery | stub E095 | ❌ solo sqlgen (--dialect bigquery emite SQL) | pip install strata[bigquery] |
| Snowflake | stub E095 | ❌ solo sqlgen (--dialect snowflake emite SQL) | pip install strata[snowflake] |
sqlgen ya produce SQL por dialecto; el adapter solo transporta (transacción, materialización, listado). No hay traducción de semántica en el adapter — eso vive en dialects.py. La bifurcación Postgres (motor real vía dbcompat.PGConn, adapter ABC aún stub) es intencional y está testeada en tests/test_exec_postgres.py (6 tests contra Postgres real); get_adapter("postgres") sigue tirando E095 a propósito con hint a la ruta CLI.
Uso
from strata.adapters import get_adapter, AdapterNotAvailable
try:
wh = get_adapter("postgres", conn_string="...")
except AdapterNotAvailable as e:
print(e.help) # -> "pip install psycopg2-binary"
wh.execute(sql)
wh.materialize("snap_abc_m", sql)Interfaz Warehouse
materialize(name, sql)→CREATE TABLE name AS sqlatómica.list_views()devuelve losv_*publicados (views, no tablas).- Los
snap_*son tablas; el GC los borra por separado.
Para habilitar un warehouse real
- Instalar el driver (
pip install psycopg2-binary/google-cloud-bigquery/snowflake-connector-python). - Implementar la subclase de
Warehouseque abra la conexión con las credenciales del entorno. - Añadir el dialecto a
_MISSINGenadapters.pypara que el stub deje de lanzar. - Añadir tests de ejecución real en
tests/test_warehouse_<dialect>.py(el patrón: mismo modelo en DuckDB y en el warehouse → mismos valores, como se hizo para JSON/arrays y PostgreSQL 16).
Adaptación dbt
strata/importdbt.py provee import_dbt_schema() (traduce el esquema dbt — sources y contratos de columnas de los modelos — a un artefacto .strata determinista) y, con strata import-dbt schema.yml --models models/, import_dbt_project() traduce además cada modelo .sql a su cuerpo Strata. El subconjunto traducible en el paso 1 es de una sola tabla: SELECT de columnas/alias + count/sum/avg/min/max, WHERE de columna-vs-literal con IS [NOT] NULL y AND, y GROUP BY sobre esas agregaciones. Todo lo demás (joins, CTEs, macros, select *, ORDER BY, LIMIT, DISTINCT, expresiones calculadas) es E042 fail-loud — la filosofía de no adivinar: un modelo que no traduce, no se importa con una versión aproximada. Contratos not_null solo se emiten si la nulabilidad es demostrable en Strata (un filter no refina nulabilidad todavía: el nonnull tiene que venir del upstream o de un coalesce).
WASM/playground
Opcional; no implementado en este hito.