Skip to content

Commit 27e4561

Browse files
committed
CLAP-244 refactor: 팀 작업 조회 필터링 로직 QueryDSL 리팩토링
1 parent 276f881 commit 27e4561

File tree

1 file changed

+33
-53
lines changed

1 file changed

+33
-53
lines changed

src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java

Lines changed: 33 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import com.querydsl.core.types.dsl.DateTimePath;
1313
import com.querydsl.jpa.impl.JPAQueryFactory;
1414
import jakarta.persistence.EntityManager;
15-
import jakarta.persistence.TypedQuery;
15+
import com.querydsl.core.types.dsl.CaseBuilder;
1616
import lombok.RequiredArgsConstructor;
1717
import org.springframework.data.domain.Page;
1818
import org.springframework.data.domain.PageImpl;
@@ -58,27 +58,45 @@ public Page<TaskEntity> findTasksAssignedByManager(Long processorId, Pageable pa
5858

5959
@Override
6060
public List<TeamMemberTaskResponse> findTeamStatus(Long memberId, FilterTeamStatusRequest filter) {
61-
// 1. 담당자 목록을 가져옴 (페이징 제거)
62-
List<Long> processorIds = queryFactory
63-
.select(taskEntity.processor.memberId)
64-
.from(taskEntity)
65-
.groupBy(taskEntity.processor.memberId)
66-
.orderBy("기여도순".equals(filter.sortBy()) ?
67-
taskEntity.taskId.count().desc() :
68-
taskEntity.processor.nickname.asc())
69-
.fetch();
61+
BooleanBuilder builder = new BooleanBuilder();
62+
63+
// 담당자 ID 필터링
64+
if (memberId != null) {
65+
builder.and(taskEntity.processor.memberId.eq(memberId));
66+
}
67+
68+
// 작업 타이틀 필터링
69+
if (filter.taskTitle() != null && !filter.taskTitle().isEmpty()) {
70+
builder.and(taskEntity.title.containsIgnoreCase(filter.taskTitle()));
71+
}
72+
73+
// 1차 카테고리 필터링
74+
if (!filter.mainCategoryIds().isEmpty()) {
75+
builder.and(taskEntity.category.mainCategory.categoryId.in(filter.mainCategoryIds()));
76+
}
7077

71-
if (processorIds.isEmpty()) {
72-
return List.of(); // 결과가 없으면 빈 리스트 반환
78+
// 2차 카테고리 필터링
79+
if (!filter.categoryIds().isEmpty()) {
80+
builder.and(taskEntity.category.categoryId.in(filter.categoryIds()));
7381
}
7482

75-
// 2. 담당자별 작업 조회 (페이징 제거)
83+
// 정렬 조건 적용
84+
OrderSpecifier<?> orderBy = "기여도순".equals(filter.sortBy())
85+
? new CaseBuilder()
86+
.when(taskEntity.taskStatus.eq(TaskStatus.IN_PROGRESS)
87+
.or(taskEntity.taskStatus.eq(TaskStatus.PENDING_COMPLETED)))
88+
.then(1)
89+
.otherwise(0)
90+
.desc()
91+
: taskEntity.processor.nickname.asc();
92+
93+
// 쿼리 실행
7694
List<TaskEntity> taskEntities = queryFactory
7795
.selectFrom(taskEntity)
78-
.where(taskEntity.processor.memberId.in(processorIds))
96+
.where(builder)
97+
.orderBy(orderBy)
7998
.fetch();
8099

81-
// 3. 담당자별 그룹핑
82100
return taskEntities.stream()
83101
.collect(Collectors.groupingBy(t -> t.getProcessor().getMemberId()))
84102
.entrySet().stream()
@@ -111,48 +129,10 @@ public List<TeamMemberTaskResponse> findTeamStatus(Long memberId, FilterTeamStat
111129
}).collect(Collectors.toList());
112130
}
113131

114-
115-
116-
private String buildQueryString(FilterTeamStatusRequest filter) {
117-
StringBuilder queryStr = new StringBuilder("SELECT t FROM TaskEntity t " +
118-
"JOIN FETCH t.processor p " +
119-
"WHERE (:memberId IS NULL OR p.memberId = :memberId) ");
120-
121-
if (!filter.taskTitle().isEmpty()) {
122-
queryStr.append("AND t.title LIKE :title ");
123-
}
124-
if (!filter.mainCategoryIds().isEmpty()) {
125-
queryStr.append("AND t.category.mainCategory.id IN :mainCategories ");
126-
}
127-
if (!filter.categoryIds().isEmpty()) {
128-
queryStr.append("AND t.category.id IN :categories ");
129-
}
130-
131-
if ("기여도순".equals(filter.sortBy())) {
132-
queryStr.append("ORDER BY (SELECT COUNT(te) FROM TaskEntity te WHERE te.processor = p AND te.taskStatus IN ('IN_PROGRESS', 'PENDING_COMPLETED')) DESC");
133-
} else {
134-
queryStr.append("ORDER BY p.nickname ASC");
135-
}
136-
137-
return queryStr.toString();
138-
}
139-
140132
private boolean isValidTitle(FilterTeamStatusRequest filter) {
141133
return filter.taskTitle() != null && !filter.taskTitle().isEmpty();
142134
}
143135

144-
private void setQueryParameters(TypedQuery<TaskEntity> query, FilterTeamStatusRequest filter) {
145-
if (isValidTitle(filter)) {
146-
query.setParameter("title", "%" + filter.taskTitle() + "%");
147-
}
148-
if (!filter.mainCategoryIds().isEmpty()) {
149-
query.setParameter("mainCategories", filter.mainCategoryIds());
150-
}
151-
if (!filter.categoryIds().isEmpty()) {
152-
query.setParameter("categories", filter.categoryIds());
153-
}
154-
}
155-
156136
@Override
157137
public Page<TaskEntity> findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest filterTaskListRequest) {
158138
BooleanBuilder builder = createFilter(filterTaskListRequest);

0 commit comments

Comments
 (0)