Skip to content

Commit

Permalink
GETP-325 feat: 프로젝트 지원 테이블 인덱스 설계를 통해 프로젝트 목록 조회 API 성능 약 2.35배 개선 (#182
Browse files Browse the repository at this point in the history
)
  • Loading branch information
scv1702 authored Nov 12, 2024
1 parent ed2a825 commit 33b1a3e
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package es.princip.getp.persistence.adapter.project.apply;

import com.querydsl.core.types.dsl.BooleanExpression;
import es.princip.getp.application.project.apply.port.out.CountProjectApplicationPort;
import es.princip.getp.domain.project.apply.model.ProjectApplicationStatus;
import es.princip.getp.domain.project.commission.model.ProjectId;
import es.princip.getp.persistence.adapter.project.apply.model.QProjectApplicationJpaEntity;
import es.princip.getp.persistence.adapter.project.apply.model.QTeammateJpaEntity;
Expand All @@ -23,15 +25,29 @@ class CountProjectApplicationAdapter extends QueryDslSupport implements CountPro
= QProjectApplicationJpaEntity.projectApplicationJpaEntity;
private static final QTeammateJpaEntity teammate = QTeammateJpaEntity.teammateJpaEntity;

private static final ProjectApplicationStatus[] statusesWithoutPendingTeamApproval
= Arrays.stream(ProjectApplicationStatus.values())
.filter(status -> !status.equals(PENDING_TEAM_APPROVAL))
.toArray(ProjectApplicationStatus[]::new);

private static BooleanExpression applicationStatusNePendingTeamApproval() {
return application.status.in(statusesWithoutPendingTeamApproval);
}

private static BooleanExpression teammateApplicationStatusNePendingTeamApproval() {
return teammate.application.status.in(statusesWithoutPendingTeamApproval);
}

@Override
public Map<ProjectId, Long> countBy(final ProjectId... projectId) {
final Long[] ids = Arrays.stream(projectId)
.map(ProjectId::getValue)
.toArray(Long[]::new);

final Map<ProjectId, Long> counts = queryFactory.select(application.projectId, application.count())
.from(application)
.where(application.projectId.in(ids)
.and(application.status.ne(PENDING_TEAM_APPROVAL)))
.and(applicationStatusNePendingTeamApproval()))
.groupBy(application.projectId)
.fetch()
.stream()
Expand All @@ -40,10 +56,11 @@ public Map<ProjectId, Long> countBy(final ProjectId... projectId) {
tuple -> Optional.ofNullable(tuple.get(application.count()))
.orElse(0L)
));

queryFactory.select(teammate.application.projectId, teammate.count())
.from(teammate)
.where(teammate.application.projectId.in(ids)
.and(teammate.application.status.ne(PENDING_TEAM_APPROVAL)))
.and(teammateApplicationStatusNePendingTeamApproval()))
.groupBy(teammate.application.projectId)
.fetch()
.forEach(tuple -> {
Expand All @@ -52,6 +69,7 @@ public Map<ProjectId, Long> countBy(final ProjectId... projectId) {
.orElse(0L);
counts.put(key, counts.getOrDefault(key, 0L) + value);
});

return counts;
}

Expand All @@ -60,13 +78,15 @@ public Long countBy(final ProjectId projectId) {
Long count = queryFactory.select(application.count())
.from(application)
.where(application.projectId.eq(projectId.getValue())
.and(application.status.ne(PENDING_TEAM_APPROVAL)))
.and(applicationStatusNePendingTeamApproval()))
.fetchOne();

count += queryFactory.select(teammate.count())
.from(teammate)
.where(teammate.application.projectId.eq(projectId.getValue())
.and(teammate.application.status.ne(PENDING_TEAM_APPROVAL)))
.and(teammateApplicationStatusNePendingTeamApproval()))
.fetchOne();

return count;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
create index ix_project_application_project_id_status
on project_application(project_id, status);

create index ix_team_project_application_teammate_project_application_id
on team_project_application_teammate(project_application_id);

0 comments on commit 33b1a3e

Please sign in to comment.