@@ -259,9 +259,7 @@ describeSpec('Existence Filters:', [], () => {
259
259
const docB = doc ( 'collection/b' , 1000 , { v : 2 } ) ;
260
260
const bloomFilterProto = generateBloomFilterProto ( {
261
261
contains : [ docA ] ,
262
- notContains : [ docB ] ,
263
- numOfBits : 2 ,
264
- hashCount : 1
262
+ notContains : [ docB ]
265
263
} ) ;
266
264
return (
267
265
spec ( )
@@ -294,9 +292,7 @@ describeSpec('Existence Filters:', [], () => {
294
292
const docC = doc ( 'collection/c' , 1000 , { v : 2 } ) ;
295
293
const bloomFilterProto = generateBloomFilterProto ( {
296
294
contains : [ docA , docB ] ,
297
- notContains : [ docC ] ,
298
- numOfBits : 3 ,
299
- hashCount : 1
295
+ notContains : [ docC ]
300
296
} ) ;
301
297
return (
302
298
spec ( )
@@ -309,21 +305,8 @@ describeSpec('Existence Filters:', [], () => {
309
305
// BloomFilter correctly identifies docC is deleted, but yields false
310
306
// positive results for docB. Re-run query is triggered.
311
307
. expectEvents ( query1 , { fromCache : true } )
312
- . expectActiveTargets ( { query : query1 , resumeToken : '' } )
313
308
. watchRemoves ( query1 ) // Acks removal of query.
314
- . watchAcksFull ( query1 , 2000 , docA )
315
- . expectLimboDocs ( docB . key , docC . key ) // DocB, docC are now in limbo.
316
- . ackLimbo ( 2001 , deletedDoc ( 'collection/b' , 2001 ) )
317
- . expectEvents ( query1 , {
318
- removed : [ docB ] ,
319
- fromCache : true
320
- } )
321
- . expectLimboDocs ( docC . key )
322
- . ackLimbo ( 2002 , deletedDoc ( 'collection/c' , 2002 ) )
323
- . expectEvents ( query1 , {
324
- removed : [ docC ]
325
- } )
326
- . expectLimboDocs ( )
309
+ . expectActiveTargets ( { query : query1 , resumeToken : '' } )
327
310
) ;
328
311
}
329
312
) ;
@@ -337,10 +320,9 @@ describeSpec('Existence Filters:', [], () => {
337
320
const docB = doc ( 'collection/À∑Ò' , 1000 , { v : 1 } ) ;
338
321
const bloomFilterProto = generateBloomFilterProto ( {
339
322
contains : [ docA ] ,
340
- notContains : [ docB ] ,
341
- numOfBits : 2 ,
342
- hashCount : 1
323
+ notContains : [ docB ]
343
324
} ) ;
325
+
344
326
return (
345
327
spec ( )
346
328
. userListens ( query1 )
@@ -365,17 +347,21 @@ describeSpec('Existence Filters:', [], () => {
365
347
const docA = doc ( 'collection/a' , 1000 , { v : 1 } ) ;
366
348
const docB = doc ( 'collection/b' , 1000 , { v : 2 } ) ;
367
349
350
+ const bloomFilterProto = generateBloomFilterProto ( {
351
+ contains : [ docA ] ,
352
+ notContains : [ docB ]
353
+ } ) ;
354
+ // Omit padding and hashCount. Default value 0 should be used.
355
+ delete bloomFilterProto . hashCount ;
356
+ delete bloomFilterProto . bits ! . padding ;
357
+
368
358
return (
369
359
spec ( )
370
360
. userListens ( query1 )
371
361
. watchAcksFull ( query1 , 1000 , docA , docB )
372
362
. expectEvents ( query1 , { added : [ docA , docB ] } )
373
363
// DocB is deleted in the next sync.
374
- . watchFilters ( [ query1 ] , [ docA . key ] , {
375
- // Bloom filter omitted padding and hashCount. Default value 0 will
376
- // be used.
377
- bits : { bitmap : 'AQ==' }
378
- } )
364
+ . watchFilters ( [ query1 ] , [ docA . key ] , bloomFilterProto )
379
365
. watchSnapshots ( 2000 )
380
366
// Re-run query is triggered.
381
367
. expectEvents ( query1 , { fromCache : true } )
@@ -392,17 +378,20 @@ describeSpec('Existence Filters:', [], () => {
392
378
const docA = doc ( 'collection/a' , 1000 , { v : 1 } ) ;
393
379
const docB = doc ( 'collection/b' , 1000 , { v : 1 } ) ;
394
380
381
+ const bloomFilterProto = generateBloomFilterProto ( {
382
+ contains : [ docA ] ,
383
+ notContains : [ docB ]
384
+ } ) ;
385
+ // Set bitmap to invalid base64 string.
386
+ bloomFilterProto . bits ! . bitmap = 'INVALID_BASE_64' ;
387
+
395
388
return (
396
389
spec ( )
397
390
. userListens ( query1 )
398
391
. watchAcksFull ( query1 , 1000 , docA , docB )
399
392
. expectEvents ( query1 , { added : [ docA , docB ] } )
400
393
// DocB is deleted in the next sync.
401
- . watchFilters ( [ query1 ] , [ docA . key ] , {
402
- // Invalid base64 string in bitmap.
403
- bits : { bitmap : 'INVALID_BASE_64' , padding : 1 } ,
404
- hashCount : 1
405
- } )
394
+ . watchFilters ( [ query1 ] , [ docA . key ] , bloomFilterProto )
406
395
. watchSnapshots ( 2000 )
407
396
// Re-run query is triggered.
408
397
. expectEvents ( query1 , { fromCache : true } )
@@ -412,23 +401,27 @@ describeSpec('Existence Filters:', [], () => {
412
401
) ;
413
402
414
403
specTest (
415
- 'Full re-query is triggered when bloom filter input is invalid' ,
404
+ 'Full re-query is triggered when bloom filter hashCount is invalid' ,
416
405
[ ] ,
417
406
( ) => {
418
407
const query1 = query ( 'collection' ) ;
419
408
const docA = doc ( 'collection/a' , 1000 , { v : 1 } ) ;
420
409
const docB = doc ( 'collection/b' , 1000 , { v : 1 } ) ;
410
+
411
+ const bloomFilterProto = generateBloomFilterProto ( {
412
+ contains : [ docA ] ,
413
+ notContains : [ docB ]
414
+ } ) ;
415
+ // Set hashCount to negative number.
416
+ bloomFilterProto . hashCount = - 1 ;
417
+
421
418
return (
422
419
spec ( )
423
420
. userListens ( query1 )
424
421
. watchAcksFull ( query1 , 1000 , docA , docB )
425
422
. expectEvents ( query1 , { added : [ docA , docB ] } )
426
423
// DocB is deleted in the next sync.
427
- . watchFilters ( [ query1 ] , [ docA . key ] , {
428
- // Invalid hashCount in bloom filter.
429
- bits : { bitmap : 'AQ==' , padding : 1 } ,
430
- hashCount : - 1
431
- } )
424
+ . watchFilters ( [ query1 ] , [ docA . key ] , bloomFilterProto )
432
425
. watchSnapshots ( 2000 )
433
426
// Re-run query is triggered.
434
427
. expectEvents ( query1 , { fromCache : true } )
@@ -441,16 +434,22 @@ describeSpec('Existence Filters:', [], () => {
441
434
const query1 = query ( 'collection' ) ;
442
435
const docA = doc ( 'collection/a' , 1000 , { v : 1 } ) ;
443
436
const docB = doc ( 'collection/b' , 1000 , { v : 1 } ) ;
437
+
438
+ //Generate an empty bloom filter.
439
+ const bloomFilterProto = generateBloomFilterProto ( {
440
+ contains : [ ] ,
441
+ notContains : [ ] ,
442
+ bitCount : 0 ,
443
+ hashCount : 0
444
+ } ) ;
445
+
444
446
return (
445
447
spec ( )
446
448
. userListens ( query1 )
447
449
. watchAcksFull ( query1 , 1000 , docA , docB )
448
450
. expectEvents ( query1 , { added : [ docA , docB ] } )
449
451
// DocB is deleted in the next sync.
450
- . watchFilters ( [ query1 ] , [ docA . key ] , {
451
- bits : { bitmap : '' , padding : 0 } ,
452
- hashCount : 0
453
- } )
452
+ . watchFilters ( [ query1 ] , [ docA . key ] , bloomFilterProto )
454
453
. watchSnapshots ( 2000 )
455
454
// Re-run query is triggered.
456
455
. expectEvents ( query1 , { fromCache : true } )
@@ -469,13 +468,13 @@ describeSpec('Existence Filters:', [], () => {
469
468
const bloomFilterProto1 = generateBloomFilterProto ( {
470
469
contains : [ docB ] ,
471
470
notContains : [ docA , docC ] ,
472
- numOfBits : 5 ,
473
- hashCount : 1
471
+ bitCount : 5 ,
472
+ hashCount : 2
474
473
} ) ;
475
474
const bloomFilterProto2 = generateBloomFilterProto ( {
476
475
contains : [ docB ] ,
477
476
notContains : [ docA , docC ] ,
478
- numOfBits : 4 ,
477
+ bitCount : 4 ,
479
478
hashCount : 1
480
479
} ) ;
481
480
return (
@@ -512,9 +511,7 @@ describeSpec('Existence Filters:', [], () => {
512
511
513
512
const bloomFilterProto = generateBloomFilterProto ( {
514
513
contains : [ docA ] ,
515
- notContains : [ docB ] ,
516
- numOfBits : 2 ,
517
- hashCount : 1
514
+ notContains : [ docB ]
518
515
} ) ;
519
516
520
517
return (
@@ -540,9 +537,7 @@ describeSpec('Existence Filters:', [], () => {
540
537
const docB = doc ( 'collection/b' , 1000 , { v : 1 } ) ;
541
538
const bloomFilterProto = generateBloomFilterProto ( {
542
539
contains : [ docA ] ,
543
- notContains : [ docB ] ,
544
- numOfBits : 2 ,
545
- hashCount : 1
540
+ notContains : [ docB ]
546
541
} ) ;
547
542
return spec ( )
548
543
. userListens ( query1 )
@@ -573,7 +568,7 @@ describeSpec('Existence Filters:', [], () => {
573
568
const bloomFilterProto = generateBloomFilterProto ( {
574
569
contains : docs . slice ( 0 , 50 ) ,
575
570
notContains : docs . slice ( 50 ) ,
576
- numOfBits : 1000 ,
571
+ bitCount : 1000 ,
577
572
hashCount : 16
578
573
} ) ;
579
574
return (
0 commit comments