diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/repository/EventCustomRepositoryImpl.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/repository/EventCustomRepositoryImpl.java index 950307f2..96cd4b01 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/repository/EventCustomRepositoryImpl.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/repository/EventCustomRepositoryImpl.java @@ -51,15 +51,20 @@ public Slice querySliceEventsByStatus(EventStatus status, Pageable pageab @Override public Slice querySliceEventsByKeyword(String keyword, Pageable pageable) { - List events = + List openEvents = queryFactory .selectFrom(event) - .where(eqStatusCanExposed(), nameContains(keyword)) - .orderBy(statusDesc(), startAtAsc()) + .where(eqStatusOpen().and(nameContains(keyword))) + .orderBy(createdAtAsc()) .offset(pageable.getOffset()) .limit(pageable.getPageSize() + 1) .fetch(); - return SliceUtil.valueOf(events, pageable); + + final long remainingSize = Math.max(pageable.getPageSize() - openEvents.size(), 0); + if (remainingSize > 0) { + openEvents.addAll(queryClosedEventsByKeywordAndSize(keyword, pageable, remainingSize)); + } + return SliceUtil.valueOf(openEvents, pageable); } @Override @@ -67,6 +72,26 @@ public List queryEventsByEndAtBeforeAndStatusOpen(LocalDateTime time) { return queryFactory.selectFrom(event).where(endAtBefore(time), statusEq(OPEN)).fetch(); } + private List queryClosedEventsByKeywordAndSize( + String keyword, Pageable pageable, Long size) { + final long totalOpenEventsSize = queryCountByKeywordAndStatus(keyword, OPEN); + final long closedEventsOffset = Math.max(pageable.getOffset() - totalOpenEventsSize, 0); + return queryFactory + .selectFrom(event) + .where(eqStatusClosed().and(nameContains(keyword))) + .orderBy(startAtDesc()) + .offset(closedEventsOffset) + .limit(size + 1) + .fetch(); + } + + private long queryCountByKeywordAndStatus(String keyword, EventStatus status) { + return queryFactory + .from(event) + .where(statusEq(status).and(nameContains(keyword))) + .fetchCount(); + } + private BooleanExpression hostIdIn(List hostId) { return event.hostId.in(hostId); } @@ -75,18 +100,14 @@ private BooleanExpression eqStatusOpen() { return event.status.eq(OPEN); } - private BooleanExpression eqStatusCanExposed() { - return event.status.eq(OPEN).or(event.status.eq(CLOSED)); + private BooleanExpression eqStatusClosed() { + return event.status.eq(CLOSED); } private BooleanExpression statusEq(EventStatus status) { return event.status.eq(status); } - private BooleanExpression statusNotEq(EventStatus status) { - return event.status.eq(status).not(); - } - private BooleanExpression nameContains(String keyword) { return keyword == null ? null : event.eventBasic.name.containsIgnoreCase(keyword); } @@ -95,10 +116,18 @@ private OrderSpecifier createdAtDesc() { return event.createdAt.desc(); } + private OrderSpecifier createdAtAsc() { + return event.createdAt.asc(); + } + private OrderSpecifier startAtAsc() { return event.eventBasic.startAt.asc(); } + private OrderSpecifier startAtDesc() { + return event.eventBasic.startAt.desc(); + } + private OrderSpecifier statusDesc() { return event.status.desc(); }