Remove cache from DatabaseLookupTable because it made the code too complex. If profiling says we need caching, we can add it back later.

This commit is contained in:
Brent Simmons 2017-09-11 13:15:12 -07:00
parent 258abab9f6
commit 45063d2d96
3 changed files with 20 additions and 135 deletions

View File

@ -318,137 +318,3 @@ private extension DatabaseLookupTable {
} }
} }
// MARK: -
private struct LookupTable {
private let dictionary: [String: Set<String>] // objectID: Set<relatedObjectID>
init(dictionary: [String: Set<String>]) {
self.dictionary = dictionary
}
init(lookupValues: Set<LookupValue>) {
var d = [String: Set<String>]()
for lookupValue in lookupValues {
let objectID = lookupValue.objectID
let relatedObjectID: String = lookupValue.relatedObjectID
if d[objectID] == nil {
d[objectID] = Set([relatedObjectID])
}
else {
d[objectID]!.insert(relatedObjectID)
}
}
self.init(dictionary: d)
}
func objectIDs() -> Set<String> {
return Set(dictionary.keys)
}
func relatedObjectIDs() -> Set<String> {
var ids = Set<String>()
for (_, relatedObjectIDs) in dictionary {
ids.formUnion(relatedObjectIDs)
}
return ids
}
subscript(_ objectID: String) -> Set<String>? {
get {
return dictionary[objectID]
}
}
}
private struct LookupValue: Hashable {
let objectID: String
let relatedObjectID: String
let hashValue: Int
init(objectID: String, relatedObjectID: String) {
self.objectID = objectID
self.relatedObjectID = relatedObjectID
self.hashValue = (objectID + relatedObjectID).hashValue
}
static public func ==(lhs: LookupValue, rhs: LookupValue) -> Bool {
return lhs.objectID == rhs.objectID && lhs.relatedObjectID == rhs.relatedObjectID
}
}
private final class DatabaseLookupTableCache {
var objectIDsWithNoRelationship = Set<String>()
private let relationshipName: String
private var cachedLookups = [String: Set<String>]() // objectID: Set<relatedObjectID>
init(_ relationshipName: String) {
self.relationshipName = relationshipName
}
func update(with objects: [DatabaseObject]) {
var idsWithRelationships = Set<String>()
var idsWithNoRelationships = Set<String>()
for object in objects {
let objectID = object.databaseID
if let relatedObjects = object.relatedObjectsWithName(relationshipName), !relatedObjects.isEmpty {
idsWithRelationships.insert(objectID)
self[objectID] = relatedObjects.databaseIDs()
}
else {
idsWithNoRelationships.insert(objectID)
self[objectID] = nil
}
}
objectIDsWithNoRelationship.subtract(idsWithRelationships)
objectIDsWithNoRelationship.formUnion(idsWithNoRelationships)
}
subscript(_ objectID: String) -> Set<String>? {
get {
return cachedLookups[objectID]
}
set {
cachedLookups[objectID] = newValue
}
}
func objectIDsThatMayHaveRelatedObjects(_ objectIDs: Set<String>) -> Set<String> {
// Filter out objects that are known to have no related objects
return Set(objectIDs.filter{ !objectIDsWithNoRelationship.contains($0) })
}
// func objectsThatMayHaveRelatedObjects(_ objects: [DatabaseObject]) -> [DatabaseObject] {
//
// // Filter out objects that are known to have no related objects
// return objects.filter{ !objectIDsWithNoRelationship.contains($0.databaseID) }
// }
func lookupTableForObjectIDs(_ objectIDs: Set<String>) -> LookupTable {
var d = [String: Set<String>]()
for objectID in objectIDs {
if let relatedObjectIDs = self[objectID] {
d[objectID] = relatedObjectIDs
}
}
return LookupTable(dictionary: d)
}
}

View File

@ -57,3 +57,22 @@ struct RelatedObjectIDsMap {
} }
} }
} }
struct LookupValue: Hashable {
let objectID: String
let relatedObjectID: String
let hashValue: Int
init(objectID: String, relatedObjectID: String) {
self.objectID = objectID
self.relatedObjectID = relatedObjectID
self.hashValue = (objectID + relatedObjectID).hashValue
}
static func ==(lhs: LookupValue, rhs: LookupValue) -> Bool {
return lhs.objectID == rhs.objectID && lhs.relatedObjectID == rhs.relatedObjectID
}
}

View File

@ -14,7 +14,7 @@ public struct RelatedObjectsMap {
private let dictionary: [String: [DatabaseObject]] // objectID: relatedObjects private let dictionary: [String: [DatabaseObject]] // objectID: relatedObjects
init(relatedObjects: relatedObjects, lookupTable: LookupTable) { init(relatedObjects: relatedObjects, lookupTable: RelatedObjectIDsMap) {
var d = [String: [DatabaseObject]]() var d = [String: [DatabaseObject]]()