-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJpaLoadCollectionRatingCalculator.java
More file actions
107 lines (81 loc) ยท 3.34 KB
/
Copy pathJpaLoadCollectionRatingCalculator.java
File metadata and controls
107 lines (81 loc) ยท 3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package ssu.eatssu.domain.rating.entity;
import ssu.eatssu.domain.menu.entity.Meal;
import ssu.eatssu.domain.menu.entity.MealMenu;
import ssu.eatssu.domain.menu.entity.Menu;
import ssu.eatssu.domain.review.dto.RatingAverages;
import ssu.eatssu.domain.review.dto.ReviewRatingCount;
/**
* JPA ์ OneToMany๊ฐ์ฒด์ฐธ์กฐ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ ํด๋์ค์
๋๋ค.
*/
public class JpaLoadCollectionRatingCalculator implements RatingCalculator {
// ์๋จ์ ํฌํจ๋ ๋ฉ๋ด๋ค์ ํ์ ๋ณ ๋ฆฌ๋ทฐ ๊ฐ์ ๊ณ์ฐ
public ReviewRatingCount mealRatingCount(Meal meal) {
ReviewRating.resetAll();
meal.getMealMenus().forEach(mealMenu -> mealMenu.getMenu().getReviews().calculateReviewRatings());
return ReviewRating.toResponse();
}
// ๊ฐ ๋ฉ๋ด์ ํ์ ๋ณ ๊ฐ์ ๊ณ์ฐ
public ReviewRatingCount menuRatingCount(Menu menu) {
ReviewRating.resetAll();
menu.getReviews().calculateReviewRatings();
return ReviewRating.toResponse();
}
// ์๋จ ํ๊ท ํ์ ์ธํธ ๊ณ์ฐ
public RatingAverages mealAverageRatings(Meal meal) {
long totalReviewCount = mealTotalReviewCount(meal);
if (totalReviewCount == 0)
return new RatingAverages(null);
return RatingAverages.builder()
.mainRating(averageRating(mealTotalMainRating(meal), totalReviewCount))
.build();
}
// ๋ฉ๋ด ํ๊ท ํ์ ์ธํธ ๊ณ์ฐ
public RatingAverages menuAverageRatings(Menu menu) {
int totalReviewCount = menu.getTotalReviewCount();
if (totalReviewCount == 0) {
return new RatingAverages(null);
}
return RatingAverages.builder()
.mainRating(averageRating(menuTotalMainRating(menu), totalReviewCount))
.build();
}
// ์๋จ ๋ฉ์ธ ํ์ ํ๊ท ๊ณ์ฐ
public Double mealAverageMainRating(Meal meal) {
long totalReviewCount = mealTotalReviewCount(meal);
if (totalReviewCount == 0) {
return null;
}
return averageRating(mealTotalMainRating(meal), totalReviewCount);
}
// ๋ฉ๋ด ๋ฉ์ธ ํ์ ํ๊ท ๊ณ์ฐ
public Double menuAverageMainRating(Menu menu) {
if (menu.getReviews().size() == 0) {
return null;
}
return averageRating(menuTotalMainRating(menu), menu.getReviews().size());
}
// ์๋จ ์ด ๋ฆฌ๋ทฐ ๊ฐ์
public long mealTotalReviewCount(Meal meal) {
return meal.getMealMenus().stream()
.map(MealMenu::getMenu)
.mapToLong(menu -> menu.getReviews().size()).sum();
}
// ํ๊ท ํ์ ๊ณ์ฐ
public Double averageRating(Integer totalRating, long totalReviewCount) {
if (totalRating == null || totalReviewCount == 0) {
return null;
}
return totalRating / (double) totalReviewCount;
}
// ์๋จ ๋ฉ์ธ ํ์ ์ดํฉ
public Integer mealTotalMainRating(Meal meal) {
return meal.getMealMenus().stream()
.map(MealMenu::getMenu)
.map(menu -> menu.getReviews().getTotalMainRating())
.reduce(null, this::sum);
}
// ๋ฉ๋ด ๋ฉ์ธ ํ์ ์ดํฉ
public Integer menuTotalMainRating(Menu menu) {
return menu.getReviews().getTotalMainRating();
}
}