11package ru .practicum .ewm .event .repository ;
22
3- import org .springframework .data .domain .Page ;
43import org .springframework .data .domain .Pageable ;
54import org .springframework .data .jpa .repository .JpaRepository ;
65import org .springframework .data .jpa .repository .Query ;
76import org .springframework .data .repository .query .Param ;
87import ru .practicum .ewm .event .model .Event ;
9- import ru .practicum .ewm .event .model .EventState ;
108
119import java .time .LocalDateTime ;
1210import 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+ //}
0 commit comments