diff --git a/Frameworks/Database/AuthorsTable.swift b/Frameworks/Database/AuthorsTable.swift index 09320ba35..4a9c35cb4 100644 --- a/Frameworks/Database/AuthorsTable.swift +++ b/Frameworks/Database/AuthorsTable.swift @@ -78,8 +78,8 @@ private extension AuthorsTable { func fetchAuthorsForArticleIDs(_ articleIDs: Set, _ database: FMDatabase) -> [String: Set]? { - let lookupValueDictionary = authorsLookupTable.fetchLookupTableDictionary(articleIDs, database) - let authorIDs = Set(lookupValues.map { $0.primaryID }) + let lookupTableDictionary = authorsLookupTable.fetchLookupTableDictionary(articleIDs, database) + let authorIDs = authorsLookupTable.primaryIDsInLookupTableDictionary(lookupTableDictionary) if authorIDs.isEmpty { return nil } diff --git a/Frameworks/RSDatabase/RSDatabase/LookupTable.swift b/Frameworks/RSDatabase/RSDatabase/LookupTable.swift index a984d5a9c..5ec2d604e 100644 --- a/Frameworks/RSDatabase/RSDatabase/LookupTable.swift +++ b/Frameworks/RSDatabase/RSDatabase/LookupTable.swift @@ -64,6 +64,33 @@ public final class LookupTable { return lookupTableDictionary(with: lookupValues) } + public func attachRelationships(_ objects: [T], idKeyPath: KeyPath, relationshipKeyPath: KeyPath, table: DatabaseTable, lookupTableDictionary: LookupTableDictionary, database: FMDatabase) { + + let primaryIDs = primaryIDsInLookupTableDictionary(lookupTableDictionary) + let relatedObjects = table.fetchObjectsWithIDs(primaryIDs, database) + + for object in objects { + let identifier = object[keyPath: idKeyPath] + if let lookupValues = lookupTableDictionary[identifier] { + let relatedObjects = lookupValues.flatMap{ (lookupValue) -> U? in + <#code#> + } + } + } + + } + + func primaryIDsInLookupTableDictionary(_ lookupTableDictionary: LookupTableDictionary) -> Set { + + var primaryIDs = Set() + + for (_, lookupValues) in lookupTableDictionary { + primaryIDs.formUnion(lookupValues.primaryIDs()) + } + + return primaryIDs + } + public func removeLookupsForForeignIDs(_ foreignIDs: Set, _ database: FMDatabase) { let foreignIDsToRemove = foreignIDs.subtracting(foreignIDsWithNoRelationship) @@ -156,3 +183,10 @@ public struct LookupValue: Hashable { } } +private extension Set where Element == LookupValue { + + func primaryIDs() -> Set { + + return Set(map { $0.primaryID }) + } +}