@@ -360,13 +360,11 @@ DatabaseController.prototype.deleteEverything = function() {
360360function keysForQuery ( query ) {
361361 var sublist = query [ '$and' ] || query [ '$or' ] ;
362362 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 ) ;
370368 }
371369
372370 return new Set ( Object . keys ( query ) ) ;
@@ -391,44 +389,69 @@ DatabaseController.prototype.owningIds = function(className, key, relatedIds) {
391389// Modifies query so that it no longer has $in on relation fields, or
392390// equal-to-pointer constraints on relation fields.
393391// Returns a promise that resolves when query is mutated
394- // TODO: this only handles one of these at a time - make it handle more
395392DatabaseController . prototype . reduceInRelation = function ( className , query , schema ) {
393+
396394 // 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 ;
402409 if ( ! match ) {
403- continue ;
410+ return Promise . resolve ( query ) ;
404411 }
405- var relatedClassName = match [ 1 ] ;
406- var relatedIds ;
412+ let relatedClassName = match [ 1 ] ;
413+ let relatedIds ;
407414 if ( query [ key ] [ '$in' ] ) {
408415 relatedIds = query [ key ] [ '$in' ] . map ( r => r . objectId ) ;
409416 } else {
410417 relatedIds = [ query [ key ] . objectId ] ;
411418 }
412419 return this . owningIds ( className , key , relatedIds ) . then ( ( ids ) => {
413420 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 ) ;
415424 } ) ;
416425 }
417- }
418- return Promise . resolve ( ) ;
426+ return Promise . resolve ( query ) ;
427+ } )
428+
429+ return Promise . all ( promises ) . then ( ( ) => {
430+ return Promise . resolve ( query ) ;
431+ } )
419432} ;
420433
421434// Modifies query so that it no longer has $relatedTo
422435// Returns a promise that resolves when query is mutated
423436DatabaseController . 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+
424444 var relatedTo = query [ '$relatedTo' ] ;
425445 if ( relatedTo ) {
426446 return this . relatedIds (
427447 relatedTo . object . className ,
428448 relatedTo . key ,
429449 relatedTo . object . objectId ) . then ( ( ids ) => {
430450 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 } ;
432455 return this . reduceRelationKeys ( className , query ) ;
433456 } ) ;
434457 }
0 commit comments