Skip to content

Commit 2a4af04

Browse files
Use cleaner code for barriers
1 parent cf1880e commit 2a4af04

File tree

2 files changed

+66
-25
lines changed

2 files changed

+66
-25
lines changed

packages/firestore/src/local/indexeddb_index_manager.ts

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -859,39 +859,32 @@ export class IndexedDbIndexManager implements IndexManager {
859859
for (const indexRange of indexRanges) {
860860
const lowerBound = new Uint8Array(indexRange.lower[3]);
861861
const upperBound = new Uint8Array(indexRange.upper[3]);
862-
let lastLower = indexRange.lower;
863-
let lastOpen = indexRange.lowerOpen;
864862

865-
for (const notInValue of notInValues) {
863+
let lastLower = lowerBound;
864+
let lowerOpen = indexRange.lowerOpen;
865+
866+
const barriers = [...notInValues, upperBound];
867+
for (const barrier of barriers) {
868+
// Verify that the range in the bound is sensible, as the bound may get
869+
// rejected otherwise
870+
const sortsAfter = compareByteArrays(barrier, lastLower);
871+
const sortsBefore = compareByteArrays(barrier, upperBound);
866872
if (
867-
compareByteArrays(notInValue, lowerBound) >= 0 &&
868-
compareByteArrays(notInValue, upperBound) <= 0
873+
(lowerOpen ? sortsAfter > 0 : sortsAfter >= 0) &&
874+
sortsBefore <= 0
869875
) {
870876
ranges.push(
871877
IDBKeyRange.bound(
872-
lastLower,
873-
this.generateNotInBound(indexRange.lower, notInValue),
874-
lastOpen,
875-
/* upperOpen= */ true
878+
this.generateBound(indexRange.lower, lastLower),
879+
this.generateBound(indexRange.lower, barrier),
880+
lowerOpen,
881+
/* upperOpen= */ false
876882
)
877883
);
878-
879-
lastLower = this.generateNotInBound(
880-
indexRange.lower,
881-
successor(notInValue)
882-
);
883-
lastOpen = true;
884+
lowerOpen = true;
885+
lastLower = successor(barrier);
884886
}
885887
}
886-
887-
ranges.push(
888-
IDBKeyRange.bound(
889-
lastLower,
890-
indexRange.upper,
891-
lastOpen,
892-
indexRange.upperOpen
893-
)
894-
);
895888
}
896889
return ranges;
897890
}
@@ -900,7 +893,7 @@ export class IndexedDbIndexManager implements IndexManager {
900893
* Generates the index entry that can be used to create the cutoff for `value`
901894
* on the provided index range.
902895
*/
903-
private generateNotInBound(
896+
private generateBound(
904897
existingRange: DbIndexEntryKey,
905898
value: Uint8Array
906899
): DbIndexEntryKey {

packages/firestore/test/unit/local/index_manager.test.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,54 @@ describe('IndexedDbIndexManager', async () => {
365365
filter('count', '!=', 1)
366366
);
367367
await verifyResults(q);
368+
369+
q = queryWithAddedFilter(
370+
queryWithAddedFilter(query('coll'), filter('count', '>', 2)),
371+
filter('count', '!=', 2)
372+
);
373+
await verifyResults(q, 'coll/val3');
374+
375+
q = queryWithAddedFilter(
376+
queryWithAddedFilter(query('coll'), filter('count', '>=', 2)),
377+
filter('count', '!=', 2)
378+
);
379+
await verifyResults(q, 'coll/val3');
380+
381+
q = queryWithAddedFilter(
382+
queryWithAddedFilter(query('coll'), filter('count', '<=', 2)),
383+
filter('count', '!=', 2)
384+
);
385+
await verifyResults(q, 'coll/val1');
386+
387+
q = queryWithAddedFilter(
388+
queryWithAddedFilter(query('coll'), filter('count', '<=', 2)),
389+
filter('count', '!=', 1)
390+
);
391+
await verifyResults(q, 'coll/val2');
392+
393+
q = queryWithAddedFilter(
394+
queryWithAddedFilter(query('coll'), filter('count', '<', 2)),
395+
filter('count', '!=', 2)
396+
);
397+
await verifyResults(q, 'coll/val1');
398+
399+
q = queryWithAddedFilter(
400+
queryWithAddedFilter(query('coll'), filter('count', '<', 2)),
401+
filter('count', '!=', 1)
402+
);
403+
await verifyResults(q);
404+
405+
q = queryWithAddedFilter(
406+
queryWithAddedFilter(query('coll'), filter('count', '>', 2)),
407+
filter('count', 'not-in', [3])
408+
);
409+
await verifyResults(q);
410+
411+
q = queryWithAddedFilter(
412+
queryWithAddedFilter(query('coll'), filter('count', '>', 2)),
413+
filter('count', 'not-in', [2, 2])
414+
);
415+
await verifyResults(q, 'coll/val3');
368416
});
369417

370418
it('applies less than filter', async () => {

0 commit comments

Comments
 (0)