Changes between Version 8 and Version 9 of ReportsProcedures


Ignore:
Timestamp:
09/26/25 18:44:12 (3 weeks ago)
Author:
223075
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • ReportsProcedures

    v8 v9  
     1= Напредни извештаи од базата (PostgreSQL) =
     2----
     3Оваа страна прикажува 3 покомплексни извештаи.
    14
    2 == Напредни извештаи од базата (PostgreSQL)
     5== 0) Извршени се SQL надградбите (views, triggers, function, indexes) преку Node:==
     6{{{
     7cd backend
     8npm run db:apply
     9}}}
     10{{{
     11["Enhancements applied (views, triggers, function, indexes)."]
     12}}}
     13
     14Потоа внесовме мал демо-сет:
     15{{{
     16npm run db:seed
     17}}}
     18{{{
     19[Seed done. User IDs: { ana: '12', bojan: '13', ciro: '14', classId: '7' }]
     20}}}
     21
     22----
     23
     24== 1) Топ потрошувачи (пакети + мерч) со рангирање ==
     25**Цел:** По корисник, колку потрошил (сума пакет + мерч) и кој му е рангот според вкупниот трошок.
     26
     27**Користен поглед:** `vw_user_spend`
     28
     29**SQL:**
     30{{{
     31SELECT user_id, username, email,
     32       spend_packages, spend_merch, total_spend,
     33       RANK() OVER (ORDER BY total_spend DESC) AS spend_rank
     34FROM vw_user_spend
     35ORDER BY total_spend DESC, user_id;
     36}}}
     37
     38**Релациска алгебра (неформално):**
     39{{{
     40Π_{user_id,username,email,spend_packages,spend_merch,total_spend}
     41 ( User ⟕ (γ_{user_id; SUM(price)→spend_packages}(User_Purchased_Package ⋈ Package))
     42        ⟕ (γ_{user_id; SUM(price)→spend_merch}(User_Purchased_Merch ⋈ Merch_Items)) )
     43}}}
     44
     45**Извршување:**
     46{{{
     47npm run db:reports
     48}}}
     49{{{
     50[
     51  {
     52    "user_id": "8",
     53    "username": "mikiYoga",
     54    "email": "miki@example.com",
     55    "spend_packages": "45.00",
     56    "spend_merch": "12.00",
     57    "total_spend": "57.00",
     58    "spend_rank": "1"
     59  },...
     60]
     61}}}
     62
     63----
     64
     65== 2) Исполнетост на часови со дневно рангирање ==
     66**Цел:** За секој клас: booked/capacity (во %) и ранг во истиот ден.
     67
     68**Користен поглед:** `vw_class_utilization`
     69
     70**SQL:**
     71{{{
     72SELECT *,
     73       DENSE_RANK() OVER (PARTITION BY date ORDER BY utilization_pct DESC NULLS LAST) AS daily_rank
     74FROM vw_class_utilization
     75ORDER BY date, start_time, class_id;
     76}}}
     77
     78**Релациска алгебра:**
     79{{{
     80γ_{class_id; COUNT(user_id)→booked}(Class ⟕ User_Booked_Class)
     81+ калкулација utilization_pct = booked / capacity
     82}}}
     83
     84{{{
     85 [
     86  {
     87    "class_id": "5",
     88    "date": "2025-06-09T22:00:00.000Z",
     89    "start_time": "08:00:00",
     90    "end_time": "09:00:00",
     91    "location": "Studio A",
     92    "capacity": 20,
     93    "booked": "1",
     94    "utilization_pct": "5.00",
     95    "instructor_id": "5",
     96    "daily_rank": "2"
     97  },...
     98]
     99}}}
     100
     101----
     102
     103== 3) Популарност на тренинзи по месец ==
     104**Цел:** По месец, броиме уникатни корисници кои букирале часови што содржат даден тренинг; даваме месечен ранг.
     105
     106**Користен поглед:** `vw_training_pop_monthly`
     107
     108**SQL:**
     109{{{
     110SELECT training_id, training_name, month, num_bookings,
     111       RANK() OVER (PARTITION BY month ORDER BY num_bookings DESC NULLS LAST) AS rank_in_month
     112FROM vw_training_pop_monthly
     113ORDER BY month DESC, rank_in_month, training_name;
     114}}}
     115
     116**Релациска алгебра:**
     117{{{
     118γ_{training_id,month; COUNT(DISTINCT user_id)→num_bookings}
     119 ( Training ⋈ Class_Includes_Training ⋈ Class ⟕ User_Booked_Class )
     120}}}
     121
     122{{{
     123[
     124  {
     125    "training_id": "7",
     126    "training_name": "Vinyasa",
     127    "month": "2025-08-31T22:00:00.000Z",
     128    "num_bookings": "1",
     129    "rank_in_month": "1"
     130  },...
     131]
     132}}}
     133
     134----
     135
     136== 4) EXPLAIN/ANALYZE (за индекси) ==
     137Генерираме JSON планови:
     138{{{
     139npm run db:explain
     140}}}
     141**A)** За листање на настани, очекуваме користење на составниот индекс `(date,time)`:
     142- Датотека: `backend/proofs/events_explain.json`
     143- Конзолата печати „Index Scan / Bitmap“ јазли ако ги има.
     144
     145**B)** За броење резервации по час, очекуваме `idx_class_date_time` и `idx_ubc_class`:
     146- Датотека: `backend/proofs/class_bookings_explain.json`
    3147
    4148
    5 
    6 
    7 == 1) Популарност и приход: Пакети ==
    8 Пакети – број на купувања и бруто приход:
    9149{{{
    10 #!sql
    11 SELECT
    12 p.package_name,
    13 COUNT(*) AS num_purchases,
    14 SUM(p.price) AS gross_revenue
    15 FROM "User_Purchased_Package" upp
    16 JOIN "Package" p ON p.package_id = upp.package_id
    17 GROUP BY p.package_name
    18 ORDER BY gross_revenue DESC, num_purchases DESC;
     150{
     151  "Plan": {
     152    "Node Type": "Index Scan",
     153    "Parallel Aware": false,
     154    "Async Capable": false,
     155    "Scan Direction": "Forward",
     156    "Index Name": "idx_event_date_time",
     157  ...
     158}
    19159}}}
    20 
    21 == 2) Популарност и приход: Merch ==
    22 Мерч – број на продажби и бруто приход:
    23 
    24160{{{
    25 #!sql
    26 SELECT
    27 m.item_name,
    28 COUNT(*) AS num_sales,
    29 SUM(m.price) AS gross_revenue
    30 FROM "User_Purchased_Merch" upm
    31 JOIN "Merch_Items" m ON m.merch_id = upm.merch_id
    32 GROUP BY m.item_name
    33 ORDER BY gross_revenue DESC, num_sales DESC;
     161{
     162    "Node Type": "Index Scan",
     163    "Parent Relationship": "Outer",
     164    "Parallel Aware": false,
     165    "Async Capable": false,
     166    "Scan Direction": "Forward",
     167    "Index Name": "idx_class_date_time",
     168  ...
     169}
    34170}}}
    35 
    36