Filter what gets shown in search
This commit is contained in:
@@ -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>
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user