| | 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 | Контролерот кој според влезните критериуми ги листаме сите слобдони транспорти за тие дестинации. |