Filter what gets shown in search

This commit is contained in:
Kgothatso Ngako
2026-04-20 01:13:23 +02:00
parent 033c99cf9e
commit 22001a5ec4
5 changed files with 65 additions and 2 deletions

View File

@@ -6,7 +6,10 @@ import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy.Companion.IGNORE
import androidx.room.Query
import androidx.room.RawQuery
import androidx.room.RoomRawQuery
import androidx.room.Upsert
import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.Kind
import kotlinx.coroutines.flow.Flow
import kotlin.time.Instant
@@ -16,6 +19,24 @@ interface NostrEventDao {
@Query("SELECT * FROM NostrEvent WHERE kind in (:kinds) ORDER BY createdAt DESC")
fun observeNostrEvents(kinds: Array<Kind>): Flow<List<LocalNostrEvent>>
@Query("SELECT * FROM NostrEvent WHERE content LIKE '%' || :search || '%' AND kind in (:kinds) ORDER BY createdAt DESC")
fun observeFilteredNostrEvents(
kinds: Array<Kind>,
search: String
): Flow<List<LocalNostrEvent>>
@Query("SELECT * FROM NostrEvent WHERE kind in (:kinds) AND id in (:ids) ORDER BY createdAt DESC")
fun observeFilteredNostrEvents(
kinds: Array<Kind>,
ids: Array<HexKey>,
): Flow<List<LocalNostrEvent>>
@Query("SELECT * FROM NostrEvent WHERE kind in (:kinds) AND pubKey in (:authors) ORDER BY createdAt DESC")
fun observeAuthoredNostrEvents(
kinds: Array<Kind>,
authors: Array<HexKey>,
): Flow<List<LocalNostrEvent>>
@Query("SELECT * FROM NostrEvent WHERE kind in (:kinds) ORDER BY savedAt DESC")
fun getAllNostrEvents(kinds: Array<Kind>): List<NostrEvent>

View File

@@ -1,7 +1,9 @@
package ac.aux.compose.database.model.types
import androidx.sqlite.SQLiteStatement
import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.Kind
import com.vitorpamplona.quartz.nip01Core.store.sqlite.bindAny
import kotlinx.serialization.Serializable
import kotlin.time.Instant

View File

@@ -15,9 +15,11 @@ import ac.aux.compose.database.model.intermdiate.LocalNostrEvent
import ac.aux.compose.database.model.intermdiate.LocalAccount
import ac.aux.compose.database.model.intermdiate.LocalProfile
import ac.aux.compose.database.model.typealiases.SynchronizationFilterArray
import ac.aux.compose.database.model.types.SynchronizationFilter
import ac.aux.compose.nostr.Relays
import ac.aux.compose.repository.NostrRepository
import ac.aux.compose.repository.RelayRepository
import androidx.room.RoomRawQuery
import co.touchlab.kermit.Logger
import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent
@@ -38,6 +40,7 @@ import com.vitorpamplona.quartz.nip57Zaps.LnZapEvent
import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import okio.Buffer
import kotlin.collections.emptyMap
import kotlin.collections.plus
import kotlin.time.Clock
@@ -324,6 +327,37 @@ class DatabaseNostrRepository(
)
}
override suspend fun observeNostrFeed(synchronizationFilter: SynchronizationFilter): Flow<List<LocalNostrEvent>> {
return when {
synchronizationFilter.kinds != null && synchronizationFilter.search != null -> {
database.nostrEventDao().observeFilteredNostrEvents(
kinds = synchronizationFilter.kinds,
search = synchronizationFilter.search
)
}
synchronizationFilter.kinds != null && synchronizationFilter.ids != null -> {
database.nostrEventDao().observeFilteredNostrEvents(
kinds = synchronizationFilter.kinds,
ids = synchronizationFilter.ids
)
}
synchronizationFilter.kinds != null && synchronizationFilter.authors != null -> {
database.nostrEventDao().observeAuthoredNostrEvents(
kinds = synchronizationFilter.kinds,
authors = synchronizationFilter.authors
)
}
else -> {
database.nostrEventDao().observeNostrEvents(
kinds = arrayOf(
TextNoteEvent.KIND,
)
)
}
}
}
override suspend fun observeLocalNostrEventById(nostrEventId: String): Flow<LocalNostrEvent?> {
return database.nostrEventDao().observeNostrEventById(nostrEventId)
}

View File

@@ -12,6 +12,7 @@ import ac.aux.compose.database.model.intermdiate.LocalNostrEvent
import ac.aux.compose.database.model.intermdiate.LocalAccount
import ac.aux.compose.database.model.intermdiate.LocalProfile
import ac.aux.compose.database.model.typealiases.SynchronizationFilterArray
import ac.aux.compose.database.model.types.SynchronizationFilter
import com.vitorpamplona.quartz.nip01Core.core.HexKey
import kotlinx.coroutines.flow.Flow
@@ -72,6 +73,8 @@ interface NostrRepository {
suspend fun observeNostrFeed(): Flow<List<LocalNostrEvent>>
suspend fun observeNostrFeed(synchronizationFilter: SynchronizationFilter): Flow<List<LocalNostrEvent>>
suspend fun observeLocalNostrEventById(nostrEventId: String): Flow<LocalNostrEvent?>
suspend fun searchableProfiles(): List<Profile>
@@ -171,6 +174,10 @@ interface NostrRepository {
TODO("Not yet implemented")
}
override suspend fun observeNostrFeed(synchronizationFilter: SynchronizationFilter): Flow<List<LocalNostrEvent>> {
TODO("Not yet implemented")
}
override suspend fun observeLocalNostrEventById(nostrEventId: String): Flow<LocalNostrEvent?> {
TODO("Not yet implemented")
}

View File

@@ -148,8 +148,7 @@ class SearchResultViewModel(
logger.d("loadSearchResultFeed: $searchQuery")
viewModelScope.launch(Dispatchers.IO) {
// This is something not taking into consideration the results we are actually looking for...
// TODO: Search local notes using the [synchronizationFilter]
nostrRepository.observeNostrFeed().collect { localNostrEvents ->
nostrRepository.observeNostrFeed(synchronizationFilter).collect { localNostrEvents ->
searchResultListUIState = SearchResultListUIState.Loaded(
localNostrEvents = localNostrEvents
)