feat: 動的にクエリを構築するように

This commit is contained in:
usbharu 2023-09-29 19:19:05 +09:00
parent 14022e9301
commit cab50e61a5
Signed by: usbharu
GPG Key ID: 6556747BF94EEBC8
1 changed files with 28 additions and 10 deletions

View File

@ -1,17 +1,19 @@
package dev.usbharu.hideout.service.post package dev.usbharu.hideout.service.post
import dev.usbharu.hideout.domain.mastodon.model.generated.Status import dev.usbharu.hideout.domain.mastodon.model.generated.Status
import dev.usbharu.hideout.domain.model.hideout.entity.Timeline
import dev.usbharu.hideout.query.mastodon.StatusQueryService import dev.usbharu.hideout.query.mastodon.StatusQueryService
import dev.usbharu.hideout.repository.MongoTimelineRepository import dev.usbharu.hideout.repository.MongoTimelineRepository
import kotlinx.coroutines.Dispatchers import org.springframework.data.mongodb.core.MongoTemplate
import kotlinx.coroutines.withContext import org.springframework.data.mongodb.core.query.Criteria
import org.springframework.data.domain.Pageable import org.springframework.data.mongodb.core.query.Query
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
@Service @Service
class MongoGenerateTimelineService( class MongoGenerateTimelineService(
private val mongoTimelineRepository: MongoTimelineRepository, private val mongoTimelineRepository: MongoTimelineRepository,
private val statusQueryService: StatusQueryService private val statusQueryService: StatusQueryService,
private val mongoTemplate: MongoTemplate
) : ) :
GenerateTimelineService { GenerateTimelineService {
override suspend fun getTimeline( override suspend fun getTimeline(
@ -23,12 +25,28 @@ class MongoGenerateTimelineService(
sinceId: Long?, sinceId: Long?,
limit: Int limit: Int
): List<Status> { ): List<Status> {
val timelines =
withContext(Dispatchers.IO) {
mongoTimelineRepository.findByUserIdAndTimelineIdAndPostIdBetweenAndIsLocal( val query = Query()
forUserId, 0, maxId, minId, localOnly, Pageable.ofSize(limit) if (forUserId != null) {
) val criteria = Criteria.where("userId").`is`(forUserId)
} query.addCriteria(criteria)
}
if (localOnly) {
val criteria = Criteria.where("isLocal").`is`(true)
query.addCriteria(criteria)
}
if (maxId != null) {
val criteria = Criteria.where("postId").lt(maxId)
query.addCriteria(criteria)
}
if (minId != null) {
val criteria = Criteria.where("postId").gt(minId)
query.addCriteria(criteria)
}
val timelines = mongoTemplate.find(query.limit(limit), Timeline::class.java)
return statusQueryService.findByPostIds(timelines.flatMap { setOfNotNull(it.postId, it.replyId, it.repostId) }) return statusQueryService.findByPostIds(timelines.flatMap { setOfNotNull(it.postId, it.replyId, it.repostId) })
} }
} }