Changes between Version 1 and Version 2 of AdvancedApplicationDesign_v2


Ignore:
Timestamp:
08/29/25 15:24:23 (8 days ago)
Author:
212028
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedApplicationDesign_v2

    v1 v2  
    1 = Материјализирани погледи и индексирање =
     1= Материјализирани погледи =
    22
    33=== 1. Број казнети според линија секоја година ===
     
    1717order by godina, li.li_ime desc;
    1818
    19 create index idx_kazni_po_linija on kazni_po_linija_godisno(godina, li_ime);
    2019}}}
    2120}}}
     
    6261order by godina, li_ime;
    6362
    64 create index idx_vozenja_po_saat on maks_vozenja_po_saat_godisno (li_ime, godina, interval_1h);
    6563}}}
    6664}}}
     
    8280order by godina, li.li_id desc;
    8381
    84 create index idx_vozenja_po_linija on vozenja_po_linija_godisno (li_ime, godina);
    8582}}}
    8683}}}
     
    104101order by godina, broj_patnici desc;
    105102
    106 create index idx_patnici_po_postojka on patnici_po_postojka_godisno (godina, p_ime, li_ime);
    107103}}}
    108104}}}
     
    149145order by q1.godina, q1.tb_ime;
    150146
    151 create index idx_bileti_kupeni_od_cas on maks_kupeni_bileti_po_cas_godisno (tb_ime, godina, interval_1h);
    152147}}}
    153148}}}
     
    183178order by godina;
    184179
    185 create index idx_prihod_godisen on profit_kazni_i_bileti_godisno(godina);
    186 }}}
    187 }}}
     180}}}
     181}}}
     182
     183= Индексирање =
     184
     185
    188186
    189187= Тригери и фукниции =
    190188
    191 === 1. Промена на статус на билет ===
    192 
    193 {{{#!div
    194 {{{#!sql
    195 create or replace function bilet_status()
    196 returns trigger as
    197 $$
     189=== 1. Проверка на билет и ажурирање на статус на возење ===
     190
     191{{{#!div
     192{{{#!sql
     193create or replace function proverka_bilet_azuriranje_vozenja()
     194returns trigger as $$
    198195begin
    199     if new.b_status = 'expired' then
    200         raise exception 'билетот е веќе истечен';
    201     end if;
    202 
    203     if new.b_status = 'inactive' and new.b_datum_aktivacija is null then
    204         new.b_datum_aktivacija = now();
    205         new.b_status = 'active';
    206     end if;
    207 
    208     if new.b_status = 'active' and new.b_datum_aktivacija is not null then
    209         if exists (
    210             select 1
    211             from tipbilet tb
    212             where tb.tb_id = new.tb_id
    213                 and (new.b_datum_aktivacija + (tb.tb_trajnost || ' minutes')::interval) < now()
    214         ) then
    215             new.b_status = 'expired';
    216             raise exception 'билетот е истечен';
    217         end if;
     196    if exists (
     197        select 1
     198        from vozenje v
     199        where v.patnik_id = new.patnik_id
     200        and v.status = 'active'
     201        and v.vozenje_id != new.vozenje_id
     202    ) then
     203        update vozenje
     204        set end_date = new.start_date,
     205            status = 'finished'
     206        where patnik_id = new.patnik_id
     207        and status = 'active'
     208        and vozenje_id != new.vozenje_id;
     209    end if;
     210
     211    if exists (
     212        select 1
     213        from bilet b
     214        join tipbilet tb on b.tb_id = tb.tb_id
     215        where b.b_id = new.b_id
     216        and b.status = 'active'
     217        and (b.datum_na_kupuvanje + (tb.tb_trajnost || ' seconds')::interval) < now()
     218    ) then
     219        update bilet
     220        set status = 'expired'
     221        where b_id = new.b_id;
     222
     223        raise exception 'ticket % is expired', new.b_id;
    218224    end if;
    219225
     
    222228$$ language plpgsql;
    223229
    224 create or replace trigger proverka_bilet
    225 before insert or update on bilet
     230create or replace trigger menagiranje_vozenja
     231before insert on vozenje
    226232for each row
    227 execute function bilet_status();
    228 }}}
    229 }}}
    230 
    231 === 2. Промена на статус на билет ===
    232 
    233 {{{#!div
    234 {{{#!sql
    235 create or replace function vozenje_status()
    236 returns trigger as $$
    237 begin
    238     update vozenje
    239     set vozenje_end = now(), vozenje_status = 'finished'
    240     where patnik_k_id = new.patnik_k_id
    241         and vozenje_start is not null
    242         and vozenje_end is null
    243         and vozenje_status = 'active'
    244         and vozenje_id != new.vozenje_id;
    245 
    246     if new.vozenje_end is not null and new.vozenje_status != 'finished' then
    247         new.vozenje_status = 'finished';
    248     end if;
    249 
    250     if new.vozenje_end is null then
    251         new.vozenje_status = 'active';
    252     end if;
    253 
    254     return new;
    255 end;
    256 $$ language plpgsql;
    257 
    258 create or replace trigger vozenje_proverka
    259 before insert or update on vozenje
    260 for each row
    261 execute function vozenje_status();
     233execute function proverka_bilet_azuriranje_vozenja();
     234}}}
     235}}}
     236
     237{{{#!div
     238{{{#!sql
     239
    262240}}}
    263241}}}