Add object cache for ID lookups#3
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds an in-memory object cache to
SQLiteDatabase, mirroring CoreData's row cache. Repeatedfetch(_:for:)calls return the cachedModelDatawithout touching SQLite, skipping both the row query and the per-relationship queries that derive to-many values. Predicate fetches (fetch(_ fetchRequest:)) also register their results, so ID lookups following a list fetch are free.Design
[EntityName: [ObjectID: ModelData]]), so no additional synchronization is needed.members.SQLiteDatabaseactor is the database's only writer — the same coherency contract as separate CoreData stacks sharing one store file.SQLiteViewContextreads its own connection directly and always observes committed state.Benchmarks
Measured against a production-scale model (13 entities, ~11K objects, file-backed database) with 100 single-object fetches by ID, two passes over the same IDs (M-series Mac):
Warm ID lookups — the shape detail screens hit when reopening records — go from re-querying every time to effectively free, and are competitive with CoreData's row cache for the equivalent workload.
Tests
CacheTestscovers cache population (by-ID and via predicate fetch registration) and every invalidation path: direct updates, inverse to-many changes from the foreign-key side, reassignment side effects on sibling rows, deletes, and delete-nullification of cached references. Full suite passes (50 tests).