Skip to content

Commit 7956a00

Browse files
committed
fix31
1 parent 6c78d74 commit 7956a00

2 files changed

Lines changed: 206 additions & 69 deletions

File tree

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

3-
import org.springframework.data.domain.Page;
43
import org.springframework.data.domain.Pageable;
54
import org.springframework.data.jpa.repository.JpaRepository;
65
import org.springframework.data.jpa.repository.Query;
76
import org.springframework.data.repository.query.Param;
87
import ru.practicum.ewm.event.model.Event;
9-
import ru.practicum.ewm.event.model.EventState;
108

119
import java.time.LocalDateTime;
1210
import java.util.List;
@@ -16,61 +14,126 @@ public interface EventRepository extends JpaRepository<Event, Long> {
1614

1715
boolean existsByCategoryId(Long categoryId);
1816

19-
// @Query("SELECT e FROM Event e " +
20-
// "WHERE (:users IS NULL OR e.initiator.id IN :users) " +
21-
// "AND (:states IS NULL OR e.state IN :states) " +
22-
// "AND (:categories IS NULL OR e.category.id IN :categories) " +
23-
// "AND (CAST(:rangeStart AS timestamp) IS NULL OR e.eventDate >= :rangeStart) " +
24-
// "AND (CAST(:rangeEnd AS timestamp) IS NULL OR e.eventDate <= :rangeEnd) " +
25-
// "ORDER BY e.id")
26-
// Page<Event> searchEventsAdmin(@Param("users") List<Long> users,
27-
// @Param("states") List<String> states,
28-
// @Param("categories") List<Long> categories,
29-
// @Param("rangeStart") LocalDateTime rangeStart,
30-
// @Param("rangeEnd") LocalDateTime rangeEnd,
31-
// Pageable pageable);
32-
33-
@Query("SELECT DISTINCT e FROM Event e " +
34-
"LEFT JOIN FETCH e.category " +
35-
"LEFT JOIN FETCH e.initiator " +
36-
"WHERE (:users IS NULL OR e.initiator.id IN :users) " +
37-
"AND (:states IS NULL OR e.state IN :states) " +
38-
"AND (:categories IS NULL OR e.category.id IN :categories) " +
39-
"AND (CAST(:rangeStart AS timestamp) IS NULL OR CAST(:rangeEnd AS timestamp) IS NULL OR e.eventDate BETWEEN :rangeStart AND :rangeEnd)")
40-
Page<Event> searchEventsAdmin(@Param("users") List<Long> users,
41-
@Param("states") List<EventState> states,
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,
4228
@Param("categories") List<Long> categories,
4329
@Param("rangeStart") LocalDateTime rangeStart,
4430
@Param("rangeEnd") LocalDateTime rangeEnd,
45-
Pageable pageable);
31+
@Param("offset") int offset,
32+
@Param("size") int size);
4633

47-
@Query("SELECT e FROM Event e " +
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 " +
4837
"WHERE e.state = 'PUBLISHED' " +
49-
"AND (:text IS NULL OR :text = '' OR " +
50-
" LOWER(e.annotation) LIKE LOWER(CONCAT('%', :text, '%')) OR " +
51-
" LOWER(e.description) LIKE LOWER(CONCAT('%', :text, '%'))) " +
52-
"AND (:categories IS NULL OR e.category.id IN :categories) " +
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)) " +
5342
"AND (:paid IS NULL OR e.paid = :paid) " +
54-
"AND (CAST(:rangeStart AS timestamp) IS NULL OR e.eventDate >= :rangeStart) " +
55-
"AND (CAST(:rangeEnd AS timestamp) IS NULL OR e.eventDate <= :rangeEnd) " +
56-
"ORDER BY e.eventDate")
57-
Page<Event> searchEventsPublic(@Param("text") String text,
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,
5847
@Param("categories") List<Long> categories,
5948
@Param("paid") Boolean paid,
6049
@Param("rangeStart") LocalDateTime rangeStart,
6150
@Param("rangeEnd") LocalDateTime rangeEnd,
62-
Pageable pageable);
51+
@Param("offset") int offset,
52+
@Param("size") int size);
6353

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

6757
@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")
6858
Map<Long, Long> countConfirmedRequestsBatch(@Param("eventIds") List<Long> eventIds);
6959

70-
@Query("SELECT e FROM Event e " +
71-
"LEFT JOIN FETCH e.category " +
72-
"LEFT JOIN FETCH e.initiator " +
73-
"WHERE e.initiator.id = :initiatorId " +
74-
"ORDER BY e.id")
60+
@Query("SELECT e FROM Event e LEFT JOIN FETCH e.category LEFT JOIN FETCH e.initiator WHERE e.initiator.id = :initiatorId")
7561
List<Event> findAllByInitiatorIdWithDetails(@Param("initiatorId") Long initiatorId, Pageable pageable);
7662
}
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: 102 additions & 28 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.data.domain.Sort;
108
import org.springframework.stereotype.Service;
119
import org.springframework.transaction.annotation.Transactional;
@@ -102,7 +100,7 @@ public EventFullDto updateUserEvent(Long userId, Long eventId, UpdateEventUserRe
102100
return EventMapper.toEventFullDto(event, 0L, 0L);
103101
}
104102

105-
// @Override
103+
// 1 @Override
106104
// @Transactional(readOnly = true)
107105
// public List<EventFullDto> getEventsForAdmin(AdminEventSearchParams params) {
108106
// int from = params.getFrom();
@@ -127,6 +125,39 @@ public EventFullDto updateUserEvent(Long userId, Long eventId, UpdateEventUserRe
127125
// return events.stream()
128126
// .map(event -> EventMapper.toEventFullDto(event, 0L, confirmedRequestsMap.getOrDefault(event.getId(), 0L)))
129127
// .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());
130161
// }
131162

132163
@Override
@@ -137,23 +168,14 @@ public List<EventFullDto> getEventsForAdmin(AdminEventSearchParams params) {
137168
if (size <= 0 || from < 0) {
138169
throw new IllegalArgumentException("Параметры from и size должны быть > 0");
139170
}
140-
List<EventState> stateEnums = null;
141-
if (params.getStates() != null && !params.getStates().isEmpty()) {
142-
stateEnums = params.getStates().stream()
143-
.map(EventState::valueOf)
144-
.collect(Collectors.toList());
145-
}
146171

147-
Pageable pageable = PageRequest.of(from / size, size, Sort.by("id"));
148-
Page<Event> page = eventRepository.searchEventsAdmin(
149-
params.getUsers(),
150-
stateEnums,
151-
params.getCategories(),
152-
params.getRangeStart(),
153-
params.getRangeEnd(),
154-
pageable);
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);
155178

156-
List<Event> events = page.getContent();
157179
List<Long> eventIds = events.stream().map(Event::getId).collect(Collectors.toList());
158180
Map<Long, Long> confirmedRequestsMap = eventRepository.countConfirmedRequestsBatch(eventIds);
159181

@@ -162,6 +184,7 @@ public List<EventFullDto> getEventsForAdmin(AdminEventSearchParams params) {
162184
.collect(Collectors.toList());
163185
}
164186

187+
165188
@Override
166189
@Transactional
167190
public EventFullDto updateEventByAdmin(Long eventId, UpdateEventAdminRequest request) {
@@ -214,6 +237,61 @@ public EventFullDto updateEventByAdmin(Long eventId, UpdateEventAdminRequest req
214237
return EventMapper.toEventFullDto(event, views, confirmed);
215238
}
216239

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+
217295
@Override
218296
@Transactional(readOnly = true)
219297
public List<EventShortDto> getEventsForPublic(PublicEventSearchParams params, HttpServletRequest request) {
@@ -229,16 +307,13 @@ public List<EventShortDto> getEventsForPublic(PublicEventSearchParams params, Ht
229307
log.warn("Не удалось отправить статистику: {}", e.getMessage());
230308
}
231309

232-
Pageable pageable = PageRequest.of(from / size, size, Sort.by("eventDate").ascending());
233-
Page<Event> page = eventRepository.searchEventsPublic(
234-
params.getText(),
235-
params.getCategories(),
236-
params.getPaid(),
237-
params.getRangeStart(),
238-
params.getRangeEnd(),
239-
pageable);
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);
240316

241-
List<Event> events = page.getContent();
242317
Map<Long, Long> confirmedRequestsMap = getConfirmedRequestsMap(events);
243318

244319
if (params.getOnlyAvailable()) {
@@ -269,7 +344,6 @@ public List<EventShortDto> getEventsForPublic(PublicEventSearchParams params, Ht
269344
return result;
270345
}
271346

272-
273347
@Override
274348
@Transactional(readOnly = true)
275349
public EventFullDto getEventForPublic(Long eventId, HttpServletRequest request) {

0 commit comments

Comments
 (0)