| 140 | [[Image(SearchHotel.png)]] |
| 141 | {{{#!java |
| 142 | public List<HotelRoomAvailable> getRoomsAvailibilityByDateAndLocation(String hotelLocation, Date dateFrom, Date dateTo, int numberOfBeds, Boolean flexible) { |
| 143 | if(flexible) |
| 144 | { |
| 145 | Calendar calendar = Calendar.getInstance(); |
| 146 | Calendar calendar1 = Calendar.getInstance(); |
| 147 | calendar.setTime(dateTo); |
| 148 | calendar1.setTime(dateFrom); |
| 149 | return em.createQuery("SELECT hr FROM HotelRoomAvailable hr WHERE " + |
| 150 | "((hr.dateFrom <= :dateTo AND hr.dateTo >= :dateFrom) OR " + |
| 151 | "(hr.dateFrom <= :dateToMinus1 AND hr.dateTo >= :dateFromMinus1) OR " + |
| 152 | "(hr.dateFrom <= :dateToMinus2 AND hr.dateTo >= :dateFromMinus2) OR " + |
| 153 | "(hr.dateFrom <= :dateToMinus3 AND hr.dateTo >= :dateFromMinus3) OR " + |
| 154 | "(hr.dateFrom <= :dateToPlus1 AND hr.dateTo >= :dateFromPlus1) OR " + |
| 155 | "(hr.dateFrom <= :dateToPlus2 AND hr.dateTo >= :dateFromPlus2) OR " + |
| 156 | "(hr.dateFrom <= :dateToPlus3 AND hr.dateTo >= :dateFromPlus3)) " + |
| 157 | "AND hr.hotelRoom.hotel.hotelLocation LIKE :hotelLocation " + |
| 158 | "AND hr.hotelRoom.numOfBeds >= :numBeds") |
| 159 | .setParameter("hotelLocation", hotelLocation) |
| 160 | .setParameter("dateFrom", dateFrom) |
| 161 | .setParameter("dateTo", dateTo) |
| 162 | .setParameter("dateToMinus1", subtractDays(calendar, 1)) |
| 163 | .setParameter("dateToMinus2", subtractDays(calendar, 2)) |
| 164 | .setParameter("dateToMinus3", subtractDays(calendar, 3)) |
| 165 | .setParameter("dateToPlus1", addDays(calendar, 1)) |
| 166 | .setParameter("dateToPlus2", addDays(calendar, 2)) |
| 167 | .setParameter("dateToPlus3", addDays(calendar, 3)) |
| 168 | .setParameter("dateFromMinus1", subtractDays(calendar1, 1)) |
| 169 | .setParameter("dateFromMinus2", subtractDays(calendar1, 2)) |
| 170 | .setParameter("dateFromMinus3", subtractDays(calendar1, 3)) |
| 171 | .setParameter("dateFromPlus1", addDays(calendar1, 1)) |
| 172 | .setParameter("dateFromPlus2", addDays(calendar1, 2)) |
| 173 | .setParameter("dateFromPlus3", addDays(calendar1, 3)) |
| 174 | .setParameter("numBeds", numberOfBeds) |
| 175 | .getResultList(); |
| 176 | } |
| 177 | else |
| 178 | { |
| 179 | return em.createQuery("SELECT hr FROM HotelRoomAvailable hr WHERE " + |
| 180 | "((hr.dateFrom <= :dateTo AND hr.dateTo >= :dateFrom)) " + |
| 181 | "AND hr.hotelRoom.hotel.hotelLocation LIKE :hotelLocation " + |
| 182 | "AND hr.hotelRoom.numOfBeds >= :numBeds") |
| 183 | .setParameter("hotelLocation", hotelLocation) |
| 184 | .setParameter("dateFrom", dateFrom) |
| 185 | .setParameter("dateTo", dateTo) |
| 186 | .setParameter("numBeds", numberOfBeds) |
| 187 | .getResultList(); |
| 188 | } |
| 189 | } |
| 190 | }}} |
| 191 | Ова е кверито од кое се зимаат хотелите по криетриум, каде што првиот дел е додека флексибилноста од 3 дена има вредност true, па тогаш се листаат +/- (1,2,3) дена од бараните критериуми, а доколку има вредност false тогаш се листаат според точните дати кои се внесени. |
| 231 | {{{#!java |
| 232 | public List<RestaurantsAvailible> getTablesByDateAndLocation(String restaurantLocation, Date hourFrom, Date hourTo, int noSeats){ |
| 233 | return em.createQuery("select hr from RestaurantsAvailible hr where hr.hourFrom <= :hourFrom and hr.hourTo >= :hourTo " + |
| 234 | "and hr.restaurantTable.restaurant.restaurantLocation LIKE :restaurantLocation and hr.restaurantTable.noSeats >= :noSeats") |
| 235 | .setParameter("restaurantLocation", restaurantLocation) |
| 236 | .setParameter("hourFrom", hourFrom) |
| 237 | .setParameter("hourTo", hourTo) |
| 238 | .setParameter("noSeats", noSeats) |
| 239 | .getResultList(); |
| 240 | } |
| 241 | }}} |
| 242 | Ова е кверито кое ги листа сите маси во одредена локација, со одредено време на доаѓање, заминување и бројка колку луѓе ќе дојдат. |
| 243 | |
| 244 | {{{#!java |
| 245 | public List<RestaurantDto> getTablesByDateAndLocation(String restaurantLocation, Date date, String hourFrom, String hourTo, int noSeats) { |
| 246 | Date dateFrom = date; |
| 247 | Date dateTo = Date.from(date.toInstant()); |
| 248 | String[] splittedFrom = hourFrom.split(":"); |
| 249 | String[] splittedTo = hourTo.split(":"); |
| 250 | dateFrom.setHours(Integer.parseInt(splittedFrom[0])); |
| 251 | dateFrom.setMinutes(Integer.parseInt(splittedFrom[1])); |
| 252 | dateTo.setHours(Integer.parseInt(splittedTo[0])); |
| 253 | dateTo.setMinutes(Integer.parseInt(splittedTo[1])); |
| 254 | |
| 255 | List<RestaurantsAvailible> restaurantsAvailibles = restaurantDao.getTablesByDateAndLocation(restaurantLocation, hourFrom, hourTo, noSeats); |
| 256 | Map<Restaurant, List<RestaurantsAvailible>> tablesByRestaurants = restaurantsAvailibles.stream().collect(Collectors.groupingBy(x -> x.getRestaurantTable().getRestaurant())); |
| 257 | List<RestaurantDto> restaurantsList = tablesByRestaurants.keySet().stream() |
| 258 | .map(x -> new RestaurantDto( |
| 259 | x.getRestaurantID(), |
| 260 | x.getRestaurantName(), |
| 261 | x.getRestaurantLocation(), |
| 262 | x.getCousineType(), |
| 263 | x.getRestaurantDescription(), |
| 264 | x.getRestaurantEdbs(), |
| 265 | x.getMenus(), |
| 266 | tablesByRestaurants.get(x), |
| 267 | getReviewsForRestaurant(x.getRestaurantID()), |
| 268 | getReviewsForRestaurant(x.getRestaurantID()).stream().mapToDouble(Reviews::getNumStar).average().orElse(0), |
| 269 | getRestaurantImages(x.getRestaurantID()), |
| 270 | getMenuImagesByRestaurant(x.getRestaurantID()) |
| 271 | )).toList(); |
| 272 | return restaurantsList; |
| 273 | } |
| 274 | }}} |
| 275 | Сервисот кој исто како и во хотели користи Dto притоа ги листа сите ресторани кои можат да го опслужат барањето од корисниците. Со тоа што времето од-до се интерпретира како текст, па тие ги средуваме во сервисот. |
| 276 | {{{#!java |
| 277 | @GetMapping(path = "/restaurant/search") |
| 278 | public List<RestaurantDto> searchAvailableRestaurant(@RequestParam(name = "restaurantLocation") String restaurantLocation, |
| 279 | @RequestParam(name = "date") @DateTimeFormat(pattern = "yyyy-MM-dd") Date date, |
| 280 | @RequestParam(name = "hourFrom") String hourFrom, |
| 281 | @RequestParam(name = "hourTo") String hourTo, |
| 282 | @RequestParam(name = "numPeople") int noSeats) { |
| 283 | |
| 284 | return restaurantManager.getTablesByDateAndLocation(restaurantLocation, date, dateFrom, dateTo, noSeats); |
| 285 | } |
| 286 | }}} |
| 287 | Во контролерот се примаат податоци за локација, датум, време од до во форма на текст и број на седишта |
183 | | |
184 | | |
| 290 | {{{#!java |
| 291 | public List<TransportRoute> getTransportsAvailableByFilters(String fromL, String toL, Date date, int numPassengers) { |
| 292 | return em.createQuery("select h from TransportRoute h where h.from = :froml and h.to = :tol and h.freeSpace >= :nump") |
| 293 | .setParameter("froml", fromL) |
| 294 | .setParameter("tol", toL) |
| 295 | .setParameter("nump", numPassengers) |
| 296 | .getResultList(); |
| 297 | } |
| 298 | }}} |
| 299 | Ова е кверито со кое се наоѓаат сите слобдни транспорти со одредена дата од-до одредено место и број на патници |
| 300 | {{{#!java |
| 301 | public List<TransportListingDto> getTransportsAvailableByFilters(String from, String to, Date date, int numPassengers) { |
| 302 | List<TransportRoute> transportAvailable = transportDao.getTransportsAvailableByFilters(from, to, date, numPassengers); |
| 303 | Map<TransportAvailible, List<TransportRoute>> transportsByTransporter = transportAvailable.stream().collect(Collectors.groupingBy(x -> x.getParentRoute())); |
| 304 | List<TransportListingDto> transportList = transportsByTransporter.keySet().stream().toList().stream() |
| 305 | .map(x -> new TransportListingDto( |
| 306 | x.getTransportAvailibleId(), |
| 307 | x.getFrom(), |
| 308 | x.getTo(), |
| 309 | x.getDate(), |
| 310 | x.getFreeSpace(), |
| 311 | x.getTime(), |
| 312 | transportsByTransporter.get(x).stream().mapToDouble(y -> y.getPrice()).min().getAsDouble(), |
| 313 | x.getRoutes(), |
| 314 | x.getTransport(), |
| 315 | getReviewsForTransport(x.getTransport().getTransportID()), |
| 316 | getReviewsForTransport(x.getTransport().getTransportID()).stream().mapToDouble(Reviews::getNumStar).average().orElse(0) |
| 317 | )).collect(Collectors.toList()); |
| 318 | return transportList; |
| 319 | } |
| 320 | }}} |
| 321 | Исто како и останатите имаме Dto и ги листаме сите слобдони транспорти со наведените критериуми. Притоа што доколку се внесе некој град кој е попатен во некоја рута се листа и таа со тоа што се зима главната рута на тој град. |
| 322 | {{{#!comment |
| 323 | Не знам дали вака види |
| 324 | }}} |
| 325 | {{{#!java |
| 326 | @GetMapping(path = "/transport/search") |
| 327 | public List<TransportListingDto> searchAvailableTransport(@RequestParam(name = "from") String from, |
| 328 | @RequestParam(name = "to") String to, |
| 329 | @RequestParam(name = "date") @DateTimeFormat(pattern = "yyyy-MM-dd") Date date, |
| 330 | @RequestParam(name = "numPassengers") int numPassengers){ |
| 331 | return transportManager.getTransportsAvailableByFilters(from, to, date, numPassengers); |
| 332 | } |
| 333 | }}} |
| 334 | Контролерот кој според влезните критериуми ги листаме сите слобдони транспорти за тие дестинации. |