Reindex custom tags + tag as needed

This commit is contained in:
Isaac 2024-02-02 19:45:35 +01:00
parent e2d238a2aa
commit 1d8668a7c1
4 changed files with 79 additions and 1 deletions

View File

@ -596,7 +596,22 @@ public class GalleryController: ViewController, StandalonePresentableController,
let message: Signal<(Message, Bool)?, NoError>
var translateToLanguage: Signal<String?, NoError> = .single(nil)
switch source {
case let .peerMessagesAtId(messageId, _, _, _):
case let .peerMessagesAtId(messageId, chatLocation, customTag, _):
var peerIdValue: PeerId?
var threadIdValue: Int64?
switch chatLocation {
case let .peer(peerId):
peerIdValue = peerId
case let .replyThread(message):
peerIdValue = message.peerId
threadIdValue = message.threadId
case .feed:
break
}
if peerIdValue == context.account.peerId, let customTag {
context.engine.messages.internalReindexSavedMessagesCustomTagsIfNeeded(threadId: threadIdValue, tag: customTag)
}
message = context.account.postbox.messageAtId(messageId)
|> mapToSignal { message -> Signal<(Message, Bool)?, NoError> in
if let message, let peer = message.peers[message.id.peerId] as? TelegramGroup, let migrationPeerId = peer.migrationReference?.peerId {

View File

@ -17,6 +17,7 @@ private enum MetadataPrefix: Int8 {
case NextCustomTagId = 14
case PeerHistoryCustomTagInitialized = 15
case PeerHistoryCustomTagWithTagInitialized = 16
case PeerHistoryCustomTagWithTagReindexed = 17
}
public struct ChatListTotalUnreadCounters: PostboxCoding, Equatable {
@ -73,6 +74,7 @@ final class MessageHistoryMetadataTable: Table {
private var initializedHistoryPeerIds = Set<PeerId>()
private var initializedHistoryPeerIdTags: [PeerId: Set<MessageTags>] = [:]
private var initializedHistoryPeerIdCustomTags: [PeerId: Set<PeerIdThreadIdAndTag>] = [:]
private var reindexedHistoryPeerIdCustomTags: [PeerId: Set<PeerIdThreadIdAndTag>] = [:]
private var initializedGroupFeedIndexIds = Set<PeerGroupId>()
private var peerNextMessageIdByNamespace: [PeerId: [MessageId.Namespace: MessageId.Id]] = [:]
@ -120,6 +122,15 @@ final class MessageHistoryMetadataTable: Table {
return key
}
private func peerHistoryReindexedCustomTagKey(id: PeerId, threadId: Int64?, tag: Int32) -> ValueBoxKey {
let key = ValueBoxKey(length: 8 + 1 + 8 + 4)
key.setInt64(0, value: id.toInt64())
key.setInt8(8, value: MetadataPrefix.PeerHistoryCustomTagWithTagReindexed.rawValue)
key.setInt64(8 + 1, value: threadId ?? 0)
key.setInt32(8 + 1 + 8, value: tag)
return key
}
private func peerHistoryInitializedCustomTagWithTagKey(id: PeerId, threadId: Int64?, tag: Int32, regularTag: UInt32) -> ValueBoxKey {
let key = ValueBoxKey(length: 8 + 1 + 8 + 4 + 4)
key.setInt64(0, value: id.toInt64())
@ -342,6 +353,30 @@ final class MessageHistoryMetadataTable: Table {
self.valueBox.set(self.table, key: self.peerHistoryInitializedCustomTagWithTagKey(id: peerId, threadId: threadId, tag: tag, regularTag: regularTag), value: MemoryBuffer())
}
func setPeerCustomTagReindexed(peerId: PeerId, threadId: Int64?, tag: Int32) {
if self.reindexedHistoryPeerIdCustomTags[peerId] == nil {
self.reindexedHistoryPeerIdCustomTags[peerId] = Set()
}
self.reindexedHistoryPeerIdCustomTags[peerId]!.insert(PeerIdThreadIdAndTag(peerId: peerId, threadId: threadId, tag: tag, regularTag: nil))
self.valueBox.set(self.table, key: self.peerHistoryReindexedCustomTagKey(id: peerId, threadId: threadId, tag: tag), value: MemoryBuffer())
}
func isPeerCustomTagReindexed(peerId: PeerId, threadId: Int64?, tag: Int32) -> Bool {
if let currentTags = self.reindexedHistoryPeerIdCustomTags[peerId], currentTags.contains(PeerIdThreadIdAndTag(peerId: peerId, threadId: threadId, tag: tag, regularTag: nil)) {
return true
} else {
if self.valueBox.exists(self.table, key: self.peerHistoryReindexedCustomTagKey(id: peerId, threadId: threadId, tag: tag)) {
if self.reindexedHistoryPeerIdCustomTags[peerId] == nil {
self.reindexedHistoryPeerIdCustomTags[peerId] = Set()
}
self.reindexedHistoryPeerIdCustomTags[peerId]!.insert(PeerIdThreadIdAndTag(peerId: peerId, threadId: threadId, tag: tag, regularTag: nil))
return true
} else {
return false
}
}
}
func removePeerCustomTagInitializedList() {
self.initializedHistoryPeerIdCustomTags.removeAll()

View File

@ -1383,6 +1383,11 @@ public final class Transaction {
}
return matchingPeers.sorted(by: { $0.1 > $1.1 }).map(\.0)
}
public func reindexSavedMessagesCustomTagsWithTagsIfNeeded(peerId: PeerId, threadId: Int64?, tag: MemoryBuffer) {
assert(!self.disposed)
self.postbox!.reindexSavedMessagesCustomTagsWithTagsIfNeeded(peerId: peerId, threadId: threadId, tag: tag)
}
}
public enum PostboxResult {
@ -2374,6 +2379,23 @@ final class PostboxImpl {
self.storyTable.set(id: id, value: value, events: &self.currentStoryEvents)
}
fileprivate func reindexSavedMessagesCustomTagsWithTagsIfNeeded(peerId: PeerId, threadId: Int64?, tag: MemoryBuffer) {
let mappedTag = self.messageCustomTagIdTable.get(tag: tag)
if !self.messageHistoryMetadataTable.isPeerCustomTagReindexed(peerId: peerId, threadId: threadId, tag: mappedTag) {
let indices = self.messageCustomTagTable.laterIndices(threadId: threadId, tag: tag, peerId: peerId, namespace: 0, index: nil, includeFrom: false, count: 1000)
for index in indices {
if let message = self.messageHistoryTable.getMessage(index) {
for regularTag in message.tags {
if !self.messageCustomTagWithTagTable.entryExists(threadId: threadId, tag: tag, regularTag: regularTag.rawValue, index: index) {
self.messageCustomTagWithTagTable.add(threadId: threadId, tag: tag, regularTag: regularTag.rawValue, index: index, isNewlyAdded: true, updatedSummaries: &self.currentUpdatedMessageTagSummaries, invalidateSummaries: &self.currentInvalidateMessageTagSummaries)
}
}
}
}
self.messageHistoryMetadataTable.setPeerCustomTagReindexed(peerId: peerId, threadId: threadId, tag: mappedTag)
}
}
func renderIntermediateMessage(_ message: IntermediateMessage) -> Message {
let renderedMessage = self.messageHistoryTable.renderMessage(message, peerTable: self.peerTable, threadIndexTable: self.messageHistoryThreadIndexTable, storyTable: self.storyTable)

View File

@ -1395,5 +1395,11 @@ public extension TelegramEngine {
public func searchLocalSavedMessagesPeers(query: String, indexNameMapping: [EnginePeer.Id: [PeerIndexNameRepresentation]]) -> Signal<[EnginePeer], NoError> {
return _internal_searchLocalSavedMessagesPeers(account: self.account, query: query, indexNameMapping: indexNameMapping)
}
public func internalReindexSavedMessagesCustomTagsIfNeeded(threadId: Int64?, tag: MemoryBuffer) {
let _ = self.account.postbox.transaction({ transaction in
transaction.reindexSavedMessagesCustomTagsWithTagsIfNeeded(peerId: self.account.peerId, threadId: threadId, tag: tag)
}).startStandalone()
}
}
}