| | 59 | |
| | 60 | == Промена во табелата !ScheduledFlight == |
| | 61 | |
| | 62 | При иницијално пополнување на податоците во табелата !ScheduledFlight, во колоната Distance беа поставени случајни податоци (искалкулирани според времето на полетување и слетување кои исто така се случајно пополнети). Со цен вршење на реални пресмети за цена на летовите како и поени за патниците потребно е да се знае вистинското растојание кое го поминува секој лет. |
| | 63 | |
| | 64 | За исполнување на таа цен потребно беше да се пресмета вистинското растојание употребувајќи ја новата колона Location во табелата Airport. PostGIS нуди функционалност пресметка на растојание помеѓу две точки ST_Distance. За промена на колоната Distance го извршивме следниот SQL код: |
| | 65 | |
| | 66 | {{{ |
| | 67 | #!sql |
| | 68 | update airport |
| | 69 | update scheduledflight as sf |
| | 70 | set distance = greatest(1, round(ST_Distance(dep.location, arr.location) / 1000)::int) |
| | 71 | from slot as ds |
| | 72 | join gate as dg on ds.gateid = dg.id |
| | 73 | join terminal as dt on dg.terminalid = dt.id |
| | 74 | join airport as dep on dep.id = dt.airportid, |
| | 75 | slot as asl |
| | 76 | join gate as ag on asl.gateid = ag.id |
| | 77 | join terminal as at on at.id = ag.terminalid |
| | 78 | join airport as arr on arr.id = at.airportid |
| | 79 | where sf.departure = ds.id and |
| | 80 | sf.arrival = asl.id and |
| | 81 | dep.location is not null and |
| | 82 | arr.location is not null; |
| | 83 | }}} |
| | 84 | |
| | 85 | Поради тоа што поставен е Check кој проверува дали растојанието е барем 1 километар, потребно беше да се избере поголемата вредност помеѓу 1 и ST_Distance(dep.location, arr.location) за да може успешно да се вметнат сите колони. |
| | 86 | |
| | 87 | === Тригер Calculate Distance === |
| | 88 | |
| | 89 | Иако кодот погоре ги корегира веќе постоечките податоци за Distance, при додавање на нов ScheduledFlight или промена на некој од слотовите за полетување и слетување не се врши повторна пресметка. За таа цел имплементиравме тригер кои при изведување на некои од овие активности врши повторна пресметка на растојанието. Вака се озовможува конзистентност на податоците. |
| | 90 | |
| | 91 | [attachment:CalculateDistance.sql] |