- Зачем:
- студент реализует 9 объектов DWH без автоматической обратной связи;
- ошибки (NULL в PK, дубли BK, сломанный SCD2) обнаруживались только на слое DM
через 2–3 слоя, где отладка многократно сложнее.
- Что:
- создан DAG bookings_validate.py — три параллельных TaskGroup (validate_ods,
validate_dds, validate_dm), schedule=None (только ручной trigger);
- создано 17 SQL-скриптов в sql/validate/: ODS BK coverage vs STG-батч,
согласованность _load_id между ods.airplanes и ods.seats, дубли BK, NULL в PK,
покрытие ODS→DDS для измерений (dim_routes требует открытой версии valid_to IS NULL),
SCD2 активный тест backup→mutate→student_load→check(5 инвариантов)→restore
(trigger_rule=all_done), проверка «дыр» между SCD2-версиями,
exists-чеки для 4 DM-витрин;
- добавлен класс TestBookingsValidate (5 smoke-тестов) в tests/test_dags_smoke.py.
- Проверка:
- make test — 4 passed, 14 skipped (DAG-тесты скипаются без Airflow, норма);
- ручной trigger bookings_validate в Airflow UI на solution-ветке — все таски зелёные.
29 lines
1.4 KiB
SQL
29 lines
1.4 KiB
SQL
-- Проверка: нет «дыр» в SCD2-интервалах dim_routes.
|
||
--
|
||
-- Для каждого route_bk с несколькими версиями проверяем, что
|
||
-- valid_to предыдущей версии = valid_from следующей.
|
||
--
|
||
-- Важно: если маршрут «исчез» из ODS, его текущая версия закрывается
|
||
-- (valid_to = CURRENT_DATE), но новая не вставляется — это корректно.
|
||
-- Проверяем «дыру» только если следующая версия существует.
|
||
DO $$
|
||
DECLARE
|
||
v_gaps BIGINT;
|
||
BEGIN
|
||
SELECT COUNT(*) INTO v_gaps
|
||
FROM (
|
||
SELECT route_bk, valid_to,
|
||
LEAD(valid_from) OVER (PARTITION BY route_bk ORDER BY valid_from) AS next_valid_from
|
||
FROM dds.dim_routes
|
||
) AS t
|
||
WHERE valid_to IS NOT NULL
|
||
AND next_valid_from IS NOT NULL -- следующая версия существует (не «исчезнувший» маршрут)
|
||
AND valid_to <> next_valid_from;
|
||
|
||
IF v_gaps > 0 THEN
|
||
RAISE EXCEPTION 'FAILED: В dds.dim_routes найдено % «дыр» между версиями SCD2. valid_to старой версии должен совпадать с valid_from новой.', v_gaps;
|
||
END IF;
|
||
|
||
RAISE NOTICE 'PASSED: Нет «дыр» в SCD2-версиях dim_routes';
|
||
END $$;
|