From 7ce2e5feaea8d36aab1ec7235940bbece6262b20 Mon Sep 17 00:00:00 2001 From: sanggggg <37951125+sanggggg@users.noreply.github.com> Date: Fri, 5 Jul 2024 17:54:18 +0900 Subject: [PATCH] plus --- .../in/ExternalAccessibilitySearchService.kt | 69 +++++++++++++++++++ .../out/ExternalAccessibilityRepository.kt | 4 +- .../ExternalAccessibilityRepository.kt | 6 ++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 app-server/subprojects/bounded_context/external_accessibility/application/src/main/kotlin/club/staircrusher/external_accessibility/application/port/in/ExternalAccessibilitySearchService.kt diff --git a/app-server/subprojects/bounded_context/external_accessibility/application/src/main/kotlin/club/staircrusher/external_accessibility/application/port/in/ExternalAccessibilitySearchService.kt b/app-server/subprojects/bounded_context/external_accessibility/application/src/main/kotlin/club/staircrusher/external_accessibility/application/port/in/ExternalAccessibilitySearchService.kt new file mode 100644 index 000000000..a9d72b04e --- /dev/null +++ b/app-server/subprojects/bounded_context/external_accessibility/application/src/main/kotlin/club/staircrusher/external_accessibility/application/port/in/ExternalAccessibilitySearchService.kt @@ -0,0 +1,69 @@ +package club.staircrusher.external_accessibility.application.port.`in` + +import club.staircrusher.external_accessibility.application.port.out.persistence.ExternalAccessibilityRepository +import club.staircrusher.external_accessibility.domain.model.ExternalAccessibility +import club.staircrusher.stdlib.di.annotation.Component +import club.staircrusher.stdlib.geography.Length +import club.staircrusher.stdlib.geography.Location + +@Component +class ExternalAccessibilitySearchService( + private val externalAccessibilityRepository: ExternalAccessibilityRepository, +) { + fun searchExternalAccessibilities( + searchText: String?, + currentLocation: Location?, + distanceMetersLimit: Length, + ): List { + return externalAccessibilityRepository + .findAll() + .filter { + currentLocation ?: return@filter true + calcDistance(currentLocation, Location(it.longitude, it.latitude)).meter <= distanceMetersLimit.meter + } + .filter { + searchText ?: return@filter true + levenshteinDistance(searchText, it.name) <= 1 + } + } + + private fun calcDistance(l1: Location, l2: Location): Length { + val earthRadius = 6371.0 // Earth radius in kilometers + val lat1 = l1.lat + val lat2 = l2.lat + val lon1 = l1.lng + val lon2 = l2.lng + + val dLat = Math.toRadians(lat2 - lat1) + val dLon = Math.toRadians(lon2 - lon1) + + val a = + Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(Math.toRadians(lat1)) * + Math.cos(Math.toRadians(lat2)) * + Math.sin(dLon / 2) * + Math.sin(dLon / 2) + val c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)) + return Length(earthRadius * c) + } + + private fun levenshteinDistance(s1: String, s2: String): Int { + val dp = Array(s1.length + 1) { IntArray(s2.length + 1) } + for (i in 0..s1.length) { + for (j in 0..s2.length) { + dp[i][j] = + when { + i == 0 -> j + j == 0 -> i + else -> + minOf( + dp[i - 1][j - 1] + if (s1[i - 1] == s2[j - 1]) 0 else 1, + dp[i - 1][j] + 1, + dp[i][j - 1] + 1 + ) + } + } + } + return dp[s1.length][s2.length] + } +} diff --git a/app-server/subprojects/bounded_context/external_accessibility/application/src/main/kotlin/club/staircrusher/external_accessibility/application/port/out/ExternalAccessibilityRepository.kt b/app-server/subprojects/bounded_context/external_accessibility/application/src/main/kotlin/club/staircrusher/external_accessibility/application/port/out/ExternalAccessibilityRepository.kt index 8eef6006b..2287a5d47 100644 --- a/app-server/subprojects/bounded_context/external_accessibility/application/src/main/kotlin/club/staircrusher/external_accessibility/application/port/out/ExternalAccessibilityRepository.kt +++ b/app-server/subprojects/bounded_context/external_accessibility/application/src/main/kotlin/club/staircrusher/external_accessibility/application/port/out/ExternalAccessibilityRepository.kt @@ -4,4 +4,6 @@ import club.staircrusher.external_accessibility.domain.model.ExternalAccessibili import club.staircrusher.stdlib.domain.repository.EntityRepository @Suppress("TooManyFunctions") -interface ExternalAccessibilityRepository : EntityRepository {} +interface ExternalAccessibilityRepository : EntityRepository { + fun findAll(): List +} diff --git a/app-server/subprojects/bounded_context/external_accessibility/infra/src/main/kotlin/club/staircrusher/external_accessibility/infra/adapter/out/persistence/ExternalAccessibilityRepository.kt b/app-server/subprojects/bounded_context/external_accessibility/infra/src/main/kotlin/club/staircrusher/external_accessibility/infra/adapter/out/persistence/ExternalAccessibilityRepository.kt index c21270ea5..7ccc9d991 100644 --- a/app-server/subprojects/bounded_context/external_accessibility/infra/src/main/kotlin/club/staircrusher/external_accessibility/infra/adapter/out/persistence/ExternalAccessibilityRepository.kt +++ b/app-server/subprojects/bounded_context/external_accessibility/infra/src/main/kotlin/club/staircrusher/external_accessibility/infra/adapter/out/persistence/ExternalAccessibilityRepository.kt @@ -36,4 +36,10 @@ class ExternalAccessibilityRepository( queries.save(entity.toPersistenceModel()) return entity } + + override fun findAll(): List { + return queries.findAll() + .executeAsList() + .map { it.toDomainModel() } + } }