Skip to content

Commit dd73718

Browse files
committed
fix16
1 parent 1fb4b1c commit dd73718

2 files changed

Lines changed: 44 additions & 50 deletions

File tree

ewm-service/src/main/java/ru/practicum/ewm/event/repository/EventRepository.java

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -16,46 +16,49 @@ public interface EventRepository extends JpaRepository<Event, Long> {
1616

1717
boolean existsByCategoryId(Long categoryId);
1818

19-
@Query("SELECT DISTINCT e FROM Event e " +
20-
"LEFT JOIN FETCH e.category " +
21-
"LEFT JOIN FETCH e.initiator " +
22-
"WHERE (:users IS NULL OR e.initiator.id IN :users) " +
23-
"AND (:states IS NULL OR e.state IN :states) " +
24-
"AND (:categories IS NULL OR e.category.id IN :categories) " +
25-
"AND (:rangeStart IS NULL OR e.eventDate >= :rangeStart) " +
26-
"AND (:rangeEnd IS NULL OR e.eventDate <= :rangeEnd)")
27-
Page<Event> findAllByAdminFilters(@Param("users") List<Long> users,
28-
@Param("states") List<EventState> states,
29-
@Param("categories") List<Long> categories,
30-
@Param("rangeStart") LocalDateTime rangeStart,
31-
@Param("rangeEnd") LocalDateTime rangeEnd,
32-
Pageable pageable);
33-
34-
@Query("SELECT DISTINCT e FROM Event e " +
35-
"LEFT JOIN FETCH e.category " +
36-
"LEFT JOIN FETCH e.initiator " +
19+
@Query(value = "SELECT DISTINCT e.* FROM events e " +
20+
"LEFT JOIN categories c ON c.id = e.category_id " +
21+
"LEFT JOIN users u ON u.id = e.initiator_id " +
22+
"WHERE (COALESCE(cast(:users AS bigint[]), ARRAY[]::bigint[]) = ARRAY[]::bigint[] OR e.initiator_id IN (:users)) " +
23+
"AND (COALESCE(cast(:states AS varchar[]), ARRAY[]::varchar[]) = ARRAY[]::varchar[] OR e.state IN (:states)) " +
24+
"AND (COALESCE(cast(:categories AS bigint[]), ARRAY[]::bigint[]) = ARRAY[]::bigint[] OR e.category_id IN (:categories)) " +
25+
"AND e.event_date >= COALESCE(:rangeStart, '1900-01-01'::timestamp) " +
26+
"AND e.event_date <= COALESCE(:rangeEnd, '3000-01-01'::timestamp) " +
27+
"OFFSET :offset ROWS FETCH NEXT :size ROWS ONLY", nativeQuery = true)
28+
List<Event> findAllByAdminFiltersNative(@Param("users") List<Long> users,
29+
@Param("states") List<String> states,
30+
@Param("categories") List<Long> categories,
31+
@Param("rangeStart") LocalDateTime rangeStart,
32+
@Param("rangeEnd") LocalDateTime rangeEnd,
33+
@Param("offset") int offset,
34+
@Param("size") int size);
35+
36+
@Query(value = "SELECT DISTINCT e.* FROM events e " +
37+
"LEFT JOIN categories c ON c.id = e.category_id " +
38+
"LEFT JOIN users u ON u.id = e.initiator_id " +
3739
"WHERE e.state = 'PUBLISHED' " +
38-
"AND (:text IS NULL OR LOWER(e.annotation) LIKE LOWER(CONCAT('%', :text, '%')) OR LOWER(e.description) LIKE LOWER(CONCAT('%', :text, '%'))) " +
39-
"AND (:categories IS NULL OR e.category.id IN :categories) " +
40+
"AND (COALESCE(:text, '') = '' OR " +
41+
" LOWER(e.annotation::text) LIKE LOWER(CONCAT('%', :text, '%')) OR " +
42+
" LOWER(e.description::text) LIKE LOWER(CONCAT('%', :text, '%'))) " +
43+
"AND (COALESCE(cast(:categories AS bigint[]), ARRAY[]::bigint[]) = ARRAY[]::bigint[] OR e.category_id IN (:categories)) " +
4044
"AND (:paid IS NULL OR e.paid = :paid) " +
41-
"AND (:rangeStart IS NULL OR e.eventDate >= :rangeStart) " +
42-
"AND (:rangeEnd IS NULL OR e.eventDate <= :rangeEnd)")
43-
Page<Event> findPublishedEventsWithFilters(@Param("text") String text,
44-
@Param("categories") List<Long> categories,
45-
@Param("paid") Boolean paid,
46-
@Param("rangeStart") LocalDateTime rangeStart,
47-
@Param("rangeEnd") LocalDateTime rangeEnd,
48-
Pageable pageable);
45+
"AND e.event_date >= COALESCE(:rangeStart, '1900-01-01'::timestamp) " +
46+
"AND e.event_date <= COALESCE(:rangeEnd, '3000-01-01'::timestamp) " +
47+
"OFFSET :offset ROWS FETCH NEXT :size ROWS ONLY", nativeQuery = true)
48+
List<Event> findPublishedEventsWithFiltersNative(@Param("text") String text,
49+
@Param("categories") List<Long> categories,
50+
@Param("paid") Boolean paid,
51+
@Param("rangeStart") LocalDateTime rangeStart,
52+
@Param("rangeEnd") LocalDateTime rangeEnd,
53+
@Param("offset") int offset,
54+
@Param("size") int size);
4955

5056
@Query("SELECT COUNT(r) FROM Request r WHERE r.event.id = :eventId AND r.status = 'CONFIRMED'")
5157
Long countConfirmedRequests(@Param("eventId") Long eventId);
5258

5359
@Query("SELECT r.event.id, COUNT(r) FROM Request r WHERE r.event.id IN :eventIds AND r.status = 'CONFIRMED' GROUP BY r.event.id")
5460
Map<Long, Long> countConfirmedRequestsBatch(@Param("eventIds") List<Long> eventIds);
5561

56-
@Query("SELECT e FROM Event e " +
57-
"LEFT JOIN FETCH e.category " +
58-
"LEFT JOIN FETCH e.initiator " +
59-
"WHERE e.initiator.id = :initiatorId")
62+
@Query("SELECT e FROM Event e LEFT JOIN FETCH e.category LEFT JOIN FETCH e.initiator WHERE e.initiator.id = :initiatorId")
6063
Page<Event> findAllByInitiatorIdWithDetails(@Param("initiatorId") Long initiatorId, Pageable pageable);
6164
}

ewm-service/src/main/java/ru/practicum/ewm/event/service/EventServiceImpl.java

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
import jakarta.servlet.http.HttpServletRequest;
44
import lombok.RequiredArgsConstructor;
55
import lombok.extern.slf4j.Slf4j;
6-
import org.springframework.data.domain.Page;
76
import org.springframework.data.domain.PageRequest;
8-
import org.springframework.data.domain.Pageable;
97
import org.springframework.stereotype.Service;
108
import org.springframework.transaction.annotation.Transactional;
119
import ru.practicum.ewm.category.model.Category;
@@ -57,8 +55,8 @@ public EventFullDto createEvent(Long userId, NewEventDto dto) {
5755
@Transactional(readOnly = true)
5856
public List<EventShortDto> getUserEvents(Long userId, int from, int size) {
5957
PageRequest page = PageRequest.of(from / size, size);
60-
List<Event> events = eventRepository.findAllByInitiatorIdWithDetails(userId, page).getContent();
61-
return events.stream()
58+
var eventsPage = eventRepository.findAllByInitiatorIdWithDetails(userId, page);
59+
return eventsPage.getContent().stream()
6260
.map(event -> EventMapper.toEventShortDto(event, 0L, 0L))
6361
.collect(Collectors.toList());
6462
}
@@ -103,9 +101,6 @@ public EventFullDto updateUserEvent(Long userId, Long eventId, UpdateEventUserRe
103101
@Override
104102
@Transactional(readOnly = true)
105103
public List<EventFullDto> getEventsForAdmin(AdminEventSearchParams params) {
106-
List<EventState> stateEnums = (params.getStates() == null) ? null :
107-
params.getStates().stream().map(EventState::valueOf).collect(Collectors.toList());
108-
109104
int from = params.getFrom();
110105
int size = params.getSize();
111106
if (size <= 0 || from < 0) {
@@ -115,16 +110,14 @@ public List<EventFullDto> getEventsForAdmin(AdminEventSearchParams params) {
115110
LocalDateTime start = params.getRangeStart();
116111
LocalDateTime end = params.getRangeEnd();
117112

118-
PageRequest page = PageRequest.of(from / size, size);
119-
Page<Event> eventsPage = eventRepository.findAllByAdminFilters(
120-
params.getUsers(), stateEnums, params.getCategories(), start, end, page);
113+
List<Event> events = eventRepository.findAllByAdminFiltersNative(
114+
params.getUsers(), params.getStates(), params.getCategories(),
115+
start, end, from, size);
121116

122-
List<Long> eventIds = eventsPage.getContent().stream()
123-
.map(Event::getId)
124-
.collect(Collectors.toList());
117+
List<Long> eventIds = events.stream().map(Event::getId).collect(Collectors.toList());
125118
Map<Long, Long> confirmedRequestsMap = eventRepository.countConfirmedRequestsBatch(eventIds);
126119

127-
return eventsPage.stream()
120+
return events.stream()
128121
.map(event -> EventMapper.toEventFullDto(event, 0L, confirmedRequestsMap.getOrDefault(event.getId(), 0L)))
129122
.collect(Collectors.toList());
130123
}
@@ -195,11 +188,9 @@ public List<EventShortDto> getEventsForPublic(PublicEventSearchParams params, Ht
195188

196189
statsClient.sendHit(request);
197190

198-
Pageable pageable = PageRequest.of(from / size, size);
199-
Page<Event> eventPage = eventRepository.findPublishedEventsWithFilters(
191+
List<Event> events = eventRepository.findPublishedEventsWithFiltersNative(
200192
params.getText(), params.getCategories(), params.getPaid(),
201-
rangeStart, rangeEnd, pageable);
202-
List<Event> events = eventPage.getContent();
193+
rangeStart, rangeEnd, from, size);
203194

204195
Map<Long, Long> confirmedRequestsMap = getConfirmedRequestsMap(events);
205196

0 commit comments

Comments
 (0)