Skip to content

Commit 7deb096

Browse files
committed
fix32
1 parent 7956a00 commit 7deb096

2 files changed

Lines changed: 54 additions & 231 deletions

File tree

Lines changed: 27 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package ru.practicum.ewm.event.repository;
22

3+
import org.springframework.data.domain.Page;
34
import org.springframework.data.domain.Pageable;
45
import org.springframework.data.jpa.repository.JpaRepository;
56
import org.springframework.data.jpa.repository.Query;
67
import org.springframework.data.repository.query.Param;
78
import ru.practicum.ewm.event.model.Event;
9+
import ru.practicum.ewm.event.model.EventState;
810

911
import java.time.LocalDateTime;
1012
import java.util.List;
@@ -14,126 +16,47 @@ public interface EventRepository extends JpaRepository<Event, Long> {
1416

1517
boolean existsByCategoryId(Long categoryId);
1618

17-
@Query(value = "SELECT DISTINCT e.* FROM events e " +
18-
"LEFT JOIN categories c ON c.id = e.category_id " +
19-
"LEFT JOIN users u ON u.id = e.initiator_id " +
20-
"WHERE (COALESCE(cast(:users AS bigint[]), ARRAY[]::bigint[]) = ARRAY[]::bigint[] OR e.initiator_id IN (:users)) " +
21-
"AND (COALESCE(cast(:states AS varchar[]), ARRAY[]::varchar[]) = ARRAY[]::varchar[] OR e.state IN (:states)) " +
22-
"AND (COALESCE(cast(:categories AS bigint[]), ARRAY[]::bigint[]) = ARRAY[]::bigint[] OR e.category_id IN (:categories)) " +
23-
"AND e.event_date >= COALESCE(:rangeStart, '1900-01-01'::timestamp) " +
24-
"AND e.event_date <= COALESCE(:rangeEnd, '3000-01-01'::timestamp) " +
25-
"OFFSET :offset ROWS FETCH NEXT :size ROWS ONLY", nativeQuery = true)
26-
List<Event> searchEventsAdmin(@Param("users") List<Long> users,
27-
@Param("states") List<String> states,
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 (CAST(:rangeStart AS timestamp) IS NULL OR CAST(:rangeEnd AS timestamp) IS NULL OR e.eventDate BETWEEN :rangeStart AND :rangeEnd)")
26+
Page<Event> searchEventsAdmin(@Param("users") List<Long> users,
27+
@Param("states") List<EventState> states,
2828
@Param("categories") List<Long> categories,
2929
@Param("rangeStart") LocalDateTime rangeStart,
3030
@Param("rangeEnd") LocalDateTime rangeEnd,
31-
@Param("offset") int offset,
32-
@Param("size") int size);
31+
Pageable pageable);
3332

34-
@Query(value = "SELECT DISTINCT e.* FROM events e " +
35-
"LEFT JOIN categories c ON c.id = e.category_id " +
36-
"LEFT JOIN users u ON u.id = e.initiator_id " +
33+
@Query("SELECT e FROM Event e " +
3734
"WHERE e.state = 'PUBLISHED' " +
38-
"AND (COALESCE(:text, '') = '' OR " +
39-
" LOWER(e.annotation::text) LIKE LOWER(CONCAT('%', :text, '%')) OR " +
40-
" LOWER(e.description::text) LIKE LOWER(CONCAT('%', :text, '%'))) " +
41-
"AND (COALESCE(cast(:categories AS bigint[]), ARRAY[]::bigint[]) = ARRAY[]::bigint[] OR e.category_id IN (:categories)) " +
35+
"AND (:text IS NULL OR :text = '' OR " +
36+
" LOWER(e.annotation) LIKE LOWER(CONCAT('%', :text, '%')) OR " +
37+
" LOWER(e.description) LIKE LOWER(CONCAT('%', :text, '%'))) " +
38+
"AND (:categories IS NULL OR e.category.id IN :categories) " +
4239
"AND (:paid IS NULL OR e.paid = :paid) " +
43-
"AND e.event_date >= COALESCE(:rangeStart, '1900-01-01'::timestamp) " +
44-
"AND e.event_date <= COALESCE(:rangeEnd, '3000-01-01'::timestamp) " +
45-
"OFFSET :offset ROWS FETCH NEXT :size ROWS ONLY", nativeQuery = true)
46-
List<Event> searchEventsPublic(@Param("text") String text,
40+
"AND (CAST(:rangeStart AS timestamp) IS NULL OR e.eventDate >= :rangeStart) " +
41+
"AND (CAST(:rangeEnd AS timestamp) IS NULL OR e.eventDate <= :rangeEnd) " +
42+
"ORDER BY e.eventDate")
43+
Page<Event> searchEventsPublic(@Param("text") String text,
4744
@Param("categories") List<Long> categories,
4845
@Param("paid") Boolean paid,
4946
@Param("rangeStart") LocalDateTime rangeStart,
5047
@Param("rangeEnd") LocalDateTime rangeEnd,
51-
@Param("offset") int offset,
52-
@Param("size") int size);
48+
Pageable pageable);
5349

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

5753
@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")
5854
Map<Long, Long> countConfirmedRequestsBatch(@Param("eventIds") List<Long> eventIds);
5955

60-
@Query("SELECT e FROM Event e LEFT JOIN FETCH e.category LEFT JOIN FETCH e.initiator WHERE e.initiator.id = :initiatorId")
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 " +
60+
"ORDER BY e.id")
6161
List<Event> findAllByInitiatorIdWithDetails(@Param("initiatorId") Long initiatorId, Pageable pageable);
6262
}
63-
64-
//package ru.practicum.ewm.event.repository;
65-
//
66-
//import org.springframework.data.domain.Page;
67-
//import org.springframework.data.domain.Pageable;
68-
//import org.springframework.data.jpa.repository.JpaRepository;
69-
//import org.springframework.data.jpa.repository.Query;
70-
//import org.springframework.data.repository.query.Param;
71-
//import ru.practicum.ewm.event.model.Event;
72-
//import ru.practicum.ewm.event.model.EventState;
73-
//
74-
//import java.time.LocalDateTime;
75-
//import java.util.List;
76-
//import java.util.Map;
77-
//
78-
//public interface EventRepository extends JpaRepository<Event, Long> {
79-
//
80-
// boolean existsByCategoryId(Long categoryId);
81-
//
82-
////1 @Query("SELECT e FROM Event e " +
83-
//// "WHERE (:users IS NULL OR e.initiator.id IN :users) " +
84-
//// "AND (:states IS NULL OR e.state IN :states) " +
85-
//// "AND (:categories IS NULL OR e.category.id IN :categories) " +
86-
//// "AND (CAST(:rangeStart AS timestamp) IS NULL OR e.eventDate >= :rangeStart) " +
87-
//// "AND (CAST(:rangeEnd AS timestamp) IS NULL OR e.eventDate <= :rangeEnd) " +
88-
//// "ORDER BY e.id")
89-
//// Page<Event> searchEventsAdmin(@Param("users") List<Long> users,
90-
//// @Param("states") List<String> states,
91-
//// @Param("categories") List<Long> categories,
92-
//// @Param("rangeStart") LocalDateTime rangeStart,
93-
//// @Param("rangeEnd") LocalDateTime rangeEnd,
94-
//// Pageable pageable);
95-
//
96-
// @Query("SELECT DISTINCT e FROM Event e " +
97-
// "LEFT JOIN FETCH e.category " +
98-
// "LEFT JOIN FETCH e.initiator " +
99-
// "WHERE (:users IS NULL OR e.initiator.id IN :users) " +
100-
// "AND (:states IS NULL OR e.state IN :states) " +
101-
// "AND (:categories IS NULL OR e.category.id IN :categories) " +
102-
// "AND (CAST(:rangeStart AS timestamp) IS NULL OR CAST(:rangeEnd AS timestamp) IS NULL OR e.eventDate BETWEEN :rangeStart AND :rangeEnd)")
103-
// Page<Event> searchEventsAdmin(@Param("users") List<Long> users,
104-
// @Param("states") List<EventState> states,
105-
// @Param("categories") List<Long> categories,
106-
// @Param("rangeStart") LocalDateTime rangeStart,
107-
// @Param("rangeEnd") LocalDateTime rangeEnd,
108-
// Pageable pageable);
109-
//
110-
// @Query("SELECT e FROM Event e " +
111-
// "WHERE e.state = 'PUBLISHED' " +
112-
// "AND (:text IS NULL OR :text = '' OR " +
113-
// " LOWER(e.annotation) LIKE LOWER(CONCAT('%', :text, '%')) OR " +
114-
// " LOWER(e.description) LIKE LOWER(CONCAT('%', :text, '%'))) " +
115-
// "AND (:categories IS NULL OR e.category.id IN :categories) " +
116-
// "AND (:paid IS NULL OR e.paid = :paid) " +
117-
// "AND (CAST(:rangeStart AS timestamp) IS NULL OR e.eventDate >= :rangeStart) " +
118-
// "AND (CAST(:rangeEnd AS timestamp) IS NULL OR e.eventDate <= :rangeEnd) " +
119-
// "ORDER BY e.eventDate")
120-
// Page<Event> searchEventsPublic(@Param("text") String text,
121-
// @Param("categories") List<Long> categories,
122-
// @Param("paid") Boolean paid,
123-
// @Param("rangeStart") LocalDateTime rangeStart,
124-
// @Param("rangeEnd") LocalDateTime rangeEnd,
125-
// Pageable pageable);
126-
//
127-
// @Query("SELECT COUNT(r) FROM Request r WHERE r.event.id = :eventId AND r.status = 'CONFIRMED'")
128-
// Long countConfirmedRequests(@Param("eventId") Long eventId);
129-
//
130-
// @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")
131-
// Map<Long, Long> countConfirmedRequestsBatch(@Param("eventIds") List<Long> eventIds);
132-
//
133-
// @Query("SELECT e FROM Event e " +
134-
// "LEFT JOIN FETCH e.category " +
135-
// "LEFT JOIN FETCH e.initiator " +
136-
// "WHERE e.initiator.id = :initiatorId " +
137-
// "ORDER BY e.id")
138-
// List<Event> findAllByInitiatorIdWithDetails(@Param("initiatorId") Long initiatorId, Pageable pageable);
139-
//}

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

Lines changed: 27 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import jakarta.servlet.http.HttpServletRequest;
44
import lombok.RequiredArgsConstructor;
55
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.data.domain.Page;
67
import org.springframework.data.domain.PageRequest;
8+
import org.springframework.data.domain.Pageable;
79
import org.springframework.data.domain.Sort;
810
import org.springframework.stereotype.Service;
911
import org.springframework.transaction.annotation.Transactional;
@@ -100,66 +102,6 @@ public EventFullDto updateUserEvent(Long userId, Long eventId, UpdateEventUserRe
100102
return EventMapper.toEventFullDto(event, 0L, 0L);
101103
}
102104

103-
// 1 @Override
104-
// @Transactional(readOnly = true)
105-
// public List<EventFullDto> getEventsForAdmin(AdminEventSearchParams params) {
106-
// int from = params.getFrom();
107-
// int size = params.getSize();
108-
// if (size <= 0 || from < 0) {
109-
// throw new IllegalArgumentException("Параметры from и size должны быть > 0");
110-
// }
111-
//
112-
// Pageable pageable = PageRequest.of(from / size, size, Sort.by("id"));
113-
// Page<Event> page = eventRepository.searchEventsAdmin(
114-
// params.getUsers(),
115-
// params.getStates(),
116-
// params.getCategories(),
117-
// params.getRangeStart(),
118-
// params.getRangeEnd(),
119-
// pageable);
120-
//
121-
// List<Event> events = page.getContent();
122-
// List<Long> eventIds = events.stream().map(Event::getId).collect(Collectors.toList());
123-
// Map<Long, Long> confirmedRequestsMap = eventRepository.countConfirmedRequestsBatch(eventIds);
124-
//
125-
// return events.stream()
126-
// .map(event -> EventMapper.toEventFullDto(event, 0L, confirmedRequestsMap.getOrDefault(event.getId(), 0L)))
127-
// .collect(Collectors.toList());
128-
// }
129-
130-
// 2 @Override
131-
// @Transactional(readOnly = true)
132-
// public List<EventFullDto> getEventsForAdmin(AdminEventSearchParams params) {
133-
// int from = params.getFrom();
134-
// int size = params.getSize();
135-
// if (size <= 0 || from < 0) {
136-
// throw new IllegalArgumentException("Параметры from и size должны быть > 0");
137-
// }
138-
// List<EventState> stateEnums = null;
139-
// if (params.getStates() != null && !params.getStates().isEmpty()) {
140-
// stateEnums = params.getStates().stream()
141-
// .map(EventState::valueOf)
142-
// .collect(Collectors.toList());
143-
// }
144-
//
145-
// Pageable pageable = PageRequest.of(from / size, size, Sort.by("id"));
146-
// Page<Event> page = eventRepository.searchEventsAdmin(
147-
// params.getUsers(),
148-
// stateEnums,
149-
// params.getCategories(),
150-
// params.getRangeStart(),
151-
// params.getRangeEnd(),
152-
// pageable);
153-
//
154-
// List<Event> events = page.getContent();
155-
// List<Long> eventIds = events.stream().map(Event::getId).collect(Collectors.toList());
156-
// Map<Long, Long> confirmedRequestsMap = eventRepository.countConfirmedRequestsBatch(eventIds);
157-
//
158-
// return events.stream()
159-
// .map(event -> EventMapper.toEventFullDto(event, 0L, confirmedRequestsMap.getOrDefault(event.getId(), 0L)))
160-
// .collect(Collectors.toList());
161-
// }
162-
163105
@Override
164106
@Transactional(readOnly = true)
165107
public List<EventFullDto> getEventsForAdmin(AdminEventSearchParams params) {
@@ -168,14 +110,23 @@ public List<EventFullDto> getEventsForAdmin(AdminEventSearchParams params) {
168110
if (size <= 0 || from < 0) {
169111
throw new IllegalArgumentException("Параметры from и size должны быть > 0");
170112
}
113+
List<EventState> stateEnums = null;
114+
if (params.getStates() != null && !params.getStates().isEmpty()) {
115+
stateEnums = params.getStates().stream()
116+
.map(EventState::valueOf)
117+
.collect(Collectors.toList());
118+
}
171119

172-
LocalDateTime start = params.getRangeStart();
173-
LocalDateTime end = params.getRangeEnd();
174-
175-
List<Event> events = eventRepository.searchEventsAdmin(
176-
params.getUsers(), params.getStates(), params.getCategories(),
177-
start, end, from, size);
120+
Pageable pageable = PageRequest.of(from / size, size, Sort.by("id"));
121+
Page<Event> page = eventRepository.searchEventsAdmin(
122+
params.getUsers(),
123+
stateEnums,
124+
params.getCategories(),
125+
params.getRangeStart(),
126+
params.getRangeEnd(),
127+
pageable);
178128

129+
List<Event> events = page.getContent();
179130
List<Long> eventIds = events.stream().map(Event::getId).collect(Collectors.toList());
180131
Map<Long, Long> confirmedRequestsMap = eventRepository.countConfirmedRequestsBatch(eventIds);
181132

@@ -237,61 +188,6 @@ public EventFullDto updateEventByAdmin(Long eventId, UpdateEventAdminRequest req
237188
return EventMapper.toEventFullDto(event, views, confirmed);
238189
}
239190

240-
// @Override
241-
// @Transactional(readOnly = true)
242-
// public List<EventShortDto> getEventsForPublic(PublicEventSearchParams params, HttpServletRequest request) {
243-
// int from = params.getFrom();
244-
// int size = params.getSize();
245-
// if (size <= 0 || from < 0) {
246-
// throw new IllegalArgumentException("Параметры from и size должны быть > 0");
247-
// }
248-
//
249-
// try {
250-
// statsClient.sendHit(request);
251-
// } catch (Exception e) {
252-
// log.warn("Не удалось отправить статистику: {}", e.getMessage());
253-
// }
254-
//
255-
// Pageable pageable = PageRequest.of(from / size, size, Sort.by("eventDate").ascending());
256-
// Page<Event> page = eventRepository.searchEventsPublic(
257-
// params.getText(),
258-
// params.getCategories(),
259-
// params.getPaid(),
260-
// params.getRangeStart(),
261-
// params.getRangeEnd(),
262-
// pageable);
263-
//
264-
// List<Event> events = page.getContent();
265-
// Map<Long, Long> confirmedRequestsMap = getConfirmedRequestsMap(events);
266-
//
267-
// if (params.getOnlyAvailable()) {
268-
// events = events.stream()
269-
// .filter(event -> {
270-
// long confirmed = confirmedRequestsMap.getOrDefault(event.getId(), 0L);
271-
// int limit = event.getParticipantLimit();
272-
// return limit == 0 || confirmed < limit;
273-
// })
274-
// .collect(Collectors.toList());
275-
// }
276-
//
277-
// Map<Long, Long> viewsMap = getViewsMap(events);
278-
//
279-
// List<EventShortDto> result = events.stream()
280-
// .map(event -> EventMapper.toEventShortDto(event,
281-
// viewsMap.getOrDefault(event.getId(), 0L),
282-
// confirmedRequestsMap.getOrDefault(event.getId(), 0L)))
283-
// .collect(Collectors.toList());
284-
//
285-
// SortType sort = params.getSort();
286-
// if (sort == SortType.VIEWS) {
287-
// result.sort(Comparator.comparing(EventShortDto::getViews).reversed());
288-
// } else if (sort == SortType.EVENT_DATE) {
289-
// result.sort(Comparator.comparing(EventShortDto::getEventDate));
290-
// }
291-
//
292-
// return result;
293-
// }
294-
295191
@Override
296192
@Transactional(readOnly = true)
297193
public List<EventShortDto> getEventsForPublic(PublicEventSearchParams params, HttpServletRequest request) {
@@ -307,13 +203,16 @@ public List<EventShortDto> getEventsForPublic(PublicEventSearchParams params, Ht
307203
log.warn("Не удалось отправить статистику: {}", e.getMessage());
308204
}
309205

310-
LocalDateTime rangeStart = params.getRangeStart();
311-
LocalDateTime rangeEnd = params.getRangeEnd();
312-
313-
List<Event> events = eventRepository.searchEventsPublic(
314-
params.getText(), params.getCategories(), params.getPaid(),
315-
rangeStart, rangeEnd, from, size);
206+
Pageable pageable = PageRequest.of(from / size, size, Sort.by("eventDate").ascending());
207+
Page<Event> page = eventRepository.searchEventsPublic(
208+
params.getText(),
209+
params.getCategories(),
210+
params.getPaid(),
211+
params.getRangeStart(),
212+
params.getRangeEnd(),
213+
pageable);
316214

215+
List<Event> events = page.getContent();
317216
Map<Long, Long> confirmedRequestsMap = getConfirmedRequestsMap(events);
318217

319218
if (params.getOnlyAvailable()) {
@@ -344,6 +243,7 @@ public List<EventShortDto> getEventsForPublic(PublicEventSearchParams params, Ht
344243
return result;
345244
}
346245

246+
347247
@Override
348248
@Transactional(readOnly = true)
349249
public EventFullDto getEventForPublic(Long eventId, HttpServletRequest request) {

0 commit comments

Comments
 (0)