From 27e45614b22cc3e36affd0e1988a268230cfbef4 Mon Sep 17 00:00:00 2001 From: nano-mm Date: Tue, 4 Feb 2025 09:29:42 +0900 Subject: [PATCH] =?UTF-8?q?CLAP-244=20refactor:=20=ED=8C=80=20=EC=9E=91?= =?UTF-8?q?=EC=97=85=20=EC=A1=B0=ED=9A=8C=20=ED=95=84=ED=84=B0=EB=A7=81=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20QueryDSL=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/TaskCustomRepositoryImpl.java | 86 +++++++------------ 1 file changed, 33 insertions(+), 53 deletions(-) diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java index 84e8880c..b6fa1e00 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java @@ -12,7 +12,7 @@ import com.querydsl.core.types.dsl.DateTimePath; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; -import jakarta.persistence.TypedQuery; +import com.querydsl.core.types.dsl.CaseBuilder; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -58,27 +58,45 @@ public Page findTasksAssignedByManager(Long processorId, Pageable pa @Override public List findTeamStatus(Long memberId, FilterTeamStatusRequest filter) { - // 1. 담당자 목록을 가져옴 (페이징 제거) - List processorIds = queryFactory - .select(taskEntity.processor.memberId) - .from(taskEntity) - .groupBy(taskEntity.processor.memberId) - .orderBy("기여도순".equals(filter.sortBy()) ? - taskEntity.taskId.count().desc() : - taskEntity.processor.nickname.asc()) - .fetch(); + BooleanBuilder builder = new BooleanBuilder(); + + // 담당자 ID 필터링 + if (memberId != null) { + builder.and(taskEntity.processor.memberId.eq(memberId)); + } + + // 작업 타이틀 필터링 + if (filter.taskTitle() != null && !filter.taskTitle().isEmpty()) { + builder.and(taskEntity.title.containsIgnoreCase(filter.taskTitle())); + } + + // 1차 카테고리 필터링 + if (!filter.mainCategoryIds().isEmpty()) { + builder.and(taskEntity.category.mainCategory.categoryId.in(filter.mainCategoryIds())); + } - if (processorIds.isEmpty()) { - return List.of(); // 결과가 없으면 빈 리스트 반환 + // 2차 카테고리 필터링 + if (!filter.categoryIds().isEmpty()) { + builder.and(taskEntity.category.categoryId.in(filter.categoryIds())); } - // 2. 담당자별 작업 조회 (페이징 제거) + // 정렬 조건 적용 + OrderSpecifier orderBy = "기여도순".equals(filter.sortBy()) + ? new CaseBuilder() + .when(taskEntity.taskStatus.eq(TaskStatus.IN_PROGRESS) + .or(taskEntity.taskStatus.eq(TaskStatus.PENDING_COMPLETED))) + .then(1) + .otherwise(0) + .desc() + : taskEntity.processor.nickname.asc(); + + // 쿼리 실행 List taskEntities = queryFactory .selectFrom(taskEntity) - .where(taskEntity.processor.memberId.in(processorIds)) + .where(builder) + .orderBy(orderBy) .fetch(); - // 3. 담당자별 그룹핑 return taskEntities.stream() .collect(Collectors.groupingBy(t -> t.getProcessor().getMemberId())) .entrySet().stream() @@ -111,48 +129,10 @@ public List findTeamStatus(Long memberId, FilterTeamStat }).collect(Collectors.toList()); } - - - private String buildQueryString(FilterTeamStatusRequest filter) { - StringBuilder queryStr = new StringBuilder("SELECT t FROM TaskEntity t " + - "JOIN FETCH t.processor p " + - "WHERE (:memberId IS NULL OR p.memberId = :memberId) "); - - if (!filter.taskTitle().isEmpty()) { - queryStr.append("AND t.title LIKE :title "); - } - if (!filter.mainCategoryIds().isEmpty()) { - queryStr.append("AND t.category.mainCategory.id IN :mainCategories "); - } - if (!filter.categoryIds().isEmpty()) { - queryStr.append("AND t.category.id IN :categories "); - } - - if ("기여도순".equals(filter.sortBy())) { - queryStr.append("ORDER BY (SELECT COUNT(te) FROM TaskEntity te WHERE te.processor = p AND te.taskStatus IN ('IN_PROGRESS', 'PENDING_COMPLETED')) DESC"); - } else { - queryStr.append("ORDER BY p.nickname ASC"); - } - - return queryStr.toString(); - } - private boolean isValidTitle(FilterTeamStatusRequest filter) { return filter.taskTitle() != null && !filter.taskTitle().isEmpty(); } - private void setQueryParameters(TypedQuery query, FilterTeamStatusRequest filter) { - if (isValidTitle(filter)) { - query.setParameter("title", "%" + filter.taskTitle() + "%"); - } - if (!filter.mainCategoryIds().isEmpty()) { - query.setParameter("mainCategories", filter.mainCategoryIds()); - } - if (!filter.categoryIds().isEmpty()) { - query.setParameter("categories", filter.categoryIds()); - } - } - @Override public Page findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest filterTaskListRequest) { BooleanBuilder builder = createFilter(filterTaskListRequest);