11package org .ezcode .codetest .infrastructure .persistence .repository .submission .query ;
22
33
4+ import java .sql .Date ;
45import java .time .LocalDate ;
6+ import java .util .LinkedHashMap ;
57import java .util .List ;
8+ import java .util .Map ;
9+ import java .util .Objects ;
610import java .util .Set ;
11+ import java .util .stream .Collectors ;
712
813import org .ezcode .codetest .domain .submission .dto .DailyCorrectCount ;
914import org .ezcode .codetest .domain .submission .model .entity .QUserProblemResult ;
1015import org .springframework .stereotype .Repository ;
11-
12- import com .querydsl .core .group .GroupBy ;
13- import com .querydsl .core .types .Projections ;
14- import com .querydsl .core .types .dsl .NumberExpression ;
1516import com .querydsl .core .types .dsl .Expressions ;
1617import com .querydsl .jpa .impl .JPAQueryFactory ;
1718
1819import lombok .RequiredArgsConstructor ;
20+ import lombok .extern .slf4j .Slf4j ;
1921
22+ @ Slf4j
2023@ Repository
2124@ RequiredArgsConstructor
2225public class UserProblemResultQueryRepositoryImpl implements UserProblemResultQueryRepository {
@@ -28,25 +31,34 @@ public List<DailyCorrectCount> countCorrectByUserGroupedByDate(Long userId) {
2831
2932 QUserProblemResult upr = QUserProblemResult .userProblemResult ;
3033
31- var date = Expressions .dateTemplate (LocalDate .class , "DATE({0})" , upr .modifiedAt );
32- NumberExpression <Long > countDistinctProblem = upr .problem .id .countDistinct ();
34+ var date = Expressions .dateTemplate (Date .class , "DATE({0})" , upr .modifiedAt );
3335
34- return queryFactory
36+ var results = queryFactory
37+ .select (date , upr .problem .id )
3538 .from (upr )
3639 .where (
3740 upr .user .id .eq (userId ),
3841 upr .isCorrect .eq (true )
3942 )
4043 .orderBy (date .asc ())
41- .transform (
42- GroupBy .groupBy (date ).list (
43- Projections .constructor (
44- DailyCorrectCount .class ,
45- date ,
46- countDistinctProblem ,
47- GroupBy .set (upr .problem .id )
48- )
44+ .fetch ();
45+
46+ Map <LocalDate , Set <Long >> problemIdsByDate = results .stream ()
47+ .collect (Collectors .groupingBy (
48+ tuple -> Objects .requireNonNull (tuple .get (0 , Date .class )).toLocalDate (),
49+ LinkedHashMap ::new ,
50+ Collectors .mapping (
51+ tuple -> tuple .get (1 , Long .class ),
52+ Collectors .toSet ()
4953 )
50- );
54+ ));
55+
56+ return problemIdsByDate .entrySet ().stream ()
57+ .map (entry -> new DailyCorrectCount (
58+ entry .getKey (),
59+ entry .getValue ().size (),
60+ entry .getValue ()
61+ ))
62+ .collect (Collectors .toList ());
5163 }
5264}
0 commit comments