-
Notifications
You must be signed in to change notification settings - Fork 627
Index-Free (2/6): Add update_time to SQLRemoteDocumentCache schema #615
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 6 commits
cce8fd0
3d2d896
9de2df8
2bf12c2
b9a3664
ddee17b
5679784
b77194a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -46,7 +46,7 @@ class SQLiteSchema { | |
* The version of the schema. Increase this by one for each migration added to runMigrations | ||
* below. | ||
*/ | ||
static final int VERSION = 8; | ||
static final int VERSION = 9; | ||
// Remove this constant and increment VERSION to enable indexing support | ||
static final int INDEXING_SUPPORT_VERSION = VERSION + 1; | ||
|
||
|
@@ -127,6 +127,10 @@ void runMigrations(int fromVersion, int toVersion) { | |
createV8CollectionParentsIndex(); | ||
} | ||
|
||
if (fromVersion < 9 && toVersion >= 9) { | ||
addUpdateTime(); | ||
} | ||
|
||
/* | ||
* Adding a new migration? READ THIS FIRST! | ||
* | ||
|
@@ -351,6 +355,16 @@ private void addSequenceNumber() { | |
} | ||
} | ||
|
||
private void addUpdateTime() { | ||
if (!tableContainsColumn("remote_documents", "snapshot_version_seconds")) { | ||
hardAssert( | ||
!tableContainsColumn("remote_documents", "snapshot_version_nanos"), | ||
"Table contained snapshot_version_seconds, but is missing snapshot_version_nanos"); | ||
db.execSQL("ALTER TABLE remote_documents ADD COLUMN snapshot_version_seconds INTEGER"); | ||
db.execSQL("ALTER TABLE remote_documents ADD COLUMN snapshot_version_nanos INTEGER"); | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If all the documents in the cache have a zero version doesn't that mean the query to find recently updated documents has to also check for zero? Doesn't that nearly nullify the benefits of index-free on any device that has pre-existing data? Consider an existing device containing two targets, A updated at T1 matching D1 and D2. There's also a second target, listened to later: B updated at T2 matching D3. D3 actually matches the query for target A. All of this happened before this schema upgrade, so after the upgrade they'll all have update_time of zero. If the user queries on A again we need to find D3, but it's going to have a zero update_time. I think we're better off either:
Though the latter is pretty unfriendly so I think we should only consider it if all other possibilities are exhausted. Alternatively, maybe you have something up your sleeve to handle this case that I'm not seeing :-). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I tried to describe my strategy for this in the PR comment, but added it as a comment in the code itself for more visibility. Basically - I haven't quite decided what the best way forward it as migrating the contents of the entire RemoteDocumentCache could be quite slow. I decided to punt on this till later (when we actually want to enable this). |
||
} | ||
|
||
/** | ||
* Ensures that each entry in the remote document cache has a corresponding sentinel row. Any | ||
* entries that lack a sentinel row are given one with the sequence number set to the highest | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since there are multiple versions of a document, it'd probably be better to follow the name used on the backend and call this the
update_time_seconds
-- that way it's clear what the correspondence is with the proto fields.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done. Future me will thank you for this :)