feat(orders): добавлен версионный ODS заказов #103

Merged
ddmitry merged 2 commits from feat/94-versioned-order-ods into main 2026-08-18 23:58:55 +03:00
Owner

Зачем

Менти должен различать бизнес-версию заказа (updated_at), наблюдение источника (snapshot_date) и запуск загрузки (_load_id), а текущее состояние читать через одну явную поверхность ODS.

Что

  • Добавлены ods.order_snapshot_rep / _dist на ReplacingMergeTree(updated_at) и таблицы брака по конвенциям хранилища.
  • Добавлено представление ods.order_v над распределённой таблицей с FINAL.
  • Даг orders_ingest дополнен одним следующим task_id: два последовательных INSERT SELECT раскладывают неизменный срез STG на годные строки и брак.
  • Исполняемый SQL вынесен из DAG и разложен по целевым слоям в sql/stg/ и sql/ods/; обе ветви ODS включают один общий контракт провода.
  • Строгая граница проверяет точный набор 11 ключей, типы JSON, неотрицательные деньги с двумя знаками, времена UTC с миллисекундами, дату и массив items; внутреннее содержимое items и бизнес-инварианты не проверяются.
  • Результаты живых опытов и правило раскладки SQL записаны в документации.

Проверка

  • make lint и make config-test — зелёные.
  • make smoke — 20/20.
  • make check-clickhouse — 9/9.
  • make check-services — 7/7.
  • airflow tasks render загрузил три внешних SQL-файла и включил общий контракт в обе ветви ODS.
  • Изолированный airflow tasks test orders_ingest parse_batch выполнил оба запроса против ClickHouse на пустом искусственном _load_id.
  • Предикат полностью и без пересечения разложил 13 661 настоящую строку: 13 653 годных и 8 field_invalid.
  • Управляемая порция подтвердила три класса брака, выбор поздней версии через ods.order_v, повтор того же _load_id и сохранение _load_ts.
  • Опытные данные и временные объекты удалены.

Найдено вне границ

Восемь настоящих строк одного заказа содержат отрицательный total. Приём законно относит их к field_invalid; ослаблять границу ODS не стали. Причина зафиксирована в #102, который должен быть исправлен до сборки чистого стартового мира в #96.

Closes #94

## Зачем Менти должен различать бизнес-версию заказа (`updated_at`), наблюдение источника (`snapshot_date`) и запуск загрузки (`_load_id`), а текущее состояние читать через одну явную поверхность ODS. ## Что - Добавлены `ods.order_snapshot_rep` / `_dist` на `ReplacingMergeTree(updated_at)` и таблицы брака по конвенциям хранилища. - Добавлено представление `ods.order_v` над распределённой таблицей с `FINAL`. - Даг `orders_ingest` дополнен одним следующим `task_id`: два последовательных `INSERT SELECT` раскладывают неизменный срез STG на годные строки и брак. - Исполняемый SQL вынесен из DAG и разложен по целевым слоям в `sql/stg/` и `sql/ods/`; обе ветви ODS включают один общий контракт провода. - Строгая граница проверяет точный набор 11 ключей, типы JSON, неотрицательные деньги с двумя знаками, времена UTC с миллисекундами, дату и массив `items`; внутреннее содержимое `items` и бизнес-инварианты не проверяются. - Результаты живых опытов и правило раскладки SQL записаны в документации. ## Проверка - `make lint` и `make config-test` — зелёные. - `make smoke` — 20/20. - `make check-clickhouse` — 9/9. - `make check-services` — 7/7. - `airflow tasks render` загрузил три внешних SQL-файла и включил общий контракт в обе ветви ODS. - Изолированный `airflow tasks test orders_ingest parse_batch` выполнил оба запроса против ClickHouse на пустом искусственном `_load_id`. - Предикат полностью и без пересечения разложил 13 661 настоящую строку: 13 653 годных и 8 `field_invalid`. - Управляемая порция подтвердила три класса брака, выбор поздней версии через `ods.order_v`, повтор того же `_load_id` и сохранение `_load_ts`. - Опытные данные и временные объекты удалены. ## Найдено вне границ Восемь настоящих строк одного заказа содержат отрицательный `total`. Приём законно относит их к `field_invalid`; ослаблять границу ODS не стали. Причина зафиксирована в #102, который должен быть исправлен до сборки чистого стартового мира в #96. Closes #94
ddmitry added 1 commit 2026-08-18 23:11:47 +03:00
- Зачем:
  - менти должен различать версию заказа, наблюдение источника и запуск загрузки.
- Что:
  - добавлены таблицы версий и брака заказов, а также представление ods.order_v.
  - даг orders_ingest дополнен строгим переходом одного среза STG в две цели ODS.
  - результаты опытов записаны в документации, дефект генератора вынесен в #102.
- Проверка:
  - make lint config-test smoke check-clickhouse check-services.
ddmitry added 1 commit 2026-08-18 23:55:17 +03:00
- Зачем:
  - преобразования хранилища должны читаться рядом с целевым слоем, а DAG должен показывать оркестрацию.
- Что:
  - запросы забора и разбора заказов разложены по каталогам STG и ODS.
  - общий контракт провода подключён в обе ветви штатным шаблонизатором Airflow.
  - SQL смонтирован во все службы Airflow, а правило раскладки записано в архитектуре.
- Проверка:
  - make lint config-test smoke check-services.
  - airflow tasks render для pull_batch и parse_batch; airflow tasks test для parse_batch.
ddmitry merged commit 62b275ef94 into main 2026-08-18 23:58:55 +03:00
ddmitry deleted branch feat/94-versioned-order-ods 2026-08-18 23:58:56 +03:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ddmitry/clickstream-data-platform#103