본문 바로가기

카테고리 없음

24.03.20 평점 검색, nan을 0으로

어제 만들었던것에서 이어지는데,

실험결과 이것은

@Transactional
override fun getAllProducts(): List<ProductResponse> {
    val products = productRepository.findAll().filter { it.deletedAt == null }
    return products.map { product ->

        val reviews = reviewRepository.findAllByProductIdAndDeletedAtIsNull(product.id!!, Pageable.unpaged()).content
        val averageRating = reviews.map { it.rating }.average()

        product.ratingAverage = averageRating
        productRepository.save(product)

        ProductResponse(product)
    }
}

@Transactional
override fun getProductById(productId: Long): ProductResponse {
    val product =
        productRepository.findByIdAndDeletedAtIsNull(productId)
            .orElseThrow { ModelNotFoundException("Product", productId) }

    val reviews = reviewRepository.findAllByProductIdAndDeletedAtIsNull(productId, Pageable.unpaged()).content
    val averageRating = reviews.map { it.rating }.average()

    product.ratingAverage = averageRating
    productRepository.save(product)

    return ProductResponse(product)
}

 

 

 

이건 리뷰가 평점을 넣지 않은채로 생성이 되면 평점을 넣지 않은 리뷰가 NaN이라고 뜨길래 거슬렸었다.

"productId": 7,
    "title": "dsds",
    "content": "string",
    "imageUrl": "string",
    "price": 10,
    "ratingAverage": "NaN",
    "likes": 0,
    "createdAt": "2024-03-19T20:08:20.5571706",
    "updatedAt": "2024-03-19T20:08:20.5571706",
    "deletedAt": null

그래도 건드릴 이유는 없다고 생각해 내버려뒀지만, 나증에 평점순 조회를 할때 NaN 부분이 맨위로 나와서 보이게 되는것이 아닌가! 그래서 

 

@Transactional
override fun getAllProducts(): List<ProductResponse> {
    val products = productRepository.findAll().filter { it.deletedAt == null }
    return products.map { product ->

        val reviews = reviewRepository.findAllByProductIdAndDeletedAtIsNull(product.id!!, Pageable.unpaged()).content
        val averageRating = if (reviews.isNotEmpty()) reviews.map { it.rating }.average() else 0.0

        product.ratingAverage = averageRating
        productRepository.save(product)

        ProductResponse(product)
    }
}

@Transactional
override fun getProductById(productId: Long): ProductResponse {
    val product =
        productRepository.findByIdAndDeletedAtIsNull(productId)
            .orElseThrow { ModelNotFoundException("Product", productId) }

    val reviews = reviewRepository.findAllByProductIdAndDeletedAtIsNull(productId, Pageable.unpaged()).content
    val averageRating = if (reviews.isNotEmpty()) reviews.map { it.rating }.average() else 0.0

    product.ratingAverage = averageRating
    productRepository.save(product)

    return ProductResponse(product)
}

 

이렇게 

        val averageRating = reviews.map { it.rating }.average()를        

 val averageRating = if (reviews.isNotEmpty()) reviews.map { it.rating }.average() else 0.0로 바꿨다. 그러면 NaN은 0이되고 밑으로 정렬된다.

@Transactional
override fun searchProductsByRating(pageable: Pageable): List<ProductSearchResponse> {
    
    val products = searchProductRepository.findAllByDeletedAtIsNullOrderByRatingAverageDesc(pageable)

    products.forEach { product ->
        val reviews = reviewRepository.findAllByProductIdAndDeletedAtIsNull(product.id!!, Pageable.unpaged()).content
        val averageRating = reviews.map { it.rating }.average()
        product.ratingAverage = if (reviews.isNotEmpty()) averageRating else 0.0 // 평가가 없는 경우 평균 별점을 0으로 설정. 이거 없으면 nan이라고 나오고 맨 위에 나와서 방해함
        productRepository.save(product)
    }

    return products.map { product ->
        ProductSearchResponse(
            productId = product.id!!,
            title = product.title,
            content = product.content,
            imageUrl = product.imageUrl,
            price = product.price,
            ratingAverage = product.ratingAverage,
            likes = product.likes,
        )
    }
}

검색기능도 이렇게 만들었다.