feat(dds): добавлен публичный контракт события

Зачем:
- Показать слой DDS как договор данных, которому не нужна физическая копия.
- Сохранить простой учебный стенд без отдельного маршрута ради узких прав.

Что:
- Добавлено кластерное представление dds.event_v с явными 44 колонками.
- Роли bi_reader разрешено чтение ODS, DDS и DM при договоре чтения через _v.
- Согласованы мастер-спека, ADR, справочники архитектуры и живые тикеты этапа.
- Зафиксировано исследование поведения DEFINER поверх Distributed.

Проверка:
- make config-test
- make smoke
- make check-clickhouse
- Приёмочные запросы: равенство ODS/DDS, состав колонок, коды устройств и права bi.
This commit is contained in:
ddadmin committed 2026-08-25 17:13:35 -04:00
1 parent 4ea9591a16
commit 9ea361d199
11 files changed
+288 -76

No files matched your search

+64
View File
@@ -0,0 +1,64 @@
-- DDS: публичный договор события на языке бизнес-модели.
--
-- Событие не копируется в DDS: обычное представление вторым уровнем читает
-- точное состояние из ods.event_v. Явный список колонок не пропускает в
-- договор служебные и сырые поля ODS при будущих изменениях источника.
--
-- Представление — договор чтения, не граница прав: роль bi_reader читает его
-- источник по решению docs/adr/0007-clickhouse-access.md.
--
-- event_date берётся напрямую из EventDate. Пересчёт из event_time помешал бы
-- первичному индексу отбирать день до чтения.
CREATE VIEW IF NOT EXISTS dds.event_v ON CLUSTER clickstream_cluster
AS
SELECT
WatchID AS event_id,
ClientID AS client_id,
CounterID AS counter_id,
EventDate AS event_date,
toTimeZone(UTCEventTime, 'Europe/Samara') AS event_time,
ClientTimeZone AS client_timezone,
EventType AS event_type,
URL AS url,
Referer AS referer,
Title AS title,
UTMSource AS utm_source,
UTMMedium AS utm_medium,
UTMCampaign AS utm_campaign,
UTMContent AS utm_content,
UTMTerm AS utm_term,
LastTrafficSource AS last_traffic_source,
HasGCLID AS has_gclid,
YCLID AS yclid,
Browser AS browser,
BrowserMajorVersion AS browser_major_version,
BrowserLanguage AS browser_language,
OperatingSystem AS operating_system,
OperatingSystemRoot AS operating_system_root,
transform(
DeviceCategory,
[1, 2, 3, 4],
['desktop', 'mobile', 'tablet', 'tv'],
toString(DeviceCategory)
) AS device_category,
MobilePhoneModel AS mobile_phone_model,
ScreenWidth AS screen_width,
ScreenHeight AS screen_height,
IPAddress AS ip_address,
RegionCountry AS region_country,
RegionCity AS region_city,
RegionCountryID AS region_country_id,
RegionCityID AS region_city_id,
GoalsReached AS goals_reached,
ParsedParamsKey1 AS parsed_params_key1,
purchaseID AS purchase_id,
purchaseRevenue AS purchase_revenue,
purchaseCurrency AS purchase_currency,
purchaseCoupon AS purchase_coupon,
productID AS product_id,
productName AS product_name,
productCategory AS product_category,
productPrice AS product_price,
productQuantity AS product_quantity,
productEventType AS product_event_type
FROM ods.event_v;