diff --git a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java index 2bc42544..174e31eb 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java @@ -2,16 +2,16 @@ import java.time.LocalDate; +import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import org.ezcode.codetest.domain.submission.dto.DailyCorrectCount; import org.ezcode.codetest.domain.submission.model.entity.QUserProblemResult; import org.springframework.stereotype.Repository; - -import com.querydsl.core.group.GroupBy; -import com.querydsl.core.types.Projections; -import com.querydsl.core.types.dsl.NumberExpression; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -29,24 +29,38 @@ public List countCorrectByUserGroupedByDate(Long userId) { QUserProblemResult upr = QUserProblemResult.userProblemResult; var date = Expressions.dateTemplate(LocalDate.class, "DATE({0})", upr.modifiedAt); - NumberExpression countDistinctProblem = upr.problem.id.countDistinct(); - - return queryFactory + var results = queryFactory + .select( + date, + upr.problem.id.countDistinct(), + upr.problem.id + ) .from(upr) .where( upr.user.id.eq(userId), upr.isCorrect.eq(true) ) .orderBy(date.asc()) - .transform( - GroupBy.groupBy(date).list( - Projections.constructor( - DailyCorrectCount.class, - date, - countDistinctProblem, - GroupBy.set(upr.problem.id) - ) - ) - ); + .fetch(); + + // 결과를 수동으로 그룹화해야함 + Map> problemIdsByDate = new LinkedHashMap<>(); + Map countsByDate = new LinkedHashMap<>(); + + for (var result : results) { + LocalDate resultDate = result.get(0, LocalDate.class); + Long problemId = result.get(2, Long.class); + + problemIdsByDate.computeIfAbsent(resultDate, k -> new HashSet<>()).add(problemId); + countsByDate.put(resultDate, (long) problemIdsByDate.get(resultDate).size()); + } + + return problemIdsByDate.entrySet().stream() + .map(entry -> new DailyCorrectCount( + entry.getKey(), + countsByDate.get(entry.getKey()), + entry.getValue() + )) + .collect(Collectors.toList()); } }