diff --git a/src/main/java/ru/practicum/shareit/booking/BookingRepository.java b/src/main/java/ru/practicum/shareit/booking/BookingRepository.java index 0f57bf3..2fc0e0f 100644 --- a/src/main/java/ru/practicum/shareit/booking/BookingRepository.java +++ b/src/main/java/ru/practicum/shareit/booking/BookingRepository.java @@ -34,18 +34,22 @@ public interface BookingRepository extends JpaRepository, Queryds Optional findByItemNextBooking(Long itemId, LocalDateTime now); @Query(value = """ - select b from Booking as b where b.item.id in ?1 - and b.status='APPROVED' - and b.startTime < ?2 - order by b.startTime desc + select b from Booking as b + join(select b.item.id as item, max(b.startTime) as firstStartTime + from Booking as b + where b.startTime < ?2 and b.status='APPROVED' + group by b.item.id) as subquery on b.item.id=subquery.item and b.startTime = subquery.firstStartTime + where b.item.id in ?1 """) List findAllByItemsLastBooking(List itemIds, LocalDateTime now); @Query(value = """ - select b from Booking as b where b.item.id in ?1 - and b.status='APPROVED' - and b.startTime > ?2 - order by b.startTime asc + select b from Booking as b + join(select b.item.id as item, min(b.startTime) as firstStartTime + from Booking as b + where b.startTime > ?2 and b.status='APPROVED' + group by b.item.id) as subquery on b.item.id=subquery.item and b.startTime = subquery.firstStartTime + where b.item.id in ?1 """) List findAllByItemsNextBooking(List itemIds, LocalDateTime now); diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java index 81ae057..673f403 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -90,23 +90,17 @@ public List getAllOfOwner(Long userId) { .findAllByItemsLastBooking(new ArrayList<>(itemMap.keySet()), LocalDateTime.now()); List nextBookings = bookingRepository .findAllByItemsNextBooking(new ArrayList<>(itemMap.keySet()), LocalDateTime.now()); - Map> lastBookingsByItem = lastBookings.stream() - .collect(Collectors.groupingBy(booking -> booking.getItem().getId())); - Map> nextBookingsByItem = nextBookings.stream() - .collect(Collectors.groupingBy(booking -> booking.getItem().getId())); - Map lastBookingByItem = lastBookingsByItem.keySet().stream() - .map(id -> lastBookingsByItem.get(id).getFirst()) - .collect(Collectors.toMap(booking -> booking.getItem().getId(), item -> item)); - Map nextBookingByItem = nextBookingsByItem.keySet().stream() - .map(id -> nextBookingsByItem.get(id).getFirst()) - .collect(Collectors.toMap(booking -> booking.getItem().getId(), item -> item)); + Map next = nextBookings.stream() + .collect(Collectors.toMap(booking -> booking.getItem().getId(), booking -> booking)); + Map last = lastBookings.stream() + .collect(Collectors.toMap(booking -> booking.getItem().getId(), booking -> booking)); List comments = commentRepository.findAllByItemIdIn(new ArrayList<>(itemMap.keySet())); Map> commentsByItem = comments.stream() .collect(Collectors.groupingBy(comment -> comment.getItem().getId())); return itemMap.keySet().stream() .map(id -> itemMapper.toInfoDto(itemMap.get(id), - lastBookingByItem.get(id), - nextBookingByItem.get(id), + last.get(id), + next.get(id), commentsByItem.get(id))) .toList(); }