From df3028b0472740a0f720ca2fdec9f04d60456a85 Mon Sep 17 00:00:00 2001 From: Nicholas Jamieson Date: Sun, 5 Feb 2017 13:00:41 +1000 Subject: [PATCH] fix(database): allow null values for equalTo, etc. --- src/database/firebase_list_factory.spec.ts | 57 ++++++++++++++++++++++ src/database/query_observable.spec.ts | 49 +++++++++++++++++++ src/database/query_observable.ts | 20 ++++---- 3 files changed, 116 insertions(+), 10 deletions(-) diff --git a/src/database/firebase_list_factory.spec.ts b/src/database/firebase_list_factory.spec.ts index 5fda83fc3..e67bbd7f7 100644 --- a/src/database/firebase_list_factory.spec.ts +++ b/src/database/firebase_list_factory.spec.ts @@ -477,6 +477,63 @@ describe('FirebaseListFactory', () => { }); + it('should support null for equalTo queries', (done: any) => { + + questions.$ref.ref.set({ + val1, + val2: Object.assign({}, val2, { extra: true }), + val3: Object.assign({}, val3, { extra: true }), + }) + .then(() => { + + var query = FirebaseListFactory(questions.$ref.ref, { + query: { + orderByChild: "extra", + equalTo: null + } + }); + + take.call(query, 1).subscribe( + (list) => { + expect(list.length).toEqual(1); + expect(list[0].$key).toEqual("val1"); + done(); + }, + done.fail + ); + }); + }); + + + it('should support null for startAt/endAt queries', (done: any) => { + + questions.$ref.ref.set({ + val1, + val2: Object.assign({}, val2, { extra: true }), + val3: Object.assign({}, val3, { extra: true }), + }) + .then(() => { + + var query = FirebaseListFactory(questions.$ref.ref, { + query: { + orderByChild: "extra", + startAt: null, + endAt: null + } + }); + + take.call(query, 1).subscribe( + (list) => { + expect(list.length).toEqual(1); + expect(list[0].$key).toEqual("val1"); + done(); + }, + done.fail + ); + }); + }); + + it('should call off on all events when disposed', (done: any) => { const questionRef = firebase.database().ref().child('questions'); var firebaseSpy = spyOn(questionRef, 'off').and.callThrough(); diff --git a/src/database/query_observable.spec.ts b/src/database/query_observable.spec.ts index a2f0c4fd0..9d40cc130 100644 --- a/src/database/query_observable.spec.ts +++ b/src/database/query_observable.spec.ts @@ -422,3 +422,52 @@ describe('query combinations', () => { }); }); + +describe('null values', () => { + + it('should build an equalTo() query with a null scalar value', (done: any) => { + scalarQueryTest({ + orderByChild: 'height', + equalTo: null + }, done); + }); + + it('should build a startAt() query with a null scalar value', (done: any) => { + scalarQueryTest({ + orderByChild: 'height', + startAt: null + }, done); + }); + + it('should build an endAt() query with a null scalar value', (done: any) => { + scalarQueryTest({ + orderByChild: 'height', + endAt: null + }, done); + }); + + it('should build an equalTo() query with a null observable value', (done: any) => { + const query = { + orderByChild: 'height', + equalTo: new Subject() + }; + observableQueryTest(query, { equalTo: null }, done); + }); + + it('should build a startAt() query with a null observable value', (done: any) => { + const query = { + orderByChild: 'height', + startAt: new Subject() + }; + observableQueryTest(query, { startAt: null }, done); + }); + + it('should build an endAt() query with a null observable value', (done: any) => { + const query = { + orderByChild: 'height', + endAt: new Subject() + }; + observableQueryTest(query, { endAt: null }, done); + }); + +}); diff --git a/src/database/query_observable.ts b/src/database/query_observable.ts index a95f1a868..bbbe54517 100644 --- a/src/database/query_observable.ts +++ b/src/database/query_observable.ts @@ -14,7 +14,7 @@ import { LimitToSelection, Primitive } from '../interfaces'; -import { isNil } from '../utils'; +import { hasKey, isNil } from '../utils'; export function observeQuery(query: Query): Observable { if (isNil(query)) { @@ -63,15 +63,15 @@ export function observeQuery(query: Query): Observable { } } - if (!isNil(startAt)) { + if (startAt !== undefined) { serializedOrder.startAt = startAt; } - if (!isNil(endAt)) { + if (endAt !== undefined) { serializedOrder.endAt = endAt; } - if (!isNil(equalTo)) { + if (equalTo !== undefined) { serializedOrder.equalTo = equalTo; } @@ -122,13 +122,13 @@ export function getLimitToObservables(query: Query): Observable { if (query.startAt instanceof Observable) { return query.startAt; - } else if (typeof query.startAt !== 'undefined') { + } else if (hasKey(query, 'startAt')) { return new Observable(subscriber => { subscriber.next(query.startAt); }); } else { return new Observable(subscriber => { - subscriber.next(null); + subscriber.next(undefined); }); } } @@ -136,13 +136,13 @@ export function getStartAtObservable(query: Query): Observable { export function getEndAtObservable(query: Query): Observable { if (query.endAt instanceof Observable) { return query.endAt; - } else if (typeof query.endAt !== 'undefined') { + } else if (hasKey(query, 'endAt')) { return new Observable(subscriber => { subscriber.next(query.endAt); }); } else { return new Observable(subscriber => { - subscriber.next(null); + subscriber.next(undefined); }); } } @@ -150,13 +150,13 @@ export function getEndAtObservable(query: Query): Observable { export function getEqualToObservable(query: Query): Observable { if (query.equalTo instanceof Observable) { return query.equalTo; - } else if (typeof query.equalTo !== 'undefined') { + } else if (hasKey(query, 'equalTo')) { return new Observable(subscriber => { subscriber.next(query.equalTo); }); } else { return new Observable(subscriber => { - subscriber.next(null); + subscriber.next(undefined); }); } }