Skip to content

Commit

Permalink
refactor: 리뷰 및 평점 보여주기 쿼리 횟수 개선
Browse files Browse the repository at this point in the history
  • Loading branch information
nuyh99 committed Jun 6, 2023
1 parent a03f809 commit 28691a0
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

import com.WAT.BEJURYU.entity.Drink;
import com.WAT.BEJURYU.entity.DrinkType;
import com.WAT.BEJURYU.entity.Review;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.util.Base64;
import java.util.Objects;
import java.util.List;

@Getter
@RequiredArgsConstructor
Expand All @@ -18,37 +18,22 @@ public class DrinkWithRatingResponse {
private final int reviewCount;
private final byte[] image;

public static DrinkWithRatingResponse from(final DrinkResponse drink, final double rating, final int reviewCount) {
return new DrinkWithRatingResponse(drink.getId(),
drink.getName(),
drink.getType(),
rating,
reviewCount,
drink.getImage());
}
public static DrinkWithRatingResponse from(final List<Review> reviews) {
final Drink drink = reviews.get(0).getDrink();

public static DrinkWithRatingResponse from(final Drink drink, final double rating, final int reviewCount) {
return new DrinkWithRatingResponse(drink.getId(),
drink.getName(),
drink.getType(),
rating,
reviewCount,
calculateRating(reviews),
reviews.size(),
drink.getImage());
}

public String toEncodedImage() {
return Base64.getEncoder().encodeToString(image);
}

@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (!(o instanceof final DrinkWithRatingResponse that)) return false;
return Objects.equals(name, that.name);
}
private static double calculateRating(final List<Review> reviews) {
final double sum = reviews.stream()
.mapToDouble(Review::getScore)
.sum();

@Override
public int hashCode() {
return Objects.hash(name);
return Math.round(sum / (double) reviews.size() * 100) / 100.0;
}
}
40 changes: 15 additions & 25 deletions backend/src/main/java/com/WAT/BEJURYU/service/DrinkService.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import static java.util.Comparator.comparingDouble;
import static java.util.Comparator.comparingInt;

@Service
@Transactional(readOnly = true)
public class DrinkService {
Expand Down Expand Up @@ -48,7 +49,7 @@ public DrinkResponse getDrinkById(final Long id) {
public List<DrinkResponse> getDrinksByName(String name) {
final List<Drink> drinks = drinkRepository.findAll().stream()
.filter(drink -> drink.getName().contains(name))
.collect(Collectors.toList());
.toList();

return drinks.stream()
.map(drink -> DrinkResponse.from(drink,
Expand All @@ -64,7 +65,7 @@ public List<DrinkResponse> getDrinksByType(final DrinkType type) {
.map(drink -> DrinkResponse.from(drink,
reviewService.getAverageScore(drink.getId()),
reviewService.getReviewSize(drink.getId())))
.collect(Collectors.toList());
.toList();
}

@Transactional
Expand All @@ -85,39 +86,28 @@ public List<DrinkWithRatingResponse> findTop10ByRating() {

return drinks.stream()
.filter(drink -> drink.getRating() != 0)
.sorted(Comparator.comparingDouble(DrinkWithRatingResponse::getRating).reversed())
.sorted(comparingDouble(DrinkWithRatingResponse::getRating).reversed())
.limit(10)
.collect(Collectors.toList());
.toList();
}

private List<DrinkWithRatingResponse> getDrinkWithRatingResponses() {
final List<Drink> drinks = drinkRepository.findAll();

final Map<String, List<DrinkWithRatingResponse>> collected = drinks.stream()
.map(drink -> DrinkWithRatingResponse.from(drink,
reviewService.getAverageScore(drink.getId()),
reviewService.getReviewSize(drink.getId())))
.collect(Collectors.groupingBy(DrinkWithRatingResponse::getName));

return collected.values().stream()
.map(list -> {
final int reviewCount = list.stream().mapToInt(DrinkWithRatingResponse::getReviewCount).sum();
final double rating = list.stream().mapToDouble(DrinkWithRatingResponse::getRating).sum() / list.size();

final DrinkWithRatingResponse drink = list.get(0);
return new DrinkWithRatingResponse(drink.getId(), drink.getName(), drink.getType(), rating, reviewCount, drink.getImage());
})
.collect(Collectors.toList());
return drinkRepository.findAll().stream()
.map(Drink::getName)
.distinct()
.map(reviewService::getReviewsByDrinkName)
.map(DrinkWithRatingResponse::from)
.toList();
}

public List<DrinkWithRatingResponse> findTop10ByReviews() {
final List<DrinkWithRatingResponse> drinks = getDrinkWithRatingResponses();

return drinks.stream()
.filter(drink -> drink.getReviewCount() != 0)
.sorted(Comparator.comparingInt(DrinkWithRatingResponse::getReviewCount).reversed())
.sorted(comparingInt(DrinkWithRatingResponse::getReviewCount).reversed())
.limit(10)
.collect(Collectors.toList());
.toList();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,14 @@ public ReviewService(ReviewRepository reviewRepository, final MemberRepository m

public ReviewResponses getReviews(long drinkId) {
final String name = drinkRepository.findById(drinkId).get().getName();
final List<Review> reviews = reviewRepository.findByDrinkName(name).stream()

return ReviewResponses.of(getReviewsByDrinkName(name));
}

public List<Review> getReviewsByDrinkName(final String name) {
return reviewRepository.findByDrinkName(name).stream()
.sorted(comparing(Review::getDate).reversed())
.collect(Collectors.toList());

return ReviewResponses.of(reviews);
}

public int getReviewSize(long drinkId) {
Expand Down

0 comments on commit 28691a0

Please sign in to comment.