Skip to content

Commit

Permalink
feat: 레이팅 조회 쿼리 개선
Browse files Browse the repository at this point in the history
  • Loading branch information
DWL21 committed Feb 9, 2025
1 parent 120197a commit 7feb275
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 32 deletions.
Original file line number Diff line number Diff line change
@@ -1,42 +1,14 @@
package com.yourssu.soongpt.domain.rating.implement

import com.yourssu.soongpt.domain.course.implement.Courses
import com.yourssu.soongpt.domain.rating.implement.Rating.Companion.INIT
import com.yourssu.soongpt.domain.rating.implement.exception.RatingNotFoundByCourseNameException
import org.springframework.stereotype.Component

@Component
class RatingReader(
private val ratingRepository: RatingRepository,
) {
fun findAllPointPairs(courses: Courses): Map<Long, Double> {
val ratings = findAllBy(courses)
val pointPairs = mutableMapOf<Long, Double>()
for (course in courses.values) {
val find = ratings.find {
it.courseName == course.courseName && it.professorName == course.professorName
}
pointPairs[course.id!!] = find?.point ?: INIT
}
return pointPairs
}

private fun findAllBy(courses: Courses): List<Rating> {
val ratings = mutableListOf<Rating>()
for (course in courses.values) {
val rating = ratingRepository.findByCourseNameAndProfessorName(
course.courseName,
course.professorName?: ""
)
if (rating != null) {
ratings.add(rating)
}
}
return ratings
}

fun findBy(courseName: String, professorName: String): Rating {
return ratingRepository.findByCourseNameAndProfessorName(courseName, professorName)
?: throw RatingNotFoundByCourseNameException()
val candidates = courses.values.map { Triple(it.id!!, it.courseName, it.professorName?:"") }
return ratingRepository.findAllByCourseNameAndProfessorName(candidates)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ package com.yourssu.soongpt.domain.rating.implement
interface RatingRepository {
fun save(rating: Rating): Rating
fun findByCourseNameAndProfessorName(courseName: String, professorName: String): Rating?
fun findAllByCourseNameAndProfessorName(pairs: List<Triple<Long, String, String>>): Map<Long, Double>
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,34 @@ class RatingRepositoryImpl(

override fun findByCourseNameAndProfessorName(courseName: String, professorName: String): Rating? {
return jpaQueryFactory.selectFrom(ratingEntity)
.where(ratingEntity.courseName.like(courseName))
.where(ratingEntity.courseName.eq(courseName))
.where(ratingEntity.professorName.eq(professorName))
.fetchFirst()
?.toDomain()
}

override fun findAllByCourseNameAndProfessorName(pairs: List<Triple<Long, String, String>>): Map<Long, Double> {
val results = mutableMapOf<Long, Double>()

val predicates = pairs.map {
ratingEntity.courseName.eq(it.second).and(ratingEntity.professorName.eq(it.third))
}

val ratings = jpaQueryFactory.selectFrom(ratingEntity)
.where(predicates.reduce { acc, predicate -> acc.or(predicate) })
.fetch()
.map { it.toDomain() }

for (pair in pairs) {
val rating =
ratings.find { it.courseName == pair.second && it.professorName == pair.third }
results[pair.first] = rating?.point ?: Rating.INIT
}
return results
}


}

interface RatingJpaRepository: JpaRepository<RatingEntity, Long> {
interface RatingJpaRepository : JpaRepository<RatingEntity, Long> {
}

0 comments on commit 7feb275

Please sign in to comment.