Changes between Initial Version and Version 1 of CustomerContractMealsView


Ignore:
Timestamp:
05/10/26 14:38:02 (2 weeks ago)
Author:
185022
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • CustomerContractMealsView

    v1 v1  
     1= Преглед: v_customer_contract_meals =
     2
     3||= Датотека ||= `views/10_customer_contract_meals_view.sql` ||
     4||= Шема ||= `kbnteam` ||
     5||= Категорија ||= Оперативна поддршка ||
     6||= Поврзани индекси ||= Ги користи индексите од `indexes/v_menu_meal_index.sql` ||
     7
     8== Опис ==
     9Ги наведува оброците достапни на купувач под активни договори. Го прикажува целосното мени на ресторанот поврзан со договорот на компанијата на купувачот, вклучувајќи состојки и алергени преку CTE агрегации. Прегледот автоматски ги филтрира само активни договори и ги проверува тековните датуми на договори.
     10
     11'''Клучни филтри:'''
     12* `contract_status_name = 'active'` (case-insensitive)
     13* `CURRENT_DATE BETWEEN contract_start_date AND contract_end_date`
     14
     15== Зависности ==
     16||= Табела ||= Тип на употреба ||
     17|| `kbnteam.customer` || Главна табела ||
     18|| `kbnteam.api_user` || JOIN — детали за купувачот ||
     19|| `kbnteam.company` || JOIN — компанија ||
     20|| `kbnteam.contract` || JOIN — договор ||
     21|| `kbnteam.contract_status` || JOIN — статус на договор (филтер: 'active') ||
     22|| `kbnteam.restaurant` || JOIN — ресторан ||
     23|| `kbnteam.meal` || JOIN — оброци на ресторанот ||
     24|| `kbnteam.category` || JOIN — категорија ||
     25|| `kbnteam.meal_ingredient` || LEFT JOIN (CTE) — состојки ||
     26|| `kbnteam.ingredient` || JOIN (CTE) — назив на состојка ||
     27|| `kbnteam.alergen_ingredient` || JOIN (CTE) — алерген-состојка ||
     28|| `kbnteam.alergen` || JOIN (CTE) — назив на алерген ||
     29
     30== SQL Дефиниција ==
     31{{{
     32#!sql
     33CREATE OR REPLACE VIEW kbnteam.v_customer_contract_meals AS
     34WITH meal_ingredients AS (
     35    SELECT
     36        x.meal_id,
     37        string_agg(x.ingr_name, ', ' ORDER BY x.ingr_name) AS ingredients
     38    FROM (
     39        SELECT DISTINCT
     40            mi.meal_id,
     41            i.ingr_name
     42        FROM kbnteam.meal_ingredient mi
     43        JOIN kbnteam.ingredient i ON i.ingr_id = mi.ingr_id
     44    ) x
     45    GROUP BY x.meal_id
     46),
     47meal_allergens AS (
     48    SELECT
     49        x.meal_id,
     50        string_agg(x.alergen_name, ', ' ORDER BY x.alergen_name) AS allergens
     51    FROM (
     52        SELECT DISTINCT
     53            mi.meal_id,
     54            a.alergen_name
     55        FROM kbnteam.meal_ingredient mi
     56        JOIN kbnteam.alergen_ingredient ai ON ai.ingr_id = mi.ingr_id
     57        JOIN kbnteam.alergen a ON a.alergen_id = ai.alergen_id
     58    ) x
     59    GROUP BY x.meal_id
     60)
     61SELECT
     62    cu.user_id AS customer_user_id,
     63    au.user_first_name AS customer_first_name,
     64    au.user_last_name AS customer_last_name,
     65    au.user_email AS customer_email,
     66    cu.company_id,
     67    cmp.company_name,
     68    ct.contract_id,
     69    r.rest_id,
     70    r.rest_name,
     71    m.meal_id,
     72    m.meal_name,
     73    m.meal_description,
     74    m.meal_price,
     75    m.meal_weight,
     76    c.cat_id,
     77    c.cat_name,
     78    COALESCE(mi.ingredients, '') AS ingredients,
     79    COALESCE(ma.allergens, '') AS allergens
     80FROM kbnteam.customer cu
     81JOIN kbnteam.api_user au ON au.user_id = cu.user_id
     82JOIN kbnteam.company cmp ON cmp.company_id = cu.company_id
     83JOIN kbnteam.contract ct ON ct.company_id = cu.company_id
     84JOIN kbnteam.contract_status cs ON cs.contract_status_id = ct.contract_status_id
     85JOIN kbnteam.restaurant r ON r.rest_id = ct.rest_id
     86JOIN kbnteam.meal m ON m.rest_id = r.rest_id
     87JOIN kbnteam.category c ON c.cat_id = m.cat_id
     88LEFT JOIN meal_ingredients mi ON mi.meal_id = m.meal_id
     89LEFT JOIN meal_allergens ma ON ma.meal_id = m.meal_id
     90WHERE lower(cs.contract_status_name) = 'active'
     91  AND CURRENT_DATE BETWEEN ct.contract_start_date AND ct.contract_end_date;
     92}}}
     93
     94== Тестирање на перформанси ==
     95
     96=== Препорачано тест прашање ===
     97{{{
     98#!sql
     99SET search_path TO kbnteam;
     100SET statement_timeout = '60s';
     101
     102-- Тест: по купувач (типичен App use-case)
     103EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
     104SELECT * FROM kbnteam.v_customer_contract_meals
     105WHERE customer_user_id = 1;
     106
     107-- Тест 2: по ресторан
     108EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
     109SELECT * FROM kbnteam.v_customer_contract_meals
     110WHERE rest_id = 1;
     111}}}
     112
     113=== Применети индекси (од v_menu_meal_index.sql) ===
     114{{{
     115#!sql
     116CREATE INDEX IF NOT EXISTS idx_meal_cat_id_meal_id
     117ON kbnteam.meal (cat_id, meal_id);
     118
     119CREATE INDEX IF NOT EXISTS idx_meal_ingredient_meal_id_ingr_id
     120ON kbnteam.meal_ingredient (meal_id, ingr_id);
     121
     122CREATE INDEX IF NOT EXISTS idx_alergen_ingredient_ingr_id_alergen_id
     123ON kbnteam.alergen_ingredient (ingr_id, alergen_id);
     124}}}
     125
     126=== Резултати пред индексирање ===
     127||= Метрика ||= Тест 1 (customer) ||= Тест 2 (rest_id) ||
     128|| Planning Time || ___ ms || ___ ms ||
     129|| Execution Time || ___ ms || ___ ms ||
     130|| Rows Returned || ___ || ___ ||
     131|| meal scan || ___ || ___ ||
     132|| meal_ingredient scan || ___ || ___ ||
     133
     134{{{
     135-- Излезот од EXPLAIN ANALYZE овде (пред индексирање)
     136}}}
     137
     138=== Резултати по индексирање ===
     139||= Метрика ||= Тест 1 (customer) ||= Тест 2 (rest_id) ||
     140|| Planning Time || ___ ms || ___ ms ||
     141|| Execution Time || ___ ms || ___ ms ||
     142|| Rows Returned || ___ || ___ ||
     143|| meal scan || ___ || ___ ||
     144|| meal_ingredient scan || ___ || ___ ||
     145
     146{{{
     147-- Излезот од EXPLAIN ANALYZE овде (по индексирање)
     148}}}
     149
     150=== Анализа на подобрување ===
     151||= Метрика ||= Пред ||= По ||= Δ Подобрување ||
     152|| Execution Time (Тест 1) || ___ ms || ___ ms || ___ % ||
     153|| Execution Time (Тест 2) || ___ ms || ___ ms || ___ % ||