From 7ba4d6352982435e4c3475eab83e3f103cbc554c Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Wed, 24 Jul 2024 14:58:53 -0300 Subject: [PATCH] Fix duplicated events, fix kinds filter --- .../greenart7c3/citrine/database/EventDao.kt | 3 ++ .../citrine/server/EventRepository.kt | 35 ++++++++++++++----- .../citrine/service/WebSocketServerService.kt | 7 +--- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/greenart7c3/citrine/database/EventDao.kt b/app/src/main/java/com/greenart7c3/citrine/database/EventDao.kt index efeeb78..7f80890 100644 --- a/app/src/main/java/com/greenart7c3/citrine/database/EventDao.kt +++ b/app/src/main/java/com/greenart7c3/citrine/database/EventDao.kt @@ -66,6 +66,9 @@ interface EventDao { @Transaction fun deleteOldestByKind(kind: Int, pubkey: String) + @Query("SELECT * FROM EventEntity WHERE kind >= 20000 AND kind < 30000") + fun getEphemeralEvents(): List + @Query( """ SELECT EventEntity.id diff --git a/app/src/main/java/com/greenart7c3/citrine/server/EventRepository.kt b/app/src/main/java/com/greenart7c3/citrine/server/EventRepository.kt index 6fde649..5f0ad26 100644 --- a/app/src/main/java/com/greenart7c3/citrine/server/EventRepository.kt +++ b/app/src/main/java/com/greenart7c3/citrine/server/EventRepository.kt @@ -1,5 +1,6 @@ package com.greenart7c3.citrine.server +import android.util.Log import androidx.sqlite.db.SimpleSQLiteQuery import com.greenart7c3.citrine.database.AppDatabase import com.greenart7c3.citrine.database.EventWithTags @@ -50,17 +51,35 @@ object EventRepository { } if (filter.kinds.isNotEmpty()) { - whereClause.add("EventEntity.kind IN (?)") - params.add(filter.kinds.joinToString(",")) + whereClause.add( + filter.kinds.joinToString(" OR ", prefix = "(", postfix = ")") { + "EventEntity.kind = ?" + }, + ) + params.addAll(filter.kinds) } if (filter.tags.isNotEmpty()) { - filter.tags.filterValues { it.isNotEmpty() }.forEach { tag -> - whereClause.add( - "TagEntity.col0Name = ? AND TagEntity.col1Value in (?)", - ) + val tags = filter.tags.filterValues { it.isNotEmpty() } + var tagQuery = "" + tags.forEach { tag -> + tagQuery = "EXISTS (SELECT TagEntity.pkEvent FROM TagEntity WHERE EventEntity.id = TagEntity.pkEvent" + tagQuery += " AND TagEntity.col0Name = ? AND (" params.add(tag.key) - params.add(tag.value.map { "'$it'" }.toString().removePrefix("[").removeSuffix("]")) + + var count2 = 0 + tag.value.forEach { + if (count2 == 0) { + count2++ + } else { + tagQuery += " OR " + } + tagQuery += " TagEntity.col1Value = ?" + params.add(it) + } + tagQuery += "))" + + whereClause.add(tagQuery) } } @@ -69,7 +88,6 @@ object EventRepository { var query = """ SELECT EventEntity.* FROM EventEntity EventEntity - LEFT JOIN TagEntity TagEntity ON EventEntity.id = TagEntity.pkEvent $predicatesSql ORDER BY EventEntity.createdAt DESC """ @@ -105,6 +123,7 @@ object EventRepository { events.forEach { val event = it.toEvent() if (!event.isExpired()) { + Log.d("event", "sending event ${event.id} subscription ${subscription.id} filter $filter") subscription.connection.session.send( subscription.objectMapper.writeValueAsString( listOf( diff --git a/app/src/main/java/com/greenart7c3/citrine/service/WebSocketServerService.kt b/app/src/main/java/com/greenart7c3/citrine/service/WebSocketServerService.kt index c7440ca..2a6e80e 100644 --- a/app/src/main/java/com/greenart7c3/citrine/service/WebSocketServerService.kt +++ b/app/src/main/java/com/greenart7c3/citrine/service/WebSocketServerService.kt @@ -43,12 +43,7 @@ class WebSocketServerService : Service() { private fun eventsToDelete(database: AppDatabase) { GlobalScope.launch(Dispatchers.IO) { if (Settings.deleteEphemeralEvents) { - val ephemeralEvents = EventRepository.query( - database, - EventFilter( - kinds = (20000 until 30000).toSet(), - ), - ) + val ephemeralEvents = database.eventDao().getEphemeralEvents() Log.d("timer", "Deleting ${ephemeralEvents.size} ephemeral events") database.eventDao().delete(ephemeralEvents.map { it.event.id }) }