Skip to content

Commit

Permalink
snuttId 중복 존재해 테이블 추가 (#105)
Browse files Browse the repository at this point in the history
* snuttId 중복 존재해 테이블 추가

* 리뷰 반영
  • Loading branch information
Hank-Choi authored Apr 13, 2024
1 parent cc60e8a commit 97d8bf0
Show file tree
Hide file tree
Showing 10 changed files with 84 additions and 24 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.wafflestudio.snuttev.config

import jakarta.servlet.Filter
import org.springframework.boot.web.servlet.FilterRegistrationBean
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ package com.wafflestudio.snuttev.sync
import com.wafflestudio.snuttev.core.common.type.LectureClassification
import com.wafflestudio.snuttev.core.domain.lecture.model.Lecture
import com.wafflestudio.snuttev.core.domain.lecture.model.SemesterLecture
import com.wafflestudio.snuttev.core.domain.lecture.model.SnuttLectureIdMap
import com.wafflestudio.snuttev.core.domain.lecture.repository.LectureRepository
import com.wafflestudio.snuttev.core.domain.lecture.repository.SemesterLectureRepository
import com.wafflestudio.snuttev.core.domain.lecture.repository.SnuttLectureIdMapRepository
import com.wafflestudio.snuttev.sync.model.SnuttSemesterLecture
import jakarta.persistence.EntityManagerFactory
import org.springframework.batch.core.Job
Expand Down Expand Up @@ -34,6 +36,7 @@ class SnuttLectureSyncJobConfig(
private val mongoTemplate: MongoTemplate,
private val semesterLectureRepository: SemesterLectureRepository,
private val lectureRepository: LectureRepository,
private val snuttLectureIdMapRepository: SnuttLectureIdMapRepository,
) {
companion object {
private const val JOB_NAME = "SYNC_JOB"
Expand All @@ -44,6 +47,7 @@ class SnuttLectureSyncJobConfig(

private var lecturesMap: MutableMap<String, Lecture> = mutableMapOf()
private var semesterLecturesMap: MutableMap<String, SemesterLecture> = mutableMapOf()
private var snuttLectureIdMap: MutableMap<String, SnuttLectureIdMap> = mutableMapOf()

@Bean
fun syncJobNextSemester(jobRepository: JobRepository): Job {
Expand All @@ -59,6 +63,9 @@ class SnuttLectureSyncJobConfig(
semesterLectureRepository.findAllByYearAndSemesterWithLecture(targetYear, targetSemester)
.associateBy { "${it.lecture.courseNumber},${it.lecture.instructor},${it.year},${it.semester}" }
.toMutableMap()
snuttLectureIdMap = snuttLectureIdMapRepository.findAll()
.associateBy { it.snuttId }
.toMutableMap()

return JobBuilder(NEXT_SEMESTER_JOB_NAME, jobRepository)
.start(
Expand All @@ -81,14 +88,17 @@ class SnuttLectureSyncJobConfig(
semesterLectureRepository.findAllWithLecture()
.associateBy { "${it.lecture.courseNumber},${it.lecture.instructor},${it.year},${it.semester}" }
.toMutableMap()
snuttLectureIdMap = snuttLectureIdMapRepository.findAll()
.associateBy { it.snuttId }
.toMutableMap()
return JobBuilder(JOB_NAME, jobRepository)
.start(customReaderStep(jobRepository, Query()))
.build()
}

private fun customReaderStep(jobRepository: JobRepository, query: Query): Step {
return StepBuilder(CUSTOM_READER_JOB_STEP, jobRepository)
.chunk<SnuttSemesterLecture, SemesterLecture>(
.chunk<SnuttSemesterLecture, SyncProcessResult>(
CHUNK_SIZE,
JpaTransactionManager().apply {
this.entityManagerFactory = this@SnuttLectureSyncJobConfig.entityManagerFactory
Expand All @@ -110,8 +120,8 @@ class SnuttLectureSyncJobConfig(
.build()
}

private fun processor(): ItemProcessor<SnuttSemesterLecture, SemesterLecture> {
return ItemProcessor<SnuttSemesterLecture, SemesterLecture> { item: SnuttSemesterLecture ->
private fun processor(): ItemProcessor<SnuttSemesterLecture, SyncProcessResult> {
return ItemProcessor<SnuttSemesterLecture, SyncProcessResult> { item: SnuttSemesterLecture ->
val lecture: Lecture = lecturesMap["${item.courseNumber},${item.instructor}"]?.apply {
this.academicYear = item.academicYear
this.credit = item.credit
Expand All @@ -127,14 +137,13 @@ class SnuttLectureSyncJobConfig(
item.category,
LectureClassification.customValueOf(item.classification)!!,
).also { lecturesMap["${item.courseNumber},${item.instructor}"] = it }
semesterLecturesMap["${item.courseNumber},${item.instructor},${item.year},${item.semester}"]?.apply {
val semesterLecture = semesterLecturesMap["${item.courseNumber},${item.instructor},${item.year},${item.semester}"]?.apply {
this.academicYear = item.academicYear
this.category = item.category
this.classification = LectureClassification.customValueOf(item.classification)!!
this.extraInfo = item.remark
this.lecture = lecture
this.credit = item.credit
this.snuttId = item.id
} ?: SemesterLecture(
lecture,
item.year,
Expand All @@ -144,15 +153,26 @@ class SnuttLectureSyncJobConfig(
item.academicYear,
item.category,
LectureClassification.customValueOf(item.classification)!!,
item.id,
).also { semesterLecturesMap["${item.courseNumber},${item.instructor},${item.year},${item.semester}"] = it }
val snuttIdToLecture = snuttLectureIdMap[item.id] ?: SnuttLectureIdMap(
item.id,
semesterLecture,
).also { snuttLectureIdMap[item.id] = it }
SyncProcessResult(lecture, semesterLecture, snuttIdToLecture)
}
}

private fun writer(): ItemWriter<SemesterLecture> {
private fun writer(): ItemWriter<SyncProcessResult> {
return ItemWriter { items ->
lectureRepository.saveAll(items.map { it.lecture }.toSet())
semesterLectureRepository.saveAll(items.toSet())
semesterLectureRepository.saveAll(items.map { it.semesterLecture }.toSet())
snuttLectureIdMapRepository.saveAll(items.map { it.snuttLectureIdMap })
}
}
}

data class SyncProcessResult(
val lecture: Lecture,
val semesterLecture: SemesterLecture,
val snuttLectureIdMap: SnuttLectureIdMap,
)
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,6 @@ class SemesterLecture(
@Convert(converter = LectureClassificationConverter::class)
var classification: LectureClassification,

@Column(name = "snutt_id", columnDefinition = "char(24)")
var snuttId: String? = null,

@OneToMany(mappedBy = "semesterLecture")
val evaluations: List<LectureEvaluation> = listOf(),
) : BaseEntity()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.wafflestudio.snuttev.core.domain.lecture.model

import com.wafflestudio.snuttev.core.common.model.BaseEntity
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.FetchType
import jakarta.persistence.JoinColumn
import jakarta.persistence.ManyToOne

@Entity
class SnuttLectureIdMap(
@Column(name = "snutt_id", columnDefinition = "char(24)")
var snuttId: String,

@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "semester_lecture_id", nullable = false, unique = true)
var semesterLecture: SemesterLecture,
) : BaseEntity()
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,5 @@ interface LectureRepository : JpaRepository<Lecture, Long?>, LectureRepositoryCu
) from LectureEvaluation le right join le.semesterLecture sl where sl.lecture.id in :ids and le.isHidden = false group by sl.lecture.id
""",
)
fun findAllRatingsByLectureIds(ids: List<Long>): List<LectureRatingDao>
fun findAllRatingsByLectureIds(ids: Iterable<Long>): List<LectureRatingDao>
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,4 @@ interface SemesterLectureRepository : JpaRepository<SemesterLecture, Long> {
fun findAllByLectureIdOrderByYearDescSemesterDesc(lectureId: Long): List<SemesterLectureWithLecture>

fun findByYearAndSemesterAndLecture(year: Int, semester: Int, lecture: Lecture): SemesterLecture?

@Query("SELECT sl FROM SemesterLecture sl INNER JOIN FETCH Lecture l ON sl.lecture = l WHERE sl.snuttId IN :snuttIds")
fun findAllBySnuttIds(snuttIds: List<String>): List<SemesterLecture>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.wafflestudio.snuttev.core.domain.lecture.repository

import com.wafflestudio.snuttev.core.domain.lecture.model.SnuttLectureIdMap
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query

interface SnuttLectureIdMapRepository : JpaRepository<SnuttLectureIdMap, Long> {
@Query("SELECT ttm FROM SnuttLectureIdMap ttm JOIN FETCH ttm.semesterLecture WHERE ttm.snuttId IN :snuttIds")
fun findAllWithSemesterLectureBySnuttIds(snuttIds: List<String>): List<SnuttLectureIdMap>
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import com.wafflestudio.snuttev.core.domain.lecture.dto.SnuttLectureInfo
import com.wafflestudio.snuttev.core.domain.lecture.model.SemesterLectureWithLecture
import com.wafflestudio.snuttev.core.domain.lecture.repository.LectureRepository
import com.wafflestudio.snuttev.core.domain.lecture.repository.SemesterLectureRepository
import com.wafflestudio.snuttev.core.domain.lecture.repository.SnuttLectureIdMapRepository
import com.wafflestudio.snuttev.core.domain.tag.model.TagValueType
import com.wafflestudio.snuttev.core.domain.tag.repository.TagRepository
import org.springframework.data.domain.Page
Expand All @@ -28,6 +29,7 @@ class LectureService(
private val tagRepository: TagRepository,
private val lectureEvaluationRepository: LectureEvaluationRepository,
private val semesterUtils: SemesterUtils,
private val snuttLectureIdMapRepository: SnuttLectureIdMapRepository,
) {
fun search(param: SearchLectureRequest): Page<LectureDto> {
val request = mappingTagsToLectureProperty(param)
Expand Down Expand Up @@ -120,14 +122,16 @@ class LectureService(
}

fun getEvLectureSummaryForSnutt(semesterLectureSnuttIds: List<String>): List<EvLectureSummaryForSnutt> {
val lectures = semesterLectureRepository.findAllBySnuttIds(semesterLectureSnuttIds)
val ratingMap = lectureRepository.findAllRatingsByLectureIds(lectures.map { it.lecture.id!! })
val snuttIdLectureIdMap = snuttLectureIdMapRepository.findAllWithSemesterLectureBySnuttIds(semesterLectureSnuttIds)
.associate { it.semesterLecture.lecture.id!! to it.snuttId }
val lectureIds = snuttIdLectureIdMap.keys
val ratingMap = lectureRepository.findAllRatingsByLectureIds(lectureIds)
.associate { it.id to it.avgRating }
return lectures.map {
return lectureIds.map {
EvLectureSummaryForSnutt(
snuttId = it.snuttId!!,
evLectureId = it.lecture.id!!,
avgRating = ratingMap[it.lecture.id!!],
snuttId = snuttIdLectureIdMap[it]!!,
evLectureId = it,
avgRating = ratingMap[it],
)
}
}
Expand Down
5 changes: 3 additions & 2 deletions core/src/main/resources/application-core.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ spring:
default-ttl: 5m
repositories:
enabled: false

server:
port: 8081
---

spring.config.activate.on-profile: test
Expand All @@ -44,7 +45,7 @@ spring:
username:
password:
jpa:
show-sql: false
show-sql: true
data:
redis:
default-ttl: 5m
Expand Down
14 changes: 14 additions & 0 deletions core/src/main/resources/db/V5__snutt_lecture_id_map.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
ALTER TABLE semester_lecture DROP COLUMN snutt_id;
CREATE TABLE IF NOT EXISTS snutt_lecture_id_map
(
id BIGINT AUTO_INCREMENT
PRIMARY KEY,
created_at DATETIME(6) NOT NULL,
updated_at DATETIME(6) NOT NULL,
snutt_id CHAR(24) DEFAULT NULL,
semester_lecture_id BIGINT NOT NULL,
CONSTRAINT snutt_lecture_id_map__unique__snutt_id
UNIQUE (snutt_id),
CONSTRAINT snutt_lecture_id_map__fk__semester_lecture_id
FOREIGN KEY (semester_lecture_id) REFERENCES semester_lecture (id)
);

0 comments on commit 97d8bf0

Please sign in to comment.