mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Reindex custom tags + tag as needed
This commit is contained in:
parent
e2d238a2aa
commit
1d8668a7c1
@ -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 {
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user