Skip to content

Commit f9cb5c3

Browse files
cartantdavideast
authored andcommitted
feat(database): adds auditTime for queries
Adds an auditTime(0) operator to the composed query observable so that changes made to multiple subjects are emitted as a single query (emitted in the event loop) rather than as separate queries (emitted immediately). Closes #389 and #770.
1 parent 1993c01 commit f9cb5c3

File tree

2 files changed

+85
-19
lines changed

2 files changed

+85
-19
lines changed

src/database/query_observable.spec.ts

Lines changed: 72 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,17 @@ function scalarQueryTest(query: Query, done: any) {
1313
}
1414

1515
function observableQueryTest(query: Query, nextProp: any, done: any) {
16-
const nextSpy = jasmine.createSpy('next');
1716
const queryObservable = observeQuery(query);
1817
const toMerge: any = {};
19-
queryObservable.subscribe(nextSpy);
18+
queryObservable.subscribe(result => {
19+
const merged = Object.assign(query, toMerge);
20+
expect(result).toEqual(merged);
21+
done();
22+
});
2023
Object.keys(nextProp).forEach(prop => {
2124
query[prop].next(nextProp[prop]);
2225
toMerge[prop] = nextProp[prop];
23-
})
24-
const merged = Object.assign(query, toMerge);
25-
expect(nextSpy).toHaveBeenCalledWith(merged);
26-
done();
26+
});
2727
}
2828

2929
describe('observeQuery', () => {
@@ -37,7 +37,7 @@ describe('observeQuery', () => {
3737
var nextSpy = jasmine.createSpy('next');
3838
var completeSpy = jasmine.createSpy('complete');
3939
var query = { orderByChild: 'height', equalTo: 10 };
40-
var obs = observeQuery(query);
40+
var obs = observeQuery(query, false);
4141
obs.subscribe(nextSpy, null, completeSpy);
4242
expect(nextSpy).toHaveBeenCalledWith({
4343
orderByChild: 'height',
@@ -50,7 +50,7 @@ describe('observeQuery', () => {
5050
var nextSpy = jasmine.createSpy('next');
5151
var completeSpy = jasmine.createSpy('complete');
5252
var query:any = null;
53-
var obs = observeQuery(query);
53+
var obs = observeQuery(query, false);
5454
obs.subscribe(nextSpy, null, completeSpy);
5555
expect(nextSpy).toHaveBeenCalledWith(null);
5656
expect(completeSpy).toHaveBeenCalled();
@@ -63,7 +63,7 @@ describe('observeQuery', () => {
6363
var query = {
6464
orderByKey: new Subject<boolean>()
6565
};
66-
var obs = observeQuery(query);
66+
var obs = observeQuery(query, false);
6767
var noOrderyQuery = { orderByKey: false };
6868
obs.subscribe(nextSpy, null, completeSpy);
6969
query.orderByKey.next(true);
@@ -81,7 +81,7 @@ describe('observeQuery', () => {
8181
var query = {
8282
orderByKey: new Subject<boolean>()
8383
};
84-
var obs = observeQuery(query);
84+
var obs = observeQuery(query, false);
8585
obs.subscribe(nextSpy, null, completeSpy);
8686
query.orderByKey.next(true);
8787
expect(nextSpy).toHaveBeenCalledWith({ orderByKey: true });
@@ -99,7 +99,7 @@ describe('observeQuery', () => {
9999
orderByValue: new Subject<boolean>(),
100100
orderByChild: new Subject<string>()
101101
};
102-
var obs = observeQuery(query);
102+
var obs = observeQuery(query, false);
103103
obs.subscribe(nextSpy);
104104
query.orderByChild.next('height');
105105
expect(nextSpy).toHaveBeenCalledWith({
@@ -429,3 +429,64 @@ describe('query combinations', () => {
429429
});
430430

431431
});
432+
433+
434+
describe('audited queries', () => {
435+
436+
it('should immediately emit if not audited', () => {
437+
var nextSpy = jasmine.createSpy('next');
438+
var query = { orderByChild: 'height', startAt: new Subject(), endAt: new Subject() };
439+
var obs = observeQuery(query, false);
440+
obs.subscribe(nextSpy);
441+
query.startAt.next(5);
442+
expect(nextSpy).not.toHaveBeenCalled();
443+
query.endAt.next(10);
444+
expect(nextSpy).toHaveBeenCalledWith({
445+
orderByChild: 'height',
446+
startAt: 5,
447+
endAt: 10
448+
});
449+
query.startAt.next(10);
450+
expect(nextSpy).toHaveBeenCalledWith({
451+
orderByChild: 'height',
452+
startAt: 10,
453+
endAt: 10
454+
});
455+
query.endAt.next(15);
456+
expect(nextSpy).toHaveBeenCalledWith({
457+
orderByChild: 'height',
458+
startAt: 10,
459+
endAt: 15
460+
});
461+
});
462+
463+
it('should emit the last query (in the event loop) if audited', (done: any) => {
464+
let emits = 0;
465+
var query = { orderByChild: 'height', startAt: new Subject(), endAt: new Subject() };
466+
var obs = observeQuery(query, true);
467+
obs.subscribe(result => {
468+
switch (++emits) {
469+
case 1:
470+
expect(result).toEqual({
471+
orderByChild: 'height',
472+
startAt: 5,
473+
endAt: 10
474+
});
475+
query.startAt.next(10);
476+
query.endAt.next(15);
477+
break;
478+
case 2:
479+
expect(result).toEqual({
480+
orderByChild: 'height',
481+
startAt: 10,
482+
endAt: 15
483+
});
484+
done();
485+
break;
486+
}
487+
});
488+
query.startAt.next(5);
489+
query.endAt.next(10);
490+
});
491+
492+
});

src/database/query_observable.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Observer } from 'rxjs/Observer';
55
import { combineLatest } from 'rxjs/operator/combineLatest';
66
import { merge } from 'rxjs/operator/merge';
77
import { map } from 'rxjs/operator/map';
8+
import { auditTime } from 'rxjs/operator/auditTime';
89
import {
910
Query,
1011
ScalarQuery,
@@ -16,20 +17,24 @@ import {
1617
} from '../interfaces';
1718
import { isNil } from '../utils';
1819

19-
export function observeQuery(query: Query): Observable<ScalarQuery> {
20+
export function observeQuery(query: Query, audit: boolean = true): Observable<ScalarQuery> {
2021
if (isNil(query)) {
2122
return observableOf(null);
2223
}
2324

2425
return Observable.create((observer: Observer<ScalarQuery>) => {
2526

26-
combineLatest.call(
27-
getOrderObservables(query),
28-
getStartAtObservable(query),
29-
getEndAtObservable(query),
30-
getEqualToObservable(query),
31-
getLimitToObservables(query)
32-
)
27+
let combined = combineLatest.call(
28+
getOrderObservables(query),
29+
getStartAtObservable(query),
30+
getEndAtObservable(query),
31+
getEqualToObservable(query),
32+
getLimitToObservables(query)
33+
);
34+
if (audit) {
35+
combined = auditTime.call(combined, 0);
36+
}
37+
combined
3338
.subscribe(([orderBy, startAt, endAt, equalTo, limitTo]
3439
: [OrderBySelection, Primitive, Primitive, Primitive, LimitToSelection]) => {
3540

0 commit comments

Comments
 (0)