1
1
package org.gitanimals.quiz.domain.approved
2
2
3
3
import org.gitanimals.quiz.domain.core.Category
4
+ import org.gitanimals.quiz.domain.core.Language
4
5
import org.gitanimals.quiz.domain.core.Level
5
6
import org.slf4j.LoggerFactory
6
7
import org.springframework.data.domain.PageRequest
@@ -12,7 +13,7 @@ class QuizService(
12
13
private val quizRepository : QuizRepository ,
13
14
) {
14
15
15
- private var quizIdsAssociatedByLevelCache: Map <Level , List <Long >> = getQuizIdsAssociatedLevel()
16
+ private var quizIdsAssociatedByLevelCache: Map <Level , List <Quiz >> = getQuizIdsAssociatedLevel()
16
17
private val logger = LoggerFactory .getLogger(this ::class .simpleName)
17
18
18
19
fun createNewQuiz (
@@ -36,34 +37,52 @@ class QuizService(
36
37
fun findAllByIds (similarityQuizIds : List <Long >): List <Quiz > =
37
38
quizRepository.findAllById(similarityQuizIds)
38
39
39
- fun findAllQuizByLevel (levels : List <Level >): List <Quiz > {
40
- val allQuizs: Map <Level , MutableList <Long >> = this .quizIdsAssociatedByLevelCache
40
+ fun findAllQuizByLevelAndCategoryAndLanguage (
41
+ levels : List <Level >,
42
+ category : Category ,
43
+ language : Language ,
44
+ ): List <Quiz > {
45
+ val allQuizs: Map <Level , MutableList <Quiz >> = this .quizIdsAssociatedByLevelCache
41
46
.mapValues { it.value.toMutableList() }
42
47
43
- checkQuizPickable(levels, allQuizs)
48
+ checkAndCalibratePickableQuiz(
49
+ levels = levels,
50
+ category = category,
51
+ language = language,
52
+ allQuizs = allQuizs,
53
+ )
44
54
45
55
return runCatching {
46
- val quizIds = levels.map {
47
- val quizId = quizIdsAssociatedByLevelCache[it]?.random()
48
- allQuizs[it]?.remove(quizId)
49
- quizId
56
+ levels.map {
57
+ val quiz = quizIdsAssociatedByLevelCache[it]?.random()
58
+ ? : throw IllegalStateException (" Cannot pick quiz cause list is empty" )
59
+ allQuizs[it]?.remove(quiz)
60
+ quiz
50
61
}
51
-
52
- quizRepository.findAllById(quizIds)
53
62
}.getOrElse {
54
63
logger.error(" Cannot call findAllQuizByLevel. levels: $levels " , it)
55
64
throw it
56
65
}
57
66
}
58
67
59
- private fun checkQuizPickable (levels : List <Level >, allQuizs : Map <Level , MutableList <Long >>) {
68
+ private fun checkAndCalibratePickableQuiz (
69
+ levels : List <Level >,
70
+ category : Category ,
71
+ language : Language ,
72
+ allQuizs : Map <Level , MutableList <Quiz >>,
73
+ ) {
60
74
levels.forEach { level ->
61
- val isPickable = allQuizs[level]?.let { quizIds ->
62
- quizIds.size >= levels.count { it == level }
63
- } ? : false
75
+ allQuizs[level]?.removeIf { it.category != category || it.language != language }
76
+
77
+ val isPickable = allQuizs[level]
78
+ ?.filter { it.category == category && it.language == language }
79
+ ?.let { quizs ->
80
+ quizs.size >= levels.count { it == level }
81
+ } ? : false
64
82
65
83
check(isPickable) {
66
- val message = " Fail to checkQuizPickable cause level: \" $level \" pickable size is smaller than request level size: \" ${levels.count { it == level }} \" "
84
+ val message =
85
+ " Fail to checkQuizPickable cause level: \" $level \" pickable size is smaller than request level size: \" ${levels.count { it == level }} \" "
67
86
logger.warn(message)
68
87
message
69
88
}
@@ -75,19 +94,19 @@ class QuizService(
75
94
this .quizIdsAssociatedByLevelCache = getQuizIdsAssociatedLevel()
76
95
}
77
96
78
- private fun getQuizIdsAssociatedLevel (): Map <Level , List <Long >> {
79
- val quizCountCache: MutableMap <Level , MutableList <Long >> =
80
- Level .entries.associateWith { mutableListOf<Long >() }.toMutableMap()
97
+ private fun getQuizIdsAssociatedLevel (): Map <Level , List <Quiz >> {
98
+ val quizCountCache: MutableMap <Level , MutableList <Quiz >> =
99
+ Level .entries.associateWith { mutableListOf<Quiz >() }.toMutableMap()
81
100
82
101
var currentPage = 0
83
102
val pageSize = 100
84
103
var quizs = quizRepository.findAll(PageRequest .of(currentPage, pageSize))
85
- quizs.forEach { quizCountCache[it.level]?.add(it.id ) }
104
+ quizs.forEach { quizCountCache[it.level]?.add(it) }
86
105
87
106
while (quizs.hasNext()) {
88
107
currentPage + = 1
89
108
quizs = quizRepository.findAll(PageRequest .of(currentPage, pageSize))
90
- quizs.forEach { quizCountCache[it.level]?.add(it.id ) }
109
+ quizs.forEach { quizCountCache[it.level]?.add(it) }
91
110
}
92
111
93
112
return quizCountCache
0 commit comments