Changes between Version 1 and Version 2 of AdvancedApplicationDesign_v2


Ignore:
Timestamp:
09/03/25 20:59:38 (6 days ago)
Author:
212012
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedApplicationDesign_v2

    v1 v2  
    9595}}}
    9696
    97 {{{#!div
    98 {{{#!sql
    99 }}}
    100 }}}
     97= Индексирање =
     98
     99==== Индекси за {{{People}}} табелата ====
     100{{{#!div
     101{{{#!sql
     102create index idx_people_embg on People(embg);
     103}}}
     104}}}
     105
     106{{{#!div
     107{{{#!sql
     108create index idx_people_names on People(first_name, last_name);
     109}}}
     110}}}
     111
     112{{{#!div
     113{{{#!sql
     114create index idx_people_nationality on People(nationality);
     115}}}
     116}}}
     117
     118==== Индекси за {{{Crime_case}}} табелата ====
     119
     120{{{#!div
     121{{{#!sql
     122create index idx_crime_case_status on Crime_case(c_status);
     123}}}
     124}}}
     125
     126{{{#!div
     127{{{#!sql
     128create index idx_crime_case_date on Crime_case(opening_date);
     129}}}
     130}}}
     131
     132==== Индекси за {{{Statements}}} табелата ====
     133
     134{{{#!div
     135{{{#!sql
     136create index idx_statements_date on Statements(statement_date);
     137}}}
     138}}}
     139
     140{{{#!div
     141{{{#!sql
     142create index idx_statements_incident on Statements(incident_timestamp);
     143}}}
     144}}}
     145
     146==== Индекси за {{{Evidence}}} табелата ====
     147
     148{{{#!div
     149{{{#!sql
     150create index idx_evidence_type on Evidence(e_type);
     151}}}
     152}}}
     153
     154{{{#!div
     155{{{#!sql
     156create index idx_evidence_found on Evidence(is_found);
     157}}}
     158}}}
     159
     160==== Индекси за {{{Policeman}}} табелата ====
     161
     162{{{#!div
     163{{{#!sql
     164create index idx_policeman_rank on Policeman(rank);
     165}}}
     166}}}
     167
     168= Функции и тригери =
     169=== Траење на случај во денови ===
     170{{{#!div
     171{{{#!sql
     172create or replace function calculate_case_duration(case_id bigint)
     173returns integer as $$
     174declare
     175    opening_date date;
     176    closing_date date;
     177    duration integer;
     178begin
     179    select cc.opening_date into opening_date
     180    from Crime_case as cc
     181    where cc.c_id = case_id;
     182   
     183    select sc.date_of_closing into closing_date
     184    from Solved_case as sc
     185    where sc.c_id = case_id;
     186   
     187    if closing_date is not null then
     188        duration := closing_date - opening_date;
     189    else
     190        duration := CURRENT_DATE - opening_date;
     191    end if;
     192   
     193    return duration;
     194end;
     195$$ language plpgsql;
     196}}}
     197}}}
     198
     199=== Промена на статус на случајот кога ќе биде завршен ===
     200
     201{{{#!div
     202{{{#!sql
     203create or replace function update_case_status_on_solve()
     204returns trigger as $$
     205begin
     206    update Crime_case
     207    set c_status = 'Z'
     208    where c_id = NEW.c_id and c_status = 'A';
     209   
     210    return new;
     211end;
     212$$ language plpgsql;
     213
     214create trigger trg_update_case_status
     215    after insert on Solved_case
     216    for each row
     217    execute function update_case_status_on_solve();
     218}}}
     219}}}
     220
     221= Процедури и трансакции =
     222=== Креирање на нов случај со иницјална изјава ===
     223{{{#!div
     224{{{#!sql
     225create or replace procedure create_crime_case(
     226    in p_case_name varchar(255),
     227    in p_police_station_id bigint,
     228    in p_policeman_id bigint,
     229    in p_victim_id bigint,
     230    in p_witness_id bigint,
     231    in p_statement_description varchar(10000),
     232    in p_incident_timestamp timestamp,
     233    in p_incident_place varchar(4000),
     234    in p_crime_types bigint[]
     235)
     236language plpgsql as $$
     237declare
     238    new_case_id bigint;
     239    new_statement_id bigint;
     240    crime_type_id bigint;
     241begin
     242    select coalesce(MAX(c_id), 0) + 1 into new_case_id from Crime_case;
     243   
     244    insert into Crime_case (c_id, c_name, opening_date, c_status, p_id)
     245    values (new_case_id, p_case_name, CURRENT_DATE, 'A', p_police_station_id);
     246   
     247    select coalesce(MAX(s_id), 0) + 1 INTO new_statement_id FROM Statements;
     248   
     249    insert into Statements (s_id, statement_date, description, incident_timestamp, incident_place, c_id, pe_id, victim_pe_id, witness_pe_id)
     250    values (new_statement_id, CURRENT_DATE, p_statement_description, p_incident_timestamp, p_incident_place, new_case_id, p_policeman_id, p_victim_id, p_witness_id);
     251   
     252    foreach crime_type_id IN ARRAY p_crime_types
     253    loop
     254        insert into Case_belongs_to_type_of_crime (c_id, t_id)
     255        values (new_case_id, crime_type_id);
     256    end loop;
     257   
     258    raise notice 'Случајот % е успешно креиран со изјава %', new_case_id, new_statement_id;
     259end;
     260$$;
     261}}}
     262}}}
     263
     264=== Трансфер на случај помеѓу полициски станици ===
     265
     266{{{#!div
     267{{{#!sql
     268do $$
     269declare
     270    v_case_id bigint := 1;
     271    v_old_station bigint;
     272    v_new_station bigint := 2;
     273    v_new_officer bigint;
     274begin
     275    -- Get current station
     276    select p_id into v_old_station from Crime_case where c_id = v_case_id;
     277   
     278    -- Get officer for new station
     279    select pe_id into v_new_officer from Police_station where p_id = v_new_station;
     280   
     281    -- Transfer case
     282    update Crime_case
     283    set p_id = v_new_station
     284    where c_id = v_case_id;
     285   
     286    -- Add transfer statement
     287    insert into Statements (s_id, statement_date, description, incident_timestamp,
     288                          incident_place, c_id, pe_id, victim_pe_id, witness_pe_id)
     289    select coalesce(MAX(s_id), 0) + 1, CURRENT_DATE, 'Случајот е префрлен од станица ' || v_old_station || ' во станица ' || v_new_station, CURRENT_TIMESTAMP, 'Префрлување на случај', v_case_id, (select pe_id from Policeman where p_id = v_new_station limit 1), 2, 3
     290    from Statements;
     291   
     292    raise notice 'Случајот со ID % е префрлен од полициска станица % во полициска станица %', v_case_id, v_old_station, v_new_station;   
     293
     294exception
     295    when others then
     296        raise exception 'Transaction failed: %', SQLERRM;
     297end;
     298$$;
     299}}}
     300}}}