Version 6 (modified by 2 days ago) ( diff ) | ,
---|
Напреден апликативен развој
Линк до GitHub https://github.com/fjakimov/DatabasesProject.git
Имплементирани се сите сценарија од фаза 3 со следниве дополнителни подобрувања:
- Подобрување на начинот на избор на доделување на соба од страна на вработениот доколку студентот нема посебно барање за соба сега не е по случаен избор туку вработениот има уреден преглед на капацитетот на блоковите, спратовите, и зафатеност на соби ( дали се резервирани или не ) и врз основа на тоа го сместува студентот. За ова подобрување е додадена само една нова колона во табелата Block ( total_rooms ) која ја искористив за пресметка на капацитет по спратовите во блокот
- Имплементирана е нова функционалност која не е дефинирана во фаза 3 а тоа е можност за барање на прекин на престој во собата од страна на студентот. За оваа функционалност се додадени две нови колони во StudentTookRoom (end_stay_requested од тип boolean и requested_end_date од тип date)
Тригери
Автоматско зголемување на капацитет на собата доколку има внесено краен датум на собата во која престојувал.
CREATE OR REPLACE FUNCTION update_room_on_end_stay() RETURNS TRIGGER AS $$ BEGIN IF NEW.end_date IS NOT NULL THEN UPDATE project.room SET project.capacity = capacity + 1, project.is_available = TRUE WHERE project.room_number = NEW.room_num AND project.block_id = NEW.block_id::char(1); END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trg_update_room_on_end_stay AFTER UPDATE OF end_date ON project.studenttookroom FOR EACH ROW EXECUTE FUNCTION update_room_on_end_stay();
Автоматско менување на статусот на собата доколку некој од прегледаните документи се со статус Declined
CREATE OR REPLACE FUNCTION update_room_request_on_doc_decline() RETURNS TRIGGER AS $$ BEGIN IF NEW.d_status = 'Declined' THEN UPDATE roomrequest SET status = 'Declined' WHERE student_id = NEW.student_id END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trg_update_room_request AFTER UPDATE OF d_status ON dorm_document FOR EACH ROW EXECUTE FUNCTION update_room_request_on_doc_decline();
Трансакции
Апликацијата користи трансакции во следните два фајла:
- За доделување на соба на студентот: src/main/java/org/example/dormallocationsystem/Service/Impl/EmployeeServiceImpl.java
- За плаќање на станарината за месец: src/main/java/org/example/dormallocationsystem/Service/Impl/PaymentServiceImpl.java
Индекси
Бидејќи PostgreSQL поседува напреден оптимизатор за извршување на прашалници, системот самостојно одлучува дали е поефикасно да се искористи постоечки индекс или да се изврши целосно читање на табелата (sequential scan). Во одредени случаи, при често извршувани прашалници, дополнителни индекси не беа потребни, бидејќи оптимизаторот успешно ги користеше автоматски креираните индекси преку примарен клуч. Сепак, кај следниве два прашалници кои се често извршуваат имаше извршување преку sequential scan, односно пребарување низ целата табела, што може значително да влијае врз перформансите доколку има многу податоци.
Случај 1.
Употребуван прашалник за преглед на документите на студентот:
select * from project.dorm_document where student_id = [id];
Креиран индекс:
create index idx_dorm_document_student_id on project.dorm_document(student_id);
Случај 2.
Употребуван прашалник за преглед на уплатената станарина од страна на студент
select distinct s.u_id, s.faculty_name, s.gender, s.is_exempt, s.year_of_studies from project.student s where exists ( select 1 from project.payment p where s.u_id = p.student_id );
Креиран индекс:
create index idx_payment_student_id on project.payment(student_id);
Напредни прашалници
Имплементирани се прашалниците за
- Бројка на соби кои поради претходна зафатеност не се доделени на студентите кои ги побарале
- Извештај за блокот (слободни соби и број на барања за соба во секој од блоковите)
Истите се наоѓаат во src/main/java/org/example/dormallocationsystem/Web/EmployeeController.java фајлот
@GetMapping("/dashboard") public String employeeDashboard(@RequestParam Long employeeId, Model model) { List<Student> studentsAddedToRoom = studentService.getStudentsAddedToRoom(); List<Student> studentsThatNeedToBeReviewed = studentService.getStudentsWithNotReviewedDocs(); List<Studenttookroom> endStayRequests = studentTookRoomService.getPendingEndStayRequests(); List<BlockRoomReportDTO> blockReport = blockService.getBlockRoomReport(); List<RoomMismatchDTO> roomMismatches = roomRequestService.findRoomMismatches(); model.addAttribute("employeeId", employeeId); model.addAttribute("addedToRoomStudents", studentsAddedToRoom); model.addAttribute("studentsToReview", studentsThatNeedToBeReviewed); model.addAttribute("endStayRequests", endStayRequests); model.addAttribute("blockReport", blockReport); model.addAttribute("roomMismatches", roomMismatches); return "employee-dashboard"; }
Attachments (5)
- advanced-queries.jpg (112.5 KB ) - added by 2 days ago.
- after-index-creation.jpg (69.6 KB ) - added by 2 days ago.
- before-index-creation.jpg (57.1 KB ) - added by 2 days ago.
- without-payment-index.jpg (139.3 KB ) - added by 2 days ago.
- with-payment-index.jpg (119.3 KB ) - added by 2 days ago.
Download all attachments as: .zip