|
|
|
@ -46,8 +46,27 @@ class OWS110SortIdMigration: OWSDatabaseMigration {
|
|
|
|
|
|
|
|
|
|
let totalCount: UInt = legacySorting.numberOfItemsInAllGroups()
|
|
|
|
|
var completedCount: UInt = 0
|
|
|
|
|
|
|
|
|
|
var seenGroups: Set<String> = Set()
|
|
|
|
|
legacySorting.enumerateGroups { group, _ in
|
|
|
|
|
autoreleasepool {
|
|
|
|
|
// Sanity Check #1
|
|
|
|
|
// Make sure our enumeration is monotonically increasing.
|
|
|
|
|
// Note: sortIds increase monotonically WRT timestampForLegacySorting, but only WRT the interaction's thread.
|
|
|
|
|
//
|
|
|
|
|
// e.g. When we migrate the **next** thread, we start with that thread's oldest interaction. So it's possible and expected
|
|
|
|
|
// that thread2's oldest interaction will have a smaller timestampForLegacySorting, but a greater sortId then an interaction
|
|
|
|
|
// in thread1. That's OK because we only sort messages with respect to the thread they belong in. We don't have any sort of
|
|
|
|
|
// "global sort" of messages across all threads.
|
|
|
|
|
var previousTimestampForLegacySorting: UInt64 = 0
|
|
|
|
|
|
|
|
|
|
// Sanity Check #2
|
|
|
|
|
// Ensure we only process a DB View's group (i.e. threadId) once.
|
|
|
|
|
guard !seenGroups.contains(group) else {
|
|
|
|
|
owsFail("unexpectedly seeing a repeated group: \(group)")
|
|
|
|
|
}
|
|
|
|
|
seenGroups.insert(group)
|
|
|
|
|
|
|
|
|
|
legacySorting.enumerateKeysAndObjects(inGroup: group) { (_, _, object, _, _) in
|
|
|
|
|
autoreleasepool {
|
|
|
|
|
guard let interaction = object as? TSInteraction else {
|
|
|
|
@ -55,10 +74,14 @@ class OWS110SortIdMigration: OWSDatabaseMigration {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
guard interaction.timestampForLegacySorting() >= previousTimestampForLegacySorting else {
|
|
|
|
|
owsFail("unexpected object ordering previousTimestampForLegacySorting: \(previousTimestampForLegacySorting) interaction.timestampForLegacySorting: \(interaction.timestampForLegacySorting)")
|
|
|
|
|
}
|
|
|
|
|
previousTimestampForLegacySorting = interaction.timestampForLegacySorting()
|
|
|
|
|
|
|
|
|
|
interaction.saveNextSortId(transaction: transaction)
|
|
|
|
|
|
|
|
|
|
completedCount += 1
|
|
|
|
|
|
|
|
|
|
if completedCount % 100 == 0 {
|
|
|
|
|
// Legit usage of legacy sorting for migration to new sorting
|
|
|
|
|
Logger.info("thread: \(interaction.uniqueThreadId), timestampForLegacySorting:\(interaction.timestampForLegacySorting()), sortId: \(interaction.sortId) totalCount: \(totalCount), completedcount: \(completedCount)")
|
|
|
|
|