From b160baae3edff6e41905e8d0ae0299b05d83035b Mon Sep 17 00:00:00 2001 From: James Magahern Date: Fri, 29 Mar 2024 01:20:08 -0700 Subject: [PATCH] backend: don't fetch messages with conversations. --- backend/chat-cache-test | Bin 0 -> 32768 bytes backend/chat-cache-test.lock | Bin 0 -> 1728 bytes .../backend/db/CachedChatDatabase.kt | 19 ++++++++++-------- .../backend/db/model/Conversation.kt | 13 ------------ 4 files changed, 11 insertions(+), 21 deletions(-) create mode 100644 backend/chat-cache-test create mode 100644 backend/chat-cache-test.lock diff --git a/backend/chat-cache-test b/backend/chat-cache-test new file mode 100644 index 0000000000000000000000000000000000000000..ccbf1ede010fab1f62342d41adb511164ada4ae3 GIT binary patch literal 32768 zcmeHPO>i4WcJ9IN5FkKMq(sQ0l7V7Kig-A_@tx; zpmwMUP5(N@>j{ROLZ3c=T;mmkKd#muudV*l`TVb(Cj+Fw*yO77Z2fWd@v5`3zBYiw z1lC|+N7?r3^Oa|=Q+x3A`O5l$?rajvv@Ta+;hFo{WA|6bn#G6@$T7qcDaH~)K9Cpw zd?k(f9{QNC>}PrjZAwAF)SlME)JmG}BU(xRN%cCQ-m)ZN6dKi|?5@+YZ?)S`)vNxX zAJ*7{Z_&5p+we7gn`lY>F)3a`Aler1-K7_5OPFZ&v=7l556VOjdO&zeU+~W%O6vC^ zV{xlzJR0+bgoV~Hwk=_$KdOFD^-~qpxhH8X&>&FtqwkbxTy%l{O?Tm8^l#nW7^oPW z2xC{*+?AU9OhT^~Z=9xo&icAjU4G)Otbh26KY#d&3MZ;PCj_F!dw7-12w)O%TM21e6{qz3MN~NTYt#no9Kd zv7jDQa7osye!xR7_X7uk!$2aK3eKV>^}}R&>4ILF_wLdQEl8MX_O$=r^m2#uPNRur z%JJ1SmgE@(P!W(N^pfkO>Zj0BZhl>}{5$AN@Hk_O8jIj`V^J1^P&CaK zVcO(BG@7lzMXm@R_<1xK4IKmQ2Rl2H^Z%PN7BVO z+D?yLz?zTFy47EW>eQcD?YxOr{D2Sp*+#e--U}!6ls*dt z;fan@DWnx07j(+HV43jf7h2?0sRj0d?Dye-bJUdWlwK}NSP3vFNU;8MRJE6A2t3fB z@2VetrzGbCeQoGH`g#ZY30>tH%C2)2Wj9!iYblFyHDxibrwkiG(gB~EK0=V7i@60B ze3ri)YLC!31aGnpwg-(P7)O8LzG%+p@kr|9A$ZhMj4goH67niCEgSJ#!gu0)nFX^Cj^O_J?11(@(FZLmsA~sb`sZ_2 zy#*PK#-GPNC`T3}8=x;?tr1~g{~n&2gr&Z1Mtb#aklwT;ze*4K^@ik0>HK=rj`Zlw zThN>1T60V5*PE5vV<$!Y(0Y}kVjcuTo+DztHp8ag(Djk_h(7wU^W>>$Pk6CzODqZh zcZ+SZLw^dVlB-jH@H&$H_!plLMS|7(nHWP$G1frYLhc~rkFVb1Knr&z5W-*;L9p>h< zMW>dl8tF7X(8x9%*Qyw~qFbm{YV}O6U@|*XGwW%$V7U288jbR%;pEe{k;}Q6YSpe3 zv-LEy3r;dLeIA^0k_g%Q$Jn%7Vo-CY-P3t$N<9u{_Diw5o=a z&SAKG9uv=CbSqOSf?21 zh2)QQklHQQV;=iPADtb2DeWPO$S2E>*HZX%QtR&8`c3vjgNY9ua}g?GFQUp0ku5qc z@3AGWhv*k6{afLkVKR*aIr%o?TX2(w+)8r%*XcXNU88=3`KAL_ncGA=3TVm_Sc0R7RJWe1Wwl= zc4(N5!Nu|O{VC@kYJj#%Y8<})T07E!A)t1kqaBh_Kq8pVW7@lv2qyDF<*Vnk_G~CW z#%shbP6X?ZSDe%*v>s%~`u%lFt~Yd)r} z4G3&NU<1*hzy<|2D6m0+4Msx(8xq)%z=i}i6b%b(SYX2f8y47bR2NuXV0D4j1y+xa z2<(W!jtK0Cz>cJ7y&(G-+3WqlPOuz0ve{;IcWiq?*g@5f>~_EH-et4Q8cmP`$^Ajt z?^w1D1CE1(`aP2VU>j?$l^8P-3@joyka5Oy`@Ky#e5b7ZLE6_dfGH6j90fC(w3{=F z^&IS+?UDgD5ud;!xtU@n@8q2djP^2ZjDS)Jopw|C)Bj>^5)3TPq{>3Wn}>`Mxm`6dLG1|hz{r?x2%0D>`xOGkP-8{P~b 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 bJPCLb@Fd_#z>|O{0Z#&+1Uw16Mgso_j1UB5 literal 0 HcmV?d00001 diff --git a/backend/chat-cache-test.lock b/backend/chat-cache-test.lock new file mode 100644 index 0000000000000000000000000000000000000000..4b8f81e5226419049e0287337c73a5bf47fbafd5 GIT binary patch literal 1728 zcmeH{I|{-;5QaDL{U8Pv6Rd(*Sc#=&3K1K@qj-cIA*ILi7?vKvtTX>+23D{Tv2Y=o z$+ur7yR(pBwJ}K;nZTImHLao?6ZycobumgLp7?3c^NF8Ea{uovRQk5>zTRgQAMsTM z)37%?VhTl%qP@#{AuxOQHh}h;!0g3+0PVGa*}Dz^wC6sP(R?X3CD+%%>+GFo0J>fm zn7uRs(4K1pd-2@wx$Uucd*Qk5`HGr> { - return realm.query(Conversation::class, "guid == $0", conversation.guid) + return realm.query(Message::class, "conversationGUID == $0", conversation.guid) .find() - .first() - .messages .asFlow() - .map { it.set.map { it.toMessage(conversation) } } + .map { it.list.map { it.toMessage(conversation) } } } fun updateConversations(incomingConversations: List) = realm.writeBlocking { @@ -98,6 +96,7 @@ class CachedChatDatabase (private val realmConfig: RealmConfiguration) { participants = conversation.participants date = conversation.date unreadCount = conversation.unreadCount + lastMessagePreview = conversation.lastMessagePreview } } catch (e: NoSuchElementException) { // Conversation does not exist. Copy it to the realm. @@ -124,17 +123,21 @@ class CachedChatDatabase (private val realmConfig: RealmConfiguration) { fun writeMessages(messages: List, conversation: ModelConversation, outgoing: Boolean = false) { val dbConversation = getManagedConversationByGuid(conversation.guid) realm.writeBlocking { - val dbMessages = messages + messages .map { it.toDatabaseMessage(outgoing = outgoing) } .map { copyToRealm(it, updatePolicy = UpdatePolicy.ALL) } - findLatest(dbConversation)?.messages?.addAll(dbMessages) + findLatest(dbConversation)?.let { + it.lastMessagePreview = messages.last().displayText + it.date = messages.last().date.toInstant().toRealmInstant() + } } } fun fetchMessages(conversation: ModelConversation): List { - val dbConversation = getConversationByGuid(conversation.guid) - return dbConversation.messages.map { it.toMessage(dbConversation.toConversation()) } + return realm.query(Message::class, "conversationGUID == $0", conversation.guid) + .find() + .map { it.toMessage(conversation) } } fun close() { diff --git a/backend/src/main/java/net/buzzert/kordophone/backend/db/model/Conversation.kt b/backend/src/main/java/net/buzzert/kordophone/backend/db/model/Conversation.kt index 927d60a..0c455db 100644 --- a/backend/src/main/java/net/buzzert/kordophone/backend/db/model/Conversation.kt +++ b/backend/src/main/java/net/buzzert/kordophone/backend/db/model/Conversation.kt @@ -25,7 +25,6 @@ open class Conversation( var unreadCount: Int, var lastMessagePreview: String?, - var messages: RealmSet, ): RealmObject { constructor() : this( @@ -36,8 +35,6 @@ open class Conversation( date = RealmInstant.now(), unreadCount = 0, lastMessagePreview = null, - - messages = realmSetOf() ) fun toConversation(): ModelConversation { @@ -51,19 +48,9 @@ open class Conversation( lastMessage = null, ) - if (messages.isNotEmpty()) { - val lastMessage = sortedMessages().last() - conversation.lastMessage = lastMessage.toMessage(conversation) - conversation.lastMessagePreview = lastMessage.text - } - return conversation } - private fun sortedMessages(): List { - return messages.sortedBy { it.date } - } - override fun equals(other: Any?): Boolean { if (other == null || javaClass != other.javaClass) return false