@@ -1378,21 +1378,28 @@ class DatabaseController {
1378
1378
return query ;
1379
1379
}
1380
1380
const queries = query.$or.map(q => this . objectToEntriesStrings ( q ) ) ;
1381
- for ( let i = 0 ; i < queries . length - 1 ; i ++ ) {
1382
- for ( let j = i + 1 ; j < queries . length ; j ++ ) {
1383
- const [ shorter , longer ] = queries [ i ] . length > queries [ j ] . length ? [ j , i ] : [ i , j ] ;
1384
- const foundEntries = queries [ shorter ] . reduce (
1385
- ( acc , entry ) => acc + ( queries [ longer ] . includes ( entry ) ? 1 : 0 ) ,
1386
- 0
1387
- ) ;
1388
- if ( foundEntries === queries [ shorter ] . length ) {
1389
- // If the shorter query is completely contained in the longer one, we can strike
1390
- // out the longer query.
1391
- query . $or . splice ( longer , 1 ) ;
1392
- queries . splice ( longer , 1 ) ;
1381
+ let repeat = false ;
1382
+ do {
1383
+ repeat = false ;
1384
+ for ( let i = 0 ; i < queries . length - 1 ; i ++ ) {
1385
+ for ( let j = i + 1 ; j < queries . length ; j ++ ) {
1386
+ const [ shorter , longer ] = queries [ i ] . length > queries [ j ] . length ? [ j , i ] : [ i , j ] ;
1387
+ const foundEntries = queries [ shorter ] . reduce (
1388
+ ( acc , entry ) => acc + ( queries [ longer ] . includes ( entry ) ? 1 : 0 ) ,
1389
+ 0
1390
+ ) ;
1391
+ const shorterEntries = queries [ shorter ] . length ;
1392
+ if ( foundEntries === shorterEntries ) {
1393
+ // If the shorter query is completely contained in the longer one, we can strike
1394
+ // out the longer query.
1395
+ query. $or . splice ( longer , 1 ) ;
1396
+ queries . splice ( longer , 1 ) ;
1397
+ repeat = true ;
1398
+ break ;
1399
+ }
1393
1400
}
1394
1401
}
1395
- }
1402
+ } while ( repeat ) ;
1396
1403
if ( query . $or . length === 1 ) {
1397
1404
query = { ...query , ...query . $or [ 0 ] } ;
1398
1405
delete query . $or ;
@@ -1406,21 +1413,28 @@ class DatabaseController {
1406
1413
return query ;
1407
1414
}
1408
1415
const queries = query.$and.map(q => this . objectToEntriesStrings ( q ) ) ;
1409
- for ( let i = 0 ; i < queries . length - 1 ; i ++ ) {
1410
- for ( let j = i + 1 ; j < queries . length ; j ++ ) {
1411
- const [ shorter , longer ] = queries [ i ] . length > queries [ j ] . length ? [ j , i ] : [ i , j ] ;
1412
- const foundEntries = queries [ shorter ] . reduce (
1413
- ( acc , entry ) => acc + ( queries [ longer ] . includes ( entry ) ? 1 : 0 ) ,
1414
- 0
1415
- ) ;
1416
- if ( foundEntries === queries [ shorter ] . length ) {
1417
- // If the shorter query is completely contained in the longer one, we can strike
1418
- // out the shorter query.
1419
- query . $and . splice ( shorter , 1 ) ;
1420
- queries . splice ( shorter , 1 ) ;
1416
+ let repeat = false ;
1417
+ do {
1418
+ repeat = false ;
1419
+ for ( let i = 0 ; i < queries . length - 1 ; i ++ ) {
1420
+ for ( let j = i + 1 ; j < queries . length ; j ++ ) {
1421
+ const [ shorter , longer ] = queries [ i ] . length > queries [ j ] . length ? [ j , i ] : [ i , j ] ;
1422
+ const foundEntries = queries [ shorter ] . reduce (
1423
+ ( acc , entry ) => acc + ( queries [ longer ] . includes ( entry ) ? 1 : 0 ) ,
1424
+ 0
1425
+ ) ;
1426
+ const shorterEntries = queries [ shorter ] . length ;
1427
+ if ( foundEntries === shorterEntries ) {
1428
+ // If the shorter query is completely contained in the longer one, we can strike
1429
+ // out the shorter query.
1430
+ query. $and . splice ( shorter , 1 ) ;
1431
+ queries . splice ( shorter , 1 ) ;
1432
+ repeat = true ;
1433
+ break ;
1434
+ }
1421
1435
}
1422
1436
}
1423
- }
1437
+ } while ( repeat ) ;
1424
1438
if ( query . $and . length === 1 ) {
1425
1439
query = { ...query , ...query . $and [ 0 ] } ;
1426
1440
delete query . $and ;
0 commit comments