Skip to content

Commit 561e7b7

Browse files
cartantdavideast
authored andcommitted
fix(database): allow null values for equalTo, etc. (#809)
1 parent 334d89e commit 561e7b7

File tree

3 files changed

+116
-10
lines changed

3 files changed

+116
-10
lines changed

src/database/firebase_list_factory.spec.ts

+57
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,63 @@ describe('FirebaseListFactory', () => {
477477
});
478478

479479

480+
it('should support null for equalTo queries', (done: any) => {
481+
482+
questions.$ref.ref.set({
483+
val1,
484+
val2: Object.assign({}, val2, { extra: true }),
485+
val3: Object.assign({}, val3, { extra: true }),
486+
})
487+
.then(() => {
488+
489+
var query = FirebaseListFactory(questions.$ref.ref, {
490+
query: {
491+
orderByChild: "extra",
492+
equalTo: null
493+
}
494+
});
495+
496+
take.call(query, 1).subscribe(
497+
(list) => {
498+
expect(list.length).toEqual(1);
499+
expect(list[0].$key).toEqual("val1");
500+
done();
501+
},
502+
done.fail
503+
);
504+
});
505+
});
506+
507+
508+
it('should support null for startAt/endAt queries', (done: any) => {
509+
510+
questions.$ref.ref.set({
511+
val1,
512+
val2: Object.assign({}, val2, { extra: true }),
513+
val3: Object.assign({}, val3, { extra: true }),
514+
})
515+
.then(() => {
516+
517+
var query = FirebaseListFactory(questions.$ref.ref, {
518+
query: {
519+
orderByChild: "extra",
520+
startAt: null,
521+
endAt: null
522+
}
523+
});
524+
525+
take.call(query, 1).subscribe(
526+
(list) => {
527+
expect(list.length).toEqual(1);
528+
expect(list[0].$key).toEqual("val1");
529+
done();
530+
},
531+
done.fail
532+
);
533+
});
534+
});
535+
536+
480537
it('should call off on all events when disposed', (done: any) => {
481538
const questionRef = firebase.database().ref().child('questions');
482539
var firebaseSpy = spyOn(questionRef, 'off').and.callThrough();

src/database/query_observable.spec.ts

+49
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,55 @@ describe('query combinations', () => {
431431
});
432432

433433

434+
describe('null values', () => {
435+
436+
it('should build an equalTo() query with a null scalar value', (done: any) => {
437+
scalarQueryTest({
438+
orderByChild: 'height',
439+
equalTo: null
440+
}, done);
441+
});
442+
443+
it('should build a startAt() query with a null scalar value', (done: any) => {
444+
scalarQueryTest({
445+
orderByChild: 'height',
446+
startAt: null
447+
}, done);
448+
});
449+
450+
it('should build an endAt() query with a null scalar value', (done: any) => {
451+
scalarQueryTest({
452+
orderByChild: 'height',
453+
endAt: null
454+
}, done);
455+
});
456+
457+
it('should build an equalTo() query with a null observable value', (done: any) => {
458+
const query = {
459+
orderByChild: 'height',
460+
equalTo: new Subject()
461+
};
462+
observableQueryTest(query, { equalTo: null }, done);
463+
});
464+
465+
it('should build a startAt() query with a null observable value', (done: any) => {
466+
const query = {
467+
orderByChild: 'height',
468+
startAt: new Subject()
469+
};
470+
observableQueryTest(query, { startAt: null }, done);
471+
});
472+
473+
it('should build an endAt() query with a null observable value', (done: any) => {
474+
const query = {
475+
orderByChild: 'height',
476+
endAt: new Subject()
477+
};
478+
observableQueryTest(query, { endAt: null }, done);
479+
});
480+
481+
});
482+
434483
describe('audited queries', () => {
435484

436485
it('should immediately emit if not audited', () => {

src/database/query_observable.ts

+10-10
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
LimitToSelection,
1616
Primitive
1717
} from '../interfaces';
18-
import { isNil } from '../utils';
18+
import { hasKey, isNil } from '../utils';
1919

2020
export function observeQuery(query: Query, audit: boolean = true): Observable<ScalarQuery> {
2121
if (isNil(query)) {
@@ -68,15 +68,15 @@ export function observeQuery(query: Query, audit: boolean = true): Observable<Sc
6868
}
6969
}
7070

71-
if (!isNil(startAt)) {
71+
if (startAt !== undefined) {
7272
serializedOrder.startAt = startAt;
7373
}
7474

75-
if (!isNil(endAt)) {
75+
if (endAt !== undefined) {
7676
serializedOrder.endAt = endAt;
7777
}
7878

79-
if (!isNil(equalTo)) {
79+
if (equalTo !== undefined) {
8080
serializedOrder.equalTo = equalTo;
8181
}
8282

@@ -127,41 +127,41 @@ export function getLimitToObservables(query: Query): Observable<LimitToSelection
127127
export function getStartAtObservable(query: Query): Observable<Primitive> {
128128
if (query.startAt instanceof Observable) {
129129
return query.startAt;
130-
} else if (typeof query.startAt !== 'undefined') {
130+
} else if (hasKey(query, 'startAt')) {
131131
return new Observable<Primitive>(subscriber => {
132132
subscriber.next(query.startAt);
133133
});
134134
} else {
135135
return new Observable<Primitive>(subscriber => {
136-
subscriber.next(null);
136+
subscriber.next(undefined);
137137
});
138138
}
139139
}
140140

141141
export function getEndAtObservable(query: Query): Observable<Primitive> {
142142
if (query.endAt instanceof Observable) {
143143
return query.endAt;
144-
} else if (typeof query.endAt !== 'undefined') {
144+
} else if (hasKey(query, 'endAt')) {
145145
return new Observable<Primitive>(subscriber => {
146146
subscriber.next(query.endAt);
147147
});
148148
} else {
149149
return new Observable<Primitive>(subscriber => {
150-
subscriber.next(null);
150+
subscriber.next(undefined);
151151
});
152152
}
153153
}
154154

155155
export function getEqualToObservable(query: Query): Observable<Primitive> {
156156
if (query.equalTo instanceof Observable) {
157157
return query.equalTo;
158-
} else if (typeof query.equalTo !== 'undefined') {
158+
} else if (hasKey(query, 'equalTo')) {
159159
return new Observable<Primitive>(subscriber => {
160160
subscriber.next(query.equalTo);
161161
});
162162
} else {
163163
return new Observable<Primitive>(subscriber => {
164-
subscriber.next(null);
164+
subscriber.next(undefined);
165165
});
166166
}
167167
}

0 commit comments

Comments
 (0)