diff --git a/.cursor/rules/timescale-continuous-aggregate.mdc b/.cursor/rules/timescale-continuous-aggregate.mdc new file mode 100644 index 0000000..3331399 --- /dev/null +++ b/.cursor/rules/timescale-continuous-aggregate.mdc @@ -0,0 +1,26 @@ +--- +description: TimescaleDB continuous aggregates – komentáře a Flyway (EMS) +globs: db/**/*.sql +alwaysApply: false +--- + +# Timescale continuous aggregate v EMS + +## Komentáře u CA (kritické) + +Continuous aggregate vytvořený jako `CREATE MATERIALIZED VIEW … WITH (timescaledb.continuous)` **není** v systémovém katalogu PostgreSQL evidovaný jako běžný **materialized view**. + +- **Nepoužívat** `COMMENT ON MATERIALIZED VIEW ems. …` → chyba SQL state **42809** („is not a materialized view“). +- **Použít** `COMMENT ON VIEW ems. …` — stejný vzor jako u `telemetry_inverter_hourly` v migraci **V011**. + +Samotné **wrapper view** nad CA (např. `vw_telemetry_15m_7d` v repeatable `R__vw_telemetry_15m_7d.sql`) komentovat standardně `COMMENT ON VIEW`. + +## Struktura repa + +- **Definice CA + `add_continuous_aggregate_policy`**: verzovaná migrace `db/migration/V0xx__*.sql` (po aplikaci na DB neměnit — nová V migrace). +- **Definice čtecího view nad CA**: raději **repeatable** `db/views/R__vw_*.sql`, aby šla měnit jedna aktuální verze bez nové V migrace. +- **PostgREST**: `GRANT SELECT` na view v `db/views/R__z_postgrest_ems_anon_grants.sql`, ne na samotný CA. + +## Odkaz v dokumentaci + +Detailněji: `docs/04-modules/telemetry.md` (sekce o continuous aggregates a dashboardu). diff --git a/CLAUDE.md b/CLAUDE.md index 0bae281..16a2987 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -188,6 +188,7 @@ Specifikace z `docs/02-architecture.md`, modulových docs a komentářů v `plan - Python: `snake_case`, type hints, Pydantic pro API modely. - SQL: `snake_case`, explicitní FK; Flyway pořadí `V###__` / repeatable `R__`. +- Timescale **continuous aggregate** (CA): komentář k objektu CA je **`COMMENT ON VIEW`**, ne `COMMENT ON MATERIALIZED VIEW` (PG hlásí 42809). Viz `.cursor/rules/timescale-continuous-aggregate.mdc`. - Výkon **W**, energie **Wh**, ceny **Kč/kWh**; čas v DB **`TIMESTAMPTZ` (UTC)**. - NIKDY neupravuj existující V__ migrační soubory po jejich aplikaci na DB. - Pokud je potřeba opravit chybu ve verzované migraci, vytvoř novou V{N+1} migraci. diff --git a/db/migration/V039__telemetry_inverter_15m_aggregate.sql b/db/migration/V039__telemetry_inverter_15m_aggregate.sql index 470d835..21f5d73 100644 --- a/db/migration/V039__telemetry_inverter_15m_aggregate.sql +++ b/db/migration/V039__telemetry_inverter_15m_aggregate.sql @@ -27,7 +27,8 @@ SELECT add_continuous_aggregate_policy( schedule_interval => INTERVAL '15 minutes' ); -COMMENT ON MATERIALIZED VIEW ems.telemetry_inverter_15m IS +-- Timescale CA není v katalogu „materialized view“ – stejně jako V011 u telemetry_inverter_hourly. +COMMENT ON VIEW ems.telemetry_inverter_15m IS 'Čtvrthodinové agregáty telemetrie střídače. TimescaleDB continuous aggregate. Refresh každých 15 minut. Dashboard přehled (sloty 15 min). View vw_telemetry_15m_7d je v repeatable R__vw_telemetry_15m_7d.sql.';