From b80547eda0f70d013b40236f6526245a1e2fa39a Mon Sep 17 00:00:00 2001 From: "Byeongju, Shin" <404err@naver.com> Date: Tue, 26 Dec 2023 16:43:33 +0900 Subject: [PATCH] fix: Fix ReviewService for statistical calculation --- .../application/service/ReviewService.java | 47 ++++++++----------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/perfume-api/src/main/java/io/perfume/api/review/application/service/ReviewService.java b/perfume-api/src/main/java/io/perfume/api/review/application/service/ReviewService.java index a2de7308..5df4d6ce 100644 --- a/perfume-api/src/main/java/io/perfume/api/review/application/service/ReviewService.java +++ b/perfume-api/src/main/java/io/perfume/api/review/application/service/ReviewService.java @@ -78,12 +78,6 @@ public Long getReviewCountByUserId(Long userId) { return reviewQueryRepository.findReviewCountByUserId(userId); } - private > Map createEmptyMap(Class enumClass) { - Map map = new HashMap<>(); - EnumSet.allOf(enumClass).forEach(enumValue -> map.putIfAbsent(enumValue, 0L)); - return map; - } - @Transactional(readOnly = true) public List getPaginatedReviews(long page, long size) { return reviewQueryRepository.findByPage(page, size).stream().map(ReviewResult::from).toList(); @@ -106,31 +100,28 @@ public long getCommentCount(long reviewId) { @Transactional(readOnly = true) public ReviewStatisticResult getStatisticByPerfume(Long perfumeId) { - ReviewFeatureCount reviewFeatureCount = reviewQueryRepository.getReviewFeatureCount(perfumeId); - - Long totalReviews = reviewFeatureCount.totalReviews(); - if (totalReviews == 0) { - return new ReviewStatisticResult( - createEmptyMap(Strength.class), - createEmptyMap(Duration.class), - createEmptyMap(Season.class), - createEmptyMap(DayType.class), - createEmptyMap(Sex.class)); - } + final ReviewFeatureCount reviewFeatureCount = + reviewQueryRepository.getReviewFeatureCount(perfumeId); + + final long totalReviewCount = reviewFeatureCount.totalReviews(); return new ReviewStatisticResult( - calculatePercentage(reviewFeatureCount.strengthMap(), totalReviews), - calculatePercentage(reviewFeatureCount.durationMap(), totalReviews), - calculatePercentage(reviewFeatureCount.seasonMap(), totalReviews), - calculatePercentage(reviewFeatureCount.dayTypeMap(), totalReviews), - calculatePercentage(reviewFeatureCount.sexMap(), totalReviews)); + calculateUserReviewStatisticsPercentage( + Strength.class, reviewFeatureCount.strengthMap(), totalReviewCount), + calculateUserReviewStatisticsPercentage( + Duration.class, reviewFeatureCount.durationMap(), totalReviewCount), + calculateUserReviewStatisticsPercentage( + Season.class, reviewFeatureCount.seasonMap(), totalReviewCount), + calculateUserReviewStatisticsPercentage( + DayType.class, reviewFeatureCount.dayTypeMap(), totalReviewCount), + calculateUserReviewStatisticsPercentage( + Sex.class, reviewFeatureCount.sexMap(), totalReviewCount)); } - private > Map calculatePercentage( - Map map, Long totalReviews) { - EnumSet.allOf(map.keySet().iterator().next().getDeclaringClass()) - .forEach(enumValue -> map.putIfAbsent(enumValue, 0L)); - - return map.entrySet().stream() + private > Map calculateUserReviewStatisticsPercentage( + final Class enumClazz, final Map map, final long totalReviews) { + Map mutableMap = new HashMap<>(map); + EnumSet.allOf(enumClazz).forEach(enumValue -> mutableMap.putIfAbsent(enumValue, 0L)); + return mutableMap.entrySet().stream() .collect( Collectors.toMap( Map.Entry::getKey, e -> Math.round((double) e.getValue() / totalReviews * 100)));