diff --git a/app/src/androidTest/java/com/nextcloud/talk/data/database/dao/ChatBlocksDaoTest.kt b/app/src/androidTest/java/com/nextcloud/talk/data/database/dao/ChatBlocksDaoTest.kt index e296c8f18..d836a37d6 100644 --- a/app/src/androidTest/java/com/nextcloud/talk/data/database/dao/ChatBlocksDaoTest.kt +++ b/app/src/androidTest/java/com/nextcloud/talk/data/database/dao/ChatBlocksDaoTest.kt @@ -174,6 +174,84 @@ class ChatBlocksDaoTest { assertEquals(5, results.first().size) } + @Test + fun testGetConnectedChatBlocksWithThreadsScenario() = + runTest { + val user = createUserEntity("account1", "Account 1") + usersDao.saveUser(user) + val account1 = usersDao.getUserWithUserId("account1").blockingGet() + + conversationsDao.upsertConversations( + listOf( + createConversationEntity( + accountId = account1.id, + "abc", + roomName = "Conversation One" + ), + createConversationEntity( + accountId = account1.id, + "def", + roomName = "Conversation Two" + ) + ) + ) + + val conversation1 = conversationsDao.getConversationsForUser(account1.id).first()[0] + + val searchedChatBlock = ChatBlockEntity( + internalConversationId = conversation1.internalId, + accountId = conversation1.accountId, + token = conversation1.token, + threadId = 123, + oldestMessageId = 50, + newestMessageId = 60, + hasHistory = true + ) + + val chatBlockOverlap1 = ChatBlockEntity( + internalConversationId = conversation1.internalId, + accountId = conversation1.accountId, + token = conversation1.token, + threadId = null, + oldestMessageId = 45, + newestMessageId = 55, + hasHistory = true + ) + + val chatBlockOverlap2 = ChatBlockEntity( + internalConversationId = conversation1.internalId, + accountId = conversation1.accountId, + token = conversation1.token, + threadId = 123, + oldestMessageId = 59, + newestMessageId = 70, + hasHistory = true + ) + + chatBlocksDao.upsertChatBlock(searchedChatBlock) + + chatBlocksDao.upsertChatBlock(chatBlockOverlap1) + chatBlocksDao.upsertChatBlock(chatBlockOverlap2) + + val resultsForThreadIdNull = chatBlocksDao.getConnectedChatBlocks( + internalConversationId = conversation1.internalId, + threadId = null, + oldestMessageId = searchedChatBlock.oldestMessageId, + newestMessageId = searchedChatBlock.newestMessageId + ) + + assertEquals(1, resultsForThreadIdNull.first().size) + + val resultsForThreadId123 = chatBlocksDao.getConnectedChatBlocks( + internalConversationId = conversation1.internalId, + threadId = 123, + oldestMessageId = searchedChatBlock.oldestMessageId, + newestMessageId = searchedChatBlock.newestMessageId + ) + + assertEquals(2, resultsForThreadId123.first().size) + } + private fun createUserEntity(userId: String, userName: String) = UserEntity( userId = userId, diff --git a/app/src/main/java/com/nextcloud/talk/data/database/dao/ChatBlocksDao.kt b/app/src/main/java/com/nextcloud/talk/data/database/dao/ChatBlocksDao.kt index 40ac38a28..ee22ee043 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/dao/ChatBlocksDao.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/dao/ChatBlocksDao.kt @@ -52,7 +52,7 @@ interface ChatBlocksDao { SELECT * FROM ChatBlocks WHERE internalConversationId in (:internalConversationId) - AND (:threadId IS NULL OR threadId = :threadId) + AND (threadId = :threadId OR (threadId IS NULL AND :threadId IS NULL)) AND oldestMessageId <= :messageId AND newestMessageId >= :messageId ORDER BY newestMessageId ASC @@ -69,7 +69,7 @@ interface ChatBlocksDao { SELECT * FROM ChatBlocks WHERE internalConversationId = :internalConversationId - AND (:threadId IS NULL OR threadId = :threadId) + AND (threadId = :threadId OR (threadId IS NULL AND :threadId IS NULL)) AND( (oldestMessageId <= :oldestMessageId AND newestMessageId >= :oldestMessageId) OR @@ -92,7 +92,7 @@ interface ChatBlocksDao { SELECT MAX(newestMessageId) as max_items FROM ChatBlocks WHERE internalConversationId = :internalConversationId - AND (:threadId IS NULL OR threadId = :threadId) + AND (threadId = :threadId OR (threadId IS NULL AND :threadId IS NULL)) """ ) fun getNewestMessageIdFromChatBlocks(internalConversationId: String, threadId: Long?): Long