Fetch data in ConversationDataSource in parallel.

This commit is contained in:
Greyson Parrelli
2023-08-30 15:57:46 -04:00
committed by Nicholas Tinsley
parent e46759f436
commit 95c6f569d6
21 changed files with 297 additions and 273 deletions

View File

@@ -5285,7 +5285,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
val previews = getLinkPreviews(cursor, attachments)
val previewAttachments = previews.mapNotNull { it.thumbnail.orElse(null) }.toSet()
val slideDeck = buildSlideDeck(context, attachments.filterNot { contactAttachments.contains(it) }.filterNot { previewAttachments.contains(it) })
val slideDeck = buildSlideDeck(attachments.filterNot { contactAttachments.contains(it) }.filterNot { previewAttachments.contains(it) })
val quote = getQuote(cursor)
@@ -5437,7 +5437,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
companion object {
@JvmStatic
fun buildSlideDeck(context: Context, attachments: List<DatabaseAttachment>): SlideDeck {
fun buildSlideDeck(attachments: List<DatabaseAttachment>): SlideDeck {
val messageAttachments = attachments
.filterNot { it.isQuote }
.sortedWith(DisplayOrderComparator())

View File

@@ -70,22 +70,20 @@ class ReactionTable(context: Context, databaseHelper: SignalDatabase) : Database
return reactions
}
fun getReactionsForMessages(messageIds: Collection<MessageId>): Map<MessageId, List<ReactionRecord>> {
fun getReactionsForMessages(messageIds: Collection<Long>): Map<Long, List<ReactionRecord>> {
if (messageIds.isEmpty()) {
return emptyMap()
}
val messageIdToReactions: MutableMap<MessageId, MutableList<ReactionRecord>> = mutableMapOf()
val messageIdToReactions: MutableMap<Long, MutableList<ReactionRecord>> = mutableMapOf()
val args: List<Array<String>> = messageIds.map { SqlUtil.buildArgs(it.id) }
val args: List<Array<String>> = messageIds.map { SqlUtil.buildArgs(it) }
for (query: SqlUtil.Query in SqlUtil.buildCustomCollectionQuery("$MESSAGE_ID = ?", args)) {
readableDatabase.query(TABLE_NAME, null, query.where, query.whereArgs, null, null, null).use { cursor ->
while (cursor.moveToNext()) {
val reaction: ReactionRecord = readReaction(cursor)
val messageId = MessageId(
id = CursorUtil.requireLong(cursor, MESSAGE_ID)
)
val messageId = CursorUtil.requireLong(cursor, MESSAGE_ID)
var reactionsList: MutableList<ReactionRecord>? = messageIdToReactions[messageId]

View File

@@ -229,7 +229,7 @@ public class MediaMmsMessageRecord extends MmsMessageRecord {
getOriginalMessageId(), getRevisionNumber());
}
public @NonNull MediaMmsMessageRecord withAttachments(@NonNull Context context, @NonNull List<DatabaseAttachment> attachments) {
public @NonNull MediaMmsMessageRecord withAttachments(@NonNull List<DatabaseAttachment> attachments) {
Map<AttachmentId, DatabaseAttachment> attachmentIdMap = new HashMap<>();
for (DatabaseAttachment attachment : attachments) {
attachmentIdMap.put(attachment.getAttachmentId(), attachment);
@@ -239,10 +239,10 @@ public class MediaMmsMessageRecord extends MmsMessageRecord {
Set<Attachment> contactAttachments = contacts.stream().map(Contact::getAvatarAttachment).filter(Objects::nonNull).collect(Collectors.toSet());
List<LinkPreview> linkPreviews = updateLinkPreviews(getLinkPreviews(), attachmentIdMap);
Set<Attachment> linkPreviewAttachments = linkPreviews.stream().map(LinkPreview::getThumbnail).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toSet());
Quote quote = updateQuote(context, getQuote(), attachments);
Quote quote = updateQuote(getQuote(), attachments);
List<DatabaseAttachment> slideAttachments = attachments.stream().filter(a -> !contactAttachments.contains(a)).filter(a -> !linkPreviewAttachments.contains(a)).collect(Collectors.toList());
SlideDeck slideDeck = MessageTable.MmsReader.buildSlideDeck(context, slideAttachments);
SlideDeck slideDeck = MessageTable.MmsReader.buildSlideDeck(slideAttachments);
return new MediaMmsMessageRecord(getId(), getFromRecipient(), getFromDeviceId(), getToRecipient(), getDateSent(), getDateReceived(), getServerTimestamp(), getDeliveryReceiptCount(), getThreadId(), getBody(), slideDeck,
getType(), getIdentityKeyMismatches(), getNetworkFailures(), getSubscriptionId(), getExpiresIn(), getExpireStarted(), isViewOnce(),
@@ -302,7 +302,7 @@ public class MediaMmsMessageRecord extends MmsMessageRecord {
.collect(Collectors.toList());
}
private static @Nullable Quote updateQuote(@NonNull Context context, @Nullable Quote quote, @NonNull List<DatabaseAttachment> attachments) {
private static @Nullable Quote updateQuote(@Nullable Quote quote, @NonNull List<DatabaseAttachment> attachments) {
if (quote == null) {
return null;
}

View File

@@ -0,0 +1,41 @@
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.database.model
import org.thoughtcrime.securesms.attachments.DatabaseAttachment
import org.thoughtcrime.securesms.database.CallTable
import org.thoughtcrime.securesms.payments.Payment
fun MessageRecord.withReactions(reactions: List<ReactionRecord>): MessageRecord {
return if (this is MediaMmsMessageRecord) {
this.withReactions(reactions)
} else {
this
}
}
fun MessageRecord.withAttachments(attachments: List<DatabaseAttachment>): MessageRecord {
return if (this is MediaMmsMessageRecord) {
this.withAttachments(attachments)
} else {
this
}
}
fun MessageRecord.withPayment(payment: Payment): MessageRecord {
return if (this is MediaMmsMessageRecord) {
this.withPayment(payment)
} else {
this
}
}
fun MessageRecord.withCall(call: CallTable.Call): MessageRecord {
return if (this is MediaMmsMessageRecord) {
this.withCall(call)
} else {
this
}
}