Skip to content

Commit dbaa57c

Browse files
committed
⚡️ Optimized search ⚡️
1 parent 65e8f56 commit dbaa57c

File tree

4 files changed

+73
-33
lines changed

4 files changed

+73
-33
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package club.anifox.backend.domain.enums.common
2+
3+
enum class LanguageType {
4+
JAPANESE, RUSSIAN, ENGLISH, UNKNOWN
5+
}

src/main/kotlin/club/anifox/backend/service/anime/components/search/AnimeSearchComponent.kt

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import club.anifox.backend.domain.enums.anime.AnimeStatus
55
import club.anifox.backend.domain.enums.anime.AnimeType
66
import club.anifox.backend.domain.enums.anime.filter.AnimeDefaultFilter
77
import club.anifox.backend.domain.enums.anime.filter.AnimeSearchFilter
8+
import club.anifox.backend.domain.enums.common.LanguageType.*
89
import club.anifox.backend.domain.mappers.anime.light.toAnimeLight
910
import club.anifox.backend.domain.model.anime.light.AnimeLight
1011
import club.anifox.backend.jpa.entity.anime.AnimeTable
@@ -14,6 +15,8 @@ import club.anifox.backend.jpa.entity.anime.common.AnimeStudioTable
1415
import club.anifox.backend.jpa.entity.anime.episodes.AnimeTranslationTable
1516
import club.anifox.backend.jpa.repository.anime.AnimeGenreRepository
1617
import club.anifox.backend.jpa.repository.anime.AnimeStudiosRepository
18+
import club.anifox.backend.util.detectLanguage
19+
import club.anifox.backend.util.replaceLast
1720
import jakarta.persistence.EntityManager
1821
import jakarta.persistence.PersistenceContext
1922
import jakarta.persistence.criteria.JoinType
@@ -163,14 +166,26 @@ class AnimeSearchComponent {
163166

164167
println("FVCX = $searchVariants")
165168

166-
val searchFields = listOf(
169+
val language = searchQuery.detectLanguage()
170+
171+
val searchFields = mutableListOf(
167172
root.get<String>("title"),
168-
root.joinList<AnimeTable, String>("titleOther", JoinType.LEFT),
169-
root.joinList<AnimeTable, String>("titleEn", JoinType.LEFT),
170-
root.joinList<AnimeTable, String>("titleJapan", JoinType.LEFT),
171-
root.joinList<AnimeTable, String>("synonyms", JoinType.LEFT),
172173
)
173174

175+
when (language) {
176+
JAPANESE -> {
177+
searchFields.add(root.joinList<AnimeTable, String>("titleJapan", JoinType.LEFT))
178+
}
179+
RUSSIAN -> {
180+
searchFields.add(root.joinList<AnimeTable, String>("titleOther", JoinType.LEFT))
181+
searchFields.add(root.joinList<AnimeTable, String>("synonyms", JoinType.LEFT))
182+
}
183+
ENGLISH -> {
184+
searchFields.add(root.joinList<AnimeTable, String>("titleEn", JoinType.LEFT))
185+
}
186+
UNKNOWN -> { }
187+
}
188+
174189
val searchPredicates = mutableListOf<Predicate>()
175190

176191
// Для каждого варианта написания создаем предикаты
@@ -387,14 +402,4 @@ class AnimeSearchComponent {
387402

388403
return variants
389404
}
390-
391-
fun String.replaceLast(oldValue: String, newValue: String): String {
392-
val lastIndex = lastIndexOf(oldValue)
393-
if (lastIndex == -1) {
394-
return this
395-
}
396-
val prefix = substring(0, lastIndex)
397-
val suffix = substring(lastIndex + oldValue.length)
398-
return "$prefix$newValue$suffix"
399-
}
400405
}

src/main/kotlin/club/anifox/backend/tasks/ParserTasks.kt

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,30 @@ class ParserTasks {
1616

1717
private val logger = LoggerFactory.getLogger(this::class.java)
1818

19-
@Scheduled(fixedDelay = 24, timeUnit = TimeUnit.HOURS)
20-
fun parseAnime() {
21-
animeService.parseTranslations(listOf(610, 609, 735, 643, 559, 739, 767, 825, 933, 557, 794, 1002, 1978, 1291, 1272, 1946))
22-
animeService.parseAnime()
23-
}
19+
// @Scheduled(fixedDelay = 24, timeUnit = TimeUnit.HOURS)
20+
// fun parseAnime() {
21+
// animeService.parseTranslations(listOf(610, 609, 735, 643, 559, 739, 767, 825, 933, 557, 794, 1002, 1978, 1291, 1272, 1946))
22+
// animeService.parseAnime()
23+
// }
2424

2525
@Scheduled(fixedDelay = 24, timeUnit = TimeUnit.HOURS)
2626
fun parseAnimeIntegrations() {
2727
animeService.parseAnimeIntegrations()
2828
}
2929

30-
@Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS)
31-
fun updateData() {
32-
animeService.updateEpisodes(
33-
onlyOngoing = false,
34-
)
35-
}
36-
37-
@Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS)
38-
fun updateDataOngoingOnly() {
39-
animeService.updateEpisodes(
40-
onlyOngoing = true,
41-
)
42-
}
30+
// @Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS)
31+
// fun updateData() {
32+
// animeService.updateEpisodes(
33+
// onlyOngoing = false,
34+
// )
35+
// }
36+
//
37+
// @Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS)
38+
// fun updateDataOngoingOnly() {
39+
// animeService.updateEpisodes(
40+
// onlyOngoing = true,
41+
// )
42+
// }
4343

4444
@Scheduled(fixedDelay = 5, timeUnit = TimeUnit.MINUTES)
4545
fun logHealthStatus() {
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package club.anifox.backend.util
2+
3+
import club.anifox.backend.domain.enums.common.LanguageType
4+
5+
fun String.replaceLast(oldValue: String, newValue: String): String {
6+
val lastIndex = lastIndexOf(oldValue)
7+
if (lastIndex == -1) {
8+
return this
9+
}
10+
val prefix = substring(0, lastIndex)
11+
val suffix = substring(lastIndex + oldValue.length)
12+
return "$prefix$newValue$suffix"
13+
}
14+
15+
fun String.detectLanguage(): LanguageType {
16+
val japaneseRegex = Regex("[ぁ-んァ-ン一-龥]")
17+
val russianRegex = Regex("[А-Яа-я]")
18+
val englishRegex = Regex("[A-Za-z]")
19+
20+
val japaneseCount = japaneseRegex.findAll(this).count()
21+
val russianCount = russianRegex.findAll(this).count()
22+
val englishCount = englishRegex.findAll(this).count()
23+
24+
return when {
25+
japaneseCount > englishCount && japaneseCount > russianCount -> LanguageType.JAPANESE
26+
russianCount > japaneseCount && russianCount > englishCount -> LanguageType.RUSSIAN
27+
englishCount > japaneseCount && englishCount > russianCount -> LanguageType.ENGLISH
28+
else -> LanguageType.UNKNOWN
29+
}
30+
}

0 commit comments

Comments
 (0)