Skip to content

Commit

Permalink
fix(database): use switchMap when a list's query changes (#831)
Browse files Browse the repository at this point in the history
* test(database): add failing test for #830

* fix(database): use switchMap

Closes #830.
  • Loading branch information
cartant authored and davideast committed Feb 17, 2017
1 parent e93959a commit b85147d
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 2 deletions.
56 changes: 56 additions & 0 deletions src/database/firebase_list_factory.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,10 @@ import { Query, AFUnwrappedDataSnapshot } from '../interfaces';
import { Subscription, Observable, Subject } from 'rxjs';
import { COMMON_CONFIG, ANON_AUTH_CONFIG } from '../test-config';
import { _do } from 'rxjs/operator/do';
import { map } from 'rxjs/operator/map';
import { skip } from 'rxjs/operator/skip';
import { take } from 'rxjs/operator/take';
import { toArray } from 'rxjs/operator/toArray';
import { toPromise } from 'rxjs/operator/toPromise';

const rootDatabaseUrl = COMMON_CONFIG.databaseURL;
Expand Down Expand Up @@ -758,6 +760,60 @@ describe('FirebaseListFactory', () => {
});

});

describe('observable queries (issue #830)', () => {

it('should not emit the results of previous queries', (done) => {

questions.$ref.ref.set({
key1: { even: false, value: 1 },
key2: { even: true, value: 2 }
})
.then(() => {

let subject = new Subject<boolean>();
let query = FirebaseListFactory(`${rootDatabaseUrl}/questions`, {
query: {
orderByChild: 'even',
equalTo: subject
}
});

query = map.call(query, (list, index) => {
switch (index) {
case 0:
subject.next(true);
break;
case 1:
questions.$ref.ref.update({
key3: { even: false, value: 3 },
key4: { even: true, value: 4 }
});
break;
default:
break;
}
return list;
});
query = take.call(query, 3);
query = toArray.call(query);

toPromise.call(query).then((emits) => {
expect(emits.map(e => e.map(i => i.$key))).toEqual([
['key1'],
['key2'],
['key2', 'key4']
]);
done();
});

subject.next(false);
})
.catch(done.fail);
});

});

});
});

Expand Down
4 changes: 2 additions & 2 deletions src/database/firebase_list_factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { observeOn } from 'rxjs/operator/observeOn';
import { observeQuery } from './query_observable';
import { Query, FirebaseListFactoryOpts } from '../interfaces';
import * as utils from '../utils';
import { mergeMap } from 'rxjs/operator/mergeMap';
import { switchMap } from 'rxjs/operator/switchMap';
import { map } from 'rxjs/operator/map';

export function FirebaseListFactory (
Expand All @@ -32,7 +32,7 @@ export function FirebaseListFactory (

const queryObs = observeQuery(query);
return new FirebaseListObservable(ref, subscriber => {
let sub = mergeMap.call(map.call(queryObs, query => {
let sub = switchMap.call(map.call(queryObs, query => {
let queried: firebase.database.Query = ref;
// Only apply the populated keys
// apply ordering and available querying options
Expand Down

0 comments on commit b85147d

Please sign in to comment.