Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit 68a7887

Browse files
Firestore anytime soon? #507 (where)
1 parent 398e493 commit 68a7887

File tree

6 files changed

+162
-13
lines changed

6 files changed

+162
-13
lines changed

demo-ng/app/item/items.component.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ export class ItemsComponent implements OnInit {
113113
})
114114
.catch(err => console.log("Get failed, error" + err));
115115

116-
// example from https://firebase.google.com/docs/firestore/query-data/get-data
116+
// examples from https://firebase.google.com/docs/firestore/query-data/get-data
117117
const docRef: firestore.DocumentReference = firebase.firestore().collection("cities").doc("SF");
118118

119119
docRef.get().then((doc: firestore.DocumentSnapshot) => {
@@ -125,6 +125,18 @@ export class ItemsComponent implements OnInit {
125125
}).catch(function (error) {
126126
console.log("Error getting document:", error);
127127
});
128+
129+
const query: firestore.Query = firebase.firestore().collection("cities")
130+
.where("capital", "==", true);
131+
132+
query
133+
.get()
134+
.then((querySnapshot: firestore.QuerySnapshot) => {
135+
querySnapshot.forEach(doc => {
136+
console.log(`Capital: ${doc.id} => ${JSON.stringify(doc.data())}`);
137+
});
138+
})
139+
.catch(err => console.log("Where-get failed, error" + err));
128140
}
129141

130142
public firestoreDelete(): void {

demo-ng/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
"repository": "<fill-your-repository-here>",
66
"nativescript": {
77
"id": "org.nativescript.firebasedemo.firestore",
8-
"tns-android": {
9-
"version": "3.3.1"
10-
},
118
"tns-ios": {
129
"version": "3.3.0"
10+
},
11+
"tns-android": {
12+
"version": "3.3.1"
1313
}
1414
},
1515
"dependencies": {

demo/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
{
22
"nativescript": {
33
"id": "org.nativescript.firebasedemo",
4-
"tns-ios": {
5-
"version": "3.3.0"
6-
},
74
"tns-android": {
85
"version": "3.3.1"
6+
},
7+
"tns-ios": {
8+
"version": "3.3.0"
99
}
1010
},
1111
"dependencies": {

src/firebase.android.ts

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2197,7 +2197,8 @@ firebase.firestore.collection = (collectionPath: string): firestore.CollectionRe
21972197
id: collectionRef.getId(),
21982198
doc: (documentPath?: string) => firebase.firestore.doc(collectionPath, documentPath),
21992199
add: document => firebase.firestore.add(collectionPath, document),
2200-
get: () => firebase.firestore.get(collectionPath)
2200+
get: () => firebase.firestore.get(collectionPath),
2201+
where: (fieldPath: string, opStr: firestore.WhereFilterOp, value: any) => firebase.firestore.where(collectionPath, fieldPath, opStr, value)
22012202
};
22022203

22032204
} catch (ex) {
@@ -2222,7 +2223,7 @@ firebase.firestore.doc = (collectionPath: string, documentPath?: string): firest
22222223
id: docRef.getId(),
22232224
collection: cp => firebase.firestore.collection(cp),
22242225
set: (data: any, options?: firestore.SetOptions) => firebase.firestore.set(collectionPath, docRef.getId(), data, options),
2225-
get: () => firebase.firestore.getDocument(collectionPath, docRef.getId()),
2226+
get: () => firebase.firestore.getDocument(collectionPath, docRef.getId()),
22262227
update: (data: any) => firebase.firestore.update(collectionPath, docRef.getId(), data),
22272228
delete: () => firebase.firestore.delete(collectionPath, docRef.getId())
22282229
};
@@ -2250,7 +2251,7 @@ firebase.firestore.add = (collectionPath: string, document: any): Promise<firest
22502251
id: documentReference.getId(),
22512252
collection: cp => firebase.firestore.collection(cp),
22522253
set: (data: any, options?: firestore.SetOptions) => firebase.firestore.set(collectionPath, documentReference.getId(), data, options),
2253-
get: () => firebase.firestore.getDocument(collectionPath, documentReference.getId()),
2254+
get: () => firebase.firestore.getDocument(collectionPath, documentReference.getId()),
22542255
update: (data: any) => firebase.firestore.update(collectionPath, documentReference.getId(), data),
22552256
delete: () => firebase.firestore.delete(collectionPath, documentReference.getId())
22562257
});
@@ -2478,4 +2479,70 @@ firebase.firestore.getDocument = (collectionPath: string, documentPath: string):
24782479
});
24792480
};
24802481

2482+
firebase.firestore.where = (collectionPath: string, fieldPath: string, opStr: firestore.WhereFilterOp, value: any): firestore.Query => {
2483+
try {
2484+
if (typeof(com.google.firebase.firestore) === "undefined") {
2485+
console.log("Make sure firebase-firestore is in the plugin's include.gradle");
2486+
return null;
2487+
}
2488+
2489+
const db = com.google.firebase.firestore.FirebaseFirestore.getInstance();
2490+
const colRef: com.google.firebase.firestore.CollectionReference = db.collection(collectionPath);
2491+
2492+
let query: com.google.firebase.firestore.Query;
2493+
2494+
if (opStr === "<") {
2495+
query = colRef.whereLessThan(fieldPath, firebase.toValue(value));
2496+
} else if (opStr === "<=") {
2497+
query = colRef.whereLessThanOrEqualTo(fieldPath, firebase.toValue(value));
2498+
} else if (opStr === "==") {
2499+
query = colRef.whereEqualTo(fieldPath, firebase.toValue(value));
2500+
} else if (opStr === ">=") {
2501+
query = colRef.whereGreaterThanOrEqualTo(fieldPath, firebase.toValue(value));
2502+
} else if (opStr === ">") {
2503+
query = colRef.whereGreaterThan(fieldPath, firebase.toValue(value));
2504+
} else {
2505+
console.log("Illegal argument for opStr: " + opStr);
2506+
return null;
2507+
}
2508+
2509+
return {
2510+
get: () => new Promise((resolve, reject) => {
2511+
const onCompleteListener = new com.google.android.gms.tasks.OnCompleteListener({
2512+
onComplete: task => {
2513+
if (!task.isSuccessful()) {
2514+
const ex = task.getException();
2515+
reject(ex && ex.getReason ? ex.getReason() : ex);
2516+
} else {
2517+
const result: com.google.firebase.firestore.QuerySnapshot = task.getResult();
2518+
const docSnapshots: Array<firestore.DocumentSnapshot> = [];
2519+
for (let i = 0; i < result.size(); i++) {
2520+
const documentSnapshot: com.google.firebase.firestore.DocumentSnapshot = result.getDocuments().get(i);
2521+
docSnapshots.push({
2522+
id: documentSnapshot.getId(),
2523+
exists: true,
2524+
data: () => firebase.toJsObject(documentSnapshot.getData())
2525+
});
2526+
}
2527+
const snap = new QuerySnapshot();
2528+
snap.docSnapshots = docSnapshots;
2529+
resolve(snap);
2530+
}
2531+
}
2532+
});
2533+
query.get().addOnCompleteListener(onCompleteListener);
2534+
}),
2535+
where: () => {
2536+
// TODO check web impl
2537+
console.log("in where....");
2538+
return this;
2539+
}
2540+
};
2541+
2542+
} catch (ex) {
2543+
console.log("Error in firebase.firestore.where: " + ex);
2544+
return null;
2545+
}
2546+
};
2547+
24812548
module.exports = firebase;

src/firebase.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,7 @@ export namespace dynamicLinks {
786786

787787
export namespace firestore {
788788
export type DocumentData = { [field: string]: any };
789+
export type WhereFilterOp = '<' | '<=' | '==' | '>=' | '>';
789790

790791
export interface SetOptions {
791792
merge?: boolean;
@@ -809,6 +810,8 @@ export namespace firestore {
809810

810811
export interface Query {
811812
get(): Promise<QuerySnapshot>;
813+
814+
where(fieldPath: string, opStr: WhereFilterOp, value: any): Query;
812815
}
813816

814817
export interface CollectionReference extends Query {

src/firebase.ios.ts

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,12 @@ firebase.toJsObject = objCObj => {
557557
key = oKeyArr.objectAtIndex(i);
558558
const val = objCObj.valueForKey(key);
559559

560+
// Firestore can store nulls
561+
if (val === null) {
562+
node[key] = null;
563+
continue;
564+
}
565+
560566
switch (types.getClass(val)) {
561567
case 'NSArray':
562568
case 'NSMutableArray':
@@ -2216,7 +2222,8 @@ firebase.firestore.collection = (collectionPath: string): firestore.CollectionRe
22162222
id: fIRCollectionReference.collectionID,
22172223
doc: (documentPath?: string) => firebase.firestore.doc(collectionPath, documentPath),
22182224
add: document => firebase.firestore.add(collectionPath, document),
2219-
get: () => firebase.firestore.get(collectionPath)
2225+
get: () => firebase.firestore.get(collectionPath),
2226+
where: (fieldPath: string, opStr: firestore.WhereFilterOp, value: any) => firebase.firestore.where(collectionPath, fieldPath, opStr, value)
22202227
};
22212228

22222229
} catch (ex) {
@@ -2239,7 +2246,7 @@ firebase.firestore.doc = (collectionPath: string, documentPath?: string): firest
22392246
id: fIRDocumentReference.documentID,
22402247
collection: cp => firebase.firestore.collection(cp),
22412248
set: (data: any, options?: firestore.SetOptions) => firebase.firestore.set(collectionPath, fIRDocumentReference.documentID, data, options),
2242-
get: () => firebase.firestore.getDocument(collectionPath, fIRDocumentReference.documentID),
2249+
get: () => firebase.firestore.getDocument(collectionPath, fIRDocumentReference.documentID),
22432250
update: (data: any) => firebase.firestore.update(collectionPath, fIRDocumentReference.documentID, data),
22442251
delete: () => firebase.firestore.delete(collectionPath, fIRDocumentReference.documentID)
22452252
};
@@ -2269,7 +2276,7 @@ firebase.firestore.add = (collectionPath: string, document: any): Promise<firest
22692276
id: fIRDocumentReference.documentID,
22702277
collection: cp => firebase.firestore.collection(cp),
22712278
set: (data: any, options?: firestore.SetOptions) => firebase.firestore.set(collectionPath, fIRDocumentReference.documentID, data, options),
2272-
get: () => firebase.firestore.getDocument(collectionPath, fIRDocumentReference.documentID),
2279+
get: () => firebase.firestore.getDocument(collectionPath, fIRDocumentReference.documentID),
22732280
update: (data: any) => firebase.firestore.update(collectionPath, fIRDocumentReference.documentID, data),
22742281
delete: () => firebase.firestore.delete(collectionPath, fIRDocumentReference.documentID)
22752282
});
@@ -2446,6 +2453,66 @@ firebase.firestore.getDocument = (collectionPath: string, documentPath: string):
24462453
});
24472454
};
24482455

2456+
firebase.firestore.where = (collectionPath: string, fieldPath: string, opStr: firestore.WhereFilterOp, value: any): firestore.Query => {
2457+
try {
2458+
if (typeof(FIRFirestore) === "undefined") {
2459+
console.log("Make sure 'Firebase/Firestore' is in the plugin's Podfile");
2460+
return null;
2461+
}
2462+
2463+
const colRef: FIRCollectionReference = FIRFirestore.firestore().collectionWithPath(collectionPath);
2464+
let query: FIRQuery;
2465+
2466+
if (opStr === "<") {
2467+
query = colRef.queryWhereFieldIsLessThan(fieldPath, value);
2468+
} else if (opStr === "<=") {
2469+
query = colRef.queryWhereFieldIsLessThanOrEqualTo(fieldPath, value);
2470+
} else if (opStr === "==") {
2471+
query = colRef.queryWhereFieldIsEqualTo(fieldPath, value);
2472+
} else if (opStr === ">=") {
2473+
query = colRef.queryWhereFieldIsGreaterThanOrEqualTo(fieldPath, value);
2474+
} else if (opStr === ">") {
2475+
query = colRef.queryWhereFieldIsGreaterThan(fieldPath, value);
2476+
} else {
2477+
console.log("Illegal argument for opStr: " + opStr);
2478+
return null;
2479+
}
2480+
2481+
return {
2482+
get: () => new Promise((resolve, reject) => {
2483+
query.getDocumentsWithCompletion((snapshot: FIRQuerySnapshot, error: NSError) => {
2484+
if (error) {
2485+
reject(error.localizedDescription);
2486+
} else {
2487+
console.log(">> .where, snapshot: " + snapshot);
2488+
const docSnapshots: Array<firestore.DocumentSnapshot> = [];
2489+
for (let i = 0, l = snapshot.documents.count; i < l; i++) {
2490+
const document: FIRDocumentSnapshot = snapshot.documents.objectAtIndex(i);
2491+
docSnapshots.push({
2492+
id: document.documentID,
2493+
exists: true,
2494+
data: () => firebase.toJsObject(document.data())
2495+
});
2496+
}
2497+
const snap = new QuerySnapshot();
2498+
snap.docSnapshots = docSnapshots;
2499+
resolve(snap);
2500+
}
2501+
});
2502+
}),
2503+
where: () => {
2504+
// TODO check web impl
2505+
console.log("in where....");
2506+
return this;
2507+
}
2508+
};
2509+
2510+
} catch (ex) {
2511+
console.log("Error in firebase.firestore.where: " + ex);
2512+
return null;
2513+
}
2514+
};
2515+
24492516
// see https://developer.apple.com/reference/usernotifications/unusernotificationcenterdelegate?language=objc
24502517
class UNUserNotificationCenterDelegateImpl extends NSObject implements UNUserNotificationCenterDelegate {
24512518
public static ObjCProtocols = [];

0 commit comments

Comments
 (0)