Skip to content

Commit 94612d4

Browse files
authored
Merge pull request #14 from KGU-C-Lab/refactor/#11
필터링 정보 다중 선택이 가능하도록 구현 완료
2 parents 734329d + d7d4eca commit 94612d4

File tree

4 files changed

+58
-43
lines changed

4 files changed

+58
-43
lines changed

src/main/java/page/time/api/domain/lecture/application/LectureRetrieveService.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,25 @@
1616

1717
@Service
1818
@RequiredArgsConstructor
19+
@Transactional(readOnly = true)
1920
public class LectureRetrieveService {
2021

2122
private final LectureRepository lectureRepository;
2223

23-
@Transactional(readOnly = true)
2424
public CursorResult<LectureResponseDto> retrieveLectures(
25-
String campus, Type type, Integer grade, List<String> day, List<String> time, String major, Boolean isExceeded, String lectureName, Long cursor, int limit
25+
List<String> campuses, List<Type> types, List<Integer> grades, List<String> days, List<String> times, List<String> majors, Boolean isExceeded, String lectureName, Long cursor, int limit
2626
) {
27-
List<Lecture> lectures = lectureRepository.findByFilter(campus, type, grade, day, time, major, isExceeded, lectureName, cursor, limit);
27+
List<Lecture> lectures = lectureRepository.findByFilter(campuses, types, grades, days, times, majors, isExceeded, lectureName, cursor, limit);
2828
List<LectureResponseDto> lectureDetailResponseDtos = lectures.stream()
2929
.map(LectureResponseDto::toDto)
3030
.collect(Collectors.toList());
3131
return CursorResult.of(lectureDetailResponseDtos, cursor, limit);
3232
}
3333

34-
@Transactional(readOnly = true)
3534
public List<String> retrieveMajor(String major) {
3635
return lectureRepository.findByMajor(major);
3736
}
3837

39-
@Transactional(readOnly = true)
4038
public List<LectureSelectResponseDto> retrieveSelectedLecturesByIds(List<Long> lectureIds) {
4139
return lectureIds.stream()
4240
.map(lectureRepository::findById)

src/main/java/page/time/api/domain/lecture/controller/LectureRetrieveController.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,19 @@ public class LectureRetrieveController {
2929
"모든 파라미터를 하나라도 입력하지 않으면 전체 조회됨<br>")
3030
@GetMapping("")
3131
public ApiResponse<CursorResult<LectureResponseDto>> retrieveLectures(
32-
@RequestParam(name = "campus", required = false) String campus,
33-
@RequestParam(name = "type", required = false) Type type,
34-
@RequestParam(name = "grade", required = false) Integer grade,
35-
@RequestParam(name = "day", required = false) List<String> day,
36-
@RequestParam(name = "time", required = false) List<String> time,
37-
@RequestParam(name = "major", required = false) String major,
32+
@RequestParam(name = "campus", required = false) List<String> campuses,
33+
@RequestParam(name = "type", required = false) List<Type> types,
34+
@RequestParam(name = "grade", required = false) List<Integer> grades,
35+
@RequestParam(name = "day", required = false) List<String> days,
36+
@RequestParam(name = "time", required = false) List<String> times,
37+
@RequestParam(name = "major", required = false) List<String> majors,
3838
@RequestParam(name = "isExceeded", required = false) Boolean isExceeded,
3939
@RequestParam(name = "lectureName", required = false) String lectureName,
4040
@RequestParam(name = "cursor", required = false) Long cursor,
4141
@RequestParam(name = "limit", defaultValue = "50") int limit
4242
) {
4343
CursorResult<LectureResponseDto> lectures = lectureRetrieveService.retrieveLectures(
44-
campus, type, grade, day, time, major, isExceeded, lectureName, cursor, limit
44+
campuses, types, grades, days, times, majors, isExceeded, lectureName, cursor, limit
4545
);
4646
return ApiResponse.success(lectures);
4747
}

src/main/java/page/time/api/domain/lecture/dao/LectureRepositoryCustom.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
public interface LectureRepositoryCustom {
99

10-
List<Lecture> findByFilter(String campus, Type type, Integer grade, List<String> day, List<String> time, String major, Boolean isExceeded, String lectureName, Long cursor, int limit);
10+
List<Lecture> findByFilter(List<String> campuses, List<Type> types, List<Integer> grades, List<String> days, List<String> times, List<String> majors, Boolean isExceeded, String lectureName, Long cursor, int limit);
1111

1212
List<String> findByMajor(String major);
1313
}

src/main/java/page/time/api/domain/lecture/dao/LectureRepositoryCustomImpl.java

+47-30
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package page.time.api.domain.lecture.dao;
22

3-
import com.querydsl.core.BooleanBuilder;
43
import com.querydsl.core.types.dsl.BooleanExpression;
54
import com.querydsl.jpa.impl.JPAQueryFactory;
65
import lombok.RequiredArgsConstructor;
76
import org.springframework.stereotype.Repository;
7+
import org.springframework.util.CollectionUtils;
88
import page.time.api.domain.lecture.domain.Lecture;
99
import page.time.api.domain.lecture.domain.Type;
1010

@@ -21,17 +21,17 @@ public class LectureRepositoryCustomImpl implements LectureRepositoryCustom {
2121
private static final String NONE = "None";
2222

2323
@Override
24-
public List<Lecture> findByFilter(String campus, Type type, Integer grade, List<String> day, List<String> time, String major, Boolean isExceeded, String lectureName, Long cursor, int limit) {
24+
public List<Lecture> findByFilter(List<String> campuses, List<Type> types, List<Integer> grades, List<String> days, List<String> times, List<String> majors, Boolean isExceeded, String lectureName, Long cursor, int limit) {
2525
return query
2626
.selectFrom(lecture)
2727
.where(
2828
containsToLectureName(lectureName),
29-
eqToMajor(major),
30-
eqToDay(day),
31-
eqToTime(time),
32-
eqToGrade(grade),
33-
eqToType(type),
34-
eqToCampus(campus),
29+
eqToMajors(majors),
30+
eqToDays(days),
31+
eqToTimes(times),
32+
eqToGrades(grades),
33+
eqToTypes(types),
34+
eqToCampuses(campuses),
3535
eqToIsExceeded(isExceeded),
3636
gtCursor(cursor)
3737
)
@@ -52,47 +52,54 @@ public List<String> findByMajor(String major) {
5252
.fetch();
5353
}
5454

55-
private BooleanExpression eqToCampus(String campus) {
56-
if (campus == null || campus.isEmpty()) {
55+
private BooleanExpression eqToCampuses(List<String> campuses) {
56+
if (CollectionUtils.isEmpty(campuses)) {
5757
return null;
5858
}
59-
return lecture.campus.contains(campus);
59+
return campuses.stream()
60+
.map(lecture.campus::contains)
61+
.reduce(BooleanExpression::or)
62+
.orElse(null);
6063
}
6164

62-
private BooleanExpression eqToType(Type type) {
63-
if (type == null) {
65+
private BooleanExpression eqToTypes(List<Type> types) {
66+
if (CollectionUtils.isEmpty(types)) {
6467
return null;
6568
}
66-
return lecture.type.eq(type);
69+
return types.stream()
70+
.map(lecture.type::eq)
71+
.reduce(BooleanExpression::or)
72+
.orElse(null);
6773
}
6874

69-
private BooleanExpression eqToGrade(Integer grade) {
70-
if (grade == null) {
75+
private BooleanExpression eqToGrades(List<Integer> grades) {
76+
if (CollectionUtils.isEmpty(grades)) {
7177
return null;
7278
}
73-
return lecture.grade.eq(grade);
79+
return grades.stream()
80+
.map(lecture.grade::eq)
81+
.reduce(BooleanExpression::or)
82+
.orElse(null);
7483
}
7584

76-
private BooleanBuilder eqToDay(List<String> days) {
77-
if (days == null || days.isEmpty()) {
85+
private BooleanExpression eqToDays(List<String> days) {
86+
if (CollectionUtils.isEmpty(days)) {
7887
return null;
7988
}
80-
BooleanBuilder builder = new BooleanBuilder();
81-
days.stream()
89+
return days.stream()
8290
.map(lecture.time::contains)
83-
.forEach(builder::or);
84-
return builder;
91+
.reduce(BooleanExpression::or)
92+
.orElse(null);
8593
}
8694

87-
private BooleanBuilder eqToTime(List<String> times) {
88-
if (times == null || times.isEmpty()) {
95+
private BooleanExpression eqToTimes(List<String> times) {
96+
if (CollectionUtils.isEmpty(times)) {
8997
return null;
9098
}
91-
BooleanBuilder builder = new BooleanBuilder();
92-
times.stream()
99+
return times.stream()
93100
.map(lecture.time::contains)
94-
.forEach(builder::or);
95-
return builder;
101+
.reduce(BooleanExpression::or)
102+
.orElse(null);
96103
}
97104

98105
private BooleanExpression eqToMajor(String major) {
@@ -102,6 +109,16 @@ private BooleanExpression eqToMajor(String major) {
102109
return lecture.major.contains(major);
103110
}
104111

112+
private BooleanExpression eqToMajors(List<String> majors) {
113+
if (CollectionUtils.isEmpty(majors)) {
114+
return null;
115+
}
116+
return majors.stream()
117+
.map(lecture.major::contains)
118+
.reduce(BooleanExpression::or)
119+
.orElse(null);
120+
}
121+
105122
private BooleanExpression eqToIsExceeded(Boolean isExceeded) {
106123
if (isExceeded == null) {
107124
return null;
@@ -122,4 +139,4 @@ private BooleanExpression gtCursor(Long cursor) {
122139
}
123140
return lecture.id.gt(cursor);
124141
}
125-
}
142+
}

0 commit comments

Comments
 (0)