@@ -360,13 +360,11 @@ DatabaseController.prototype.deleteEverything = function() {
360
360
function keysForQuery ( query ) {
361
361
var sublist = query [ '$and' ] || query [ '$or' ] ;
362
362
if ( sublist ) {
363
- var answer = new Set ( ) ;
364
- for ( var subquery of sublist ) {
365
- for ( var key of keysForQuery ( subquery ) ) {
366
- answer . add ( key ) ;
367
- }
368
- }
369
- return answer ;
363
+ let answer = sublist . reduce ( ( memo , subquery ) => {
364
+ return memo . concat ( keysForQuery ( subquery ) ) ;
365
+ } , [ ] ) ;
366
+
367
+ return new Set ( answer ) ;
370
368
}
371
369
372
370
return new Set ( Object . keys ( query ) ) ;
@@ -391,44 +389,69 @@ DatabaseController.prototype.owningIds = function(className, key, relatedIds) {
391
389
// Modifies query so that it no longer has $in on relation fields, or
392
390
// equal-to-pointer constraints on relation fields.
393
391
// Returns a promise that resolves when query is mutated
394
- // TODO: this only handles one of these at a time - make it handle more
395
392
DatabaseController . prototype . reduceInRelation = function ( className , query , schema ) {
393
+
396
394
// Search for an in-relation or equal-to-relation
397
- for ( var key in query ) {
398
- if ( query [ key ] &&
399
- ( query [ key ] [ '$in' ] || query [ key ] . __type == 'Pointer' ) ) {
400
- var t = schema . getExpectedType ( className , key ) ;
401
- var match = t ? t . match ( / ^ r e l a t i o n < ( .* ) > $ / ) : false ;
395
+ // Make it sequential for now, not sure of paralleization side effects
396
+ if ( query [ '$or' ] ) {
397
+ let ors = query [ '$or' ] ;
398
+ return Promise . all ( ors . map ( ( aQuery , index ) => {
399
+ return this . reduceInRelation ( className , aQuery , schema ) . then ( ( aQuery ) => {
400
+ query [ '$or' ] [ index ] = aQuery ;
401
+ } )
402
+ } ) ) ;
403
+ }
404
+
405
+ let promises = Object . keys ( query ) . map ( ( key ) => {
406
+ if ( query [ key ] && ( query [ key ] [ '$in' ] || query [ key ] . __type == 'Pointer' ) ) {
407
+ let t = schema . getExpectedType ( className , key ) ;
408
+ let match = t ? t . match ( / ^ r e l a t i o n < ( .* ) > $ / ) : false ;
402
409
if ( ! match ) {
403
- continue ;
410
+ return Promise . resolve ( query ) ;
404
411
}
405
- var relatedClassName = match [ 1 ] ;
406
- var relatedIds ;
412
+ let relatedClassName = match [ 1 ] ;
413
+ let relatedIds ;
407
414
if ( query [ key ] [ '$in' ] ) {
408
415
relatedIds = query [ key ] [ '$in' ] . map ( r => r . objectId ) ;
409
416
} else {
410
417
relatedIds = [ query [ key ] . objectId ] ;
411
418
}
412
419
return this . owningIds ( className , key , relatedIds ) . then ( ( ids ) => {
413
420
delete query [ key ] ;
414
- query . objectId = { '$in' : ids } ;
421
+ query . objectId = Object . assign ( { '$in' : [ ] } , query . objectId ) ;
422
+ query . objectId [ '$in' ] = query . objectId [ '$in' ] . concat ( ids ) ;
423
+ return Promise . resolve ( query ) ;
415
424
} ) ;
416
425
}
417
- }
418
- return Promise . resolve ( ) ;
426
+ return Promise . resolve ( query ) ;
427
+ } )
428
+
429
+ return Promise . all ( promises ) . then ( ( ) => {
430
+ return Promise . resolve ( query ) ;
431
+ } )
419
432
} ;
420
433
421
434
// Modifies query so that it no longer has $relatedTo
422
435
// Returns a promise that resolves when query is mutated
423
436
DatabaseController . prototype . reduceRelationKeys = function ( className , query ) {
437
+
438
+ if ( query [ '$or' ] ) {
439
+ return Promise . all ( query [ '$or' ] . map ( ( aQuery ) => {
440
+ return this . reduceRelationKeys ( className , aQuery ) ;
441
+ } ) ) ;
442
+ }
443
+
424
444
var relatedTo = query [ '$relatedTo' ] ;
425
445
if ( relatedTo ) {
426
446
return this . relatedIds (
427
447
relatedTo . object . className ,
428
448
relatedTo . key ,
429
449
relatedTo . object . objectId ) . then ( ( ids ) => {
430
450
delete query [ '$relatedTo' ] ;
431
- query [ 'objectId' ] = { '$in' : ids } ;
451
+ query . objectId = query . objectId || { } ;
452
+ let queryIn = query . objectId [ '$in' ] || [ ] ;
453
+ queryIn = queryIn . concat ( ids ) ;
454
+ query [ 'objectId' ] = { '$in' : queryIn } ;
432
455
return this . reduceRelationKeys ( className , query ) ;
433
456
} ) ;
434
457
}
0 commit comments