5
5
@file:JvmName(" android" )
6
6
package dev.gitlive.firebase.firestore
7
7
8
- import com.google.android.gms.tasks.Task
9
8
import com.google.firebase.firestore.*
10
9
import dev.gitlive.firebase.*
11
10
import kotlinx.coroutines.channels.awaitClose
@@ -17,6 +16,9 @@ import kotlinx.serialization.DeserializationStrategy
17
16
import kotlinx.serialization.Serializable
18
17
import kotlinx.serialization.SerializationStrategy
19
18
19
+ import com.google.firebase.firestore.Query as AndroidQuery
20
+ import com.google.firebase.firestore.FieldPath as AndroidFieldPath
21
+
20
22
actual val Firebase .firestore get() =
21
23
FirebaseFirestore (com.google.firebase.firestore.FirebaseFirestore .getInstance())
22
24
@@ -283,7 +285,7 @@ actual class DocumentReference actual constructor(internal actual val nativeValu
283
285
override fun toString (): String = nativeValue.toString()
284
286
}
285
287
286
- actual open class Query (open val android : com.google.firebase.firestore. Query ) {
288
+ actual open class Query (open val android : AndroidQuery ) {
287
289
288
290
actual suspend fun get () = QuerySnapshot (android.get().await())
289
291
@@ -306,39 +308,85 @@ actual open class Query(open val android: com.google.firebase.firestore.Query) {
306
308
awaitClose { listener.remove() }
307
309
}
308
310
309
- internal actual fun _where (field : String , equalTo : Any? ) = Query (android.whereEqualTo(field, equalTo))
310
- internal actual fun _where (path : FieldPath , equalTo : Any? ) = Query (android.whereEqualTo(path.android, equalTo))
311
-
312
- internal actual fun _where (field : String , equalTo : DocumentReference ) = Query (android.whereEqualTo(field, equalTo.android))
313
- internal actual fun _where (path : FieldPath , equalTo : DocumentReference ) = Query (android.whereEqualTo(path.android, equalTo.android))
314
-
315
- internal actual fun _where (field : String , lessThan : Any? , greaterThan : Any? , arrayContains : Any? ) = Query (
316
- (lessThan?.let { android.whereLessThan(field, it) } ? : android).let { android2 ->
317
- (greaterThan?.let { android2.whereGreaterThan(field, it) } ? : android2).let { android3 ->
318
- arrayContains?.let { android3.whereArrayContains(field, it) } ? : android3
311
+ internal actual fun where (field : String , vararg clauses : WhereClause ) = Query (
312
+ clauses.fold(android) { query, clause ->
313
+ when (clause) {
314
+ is WhereClause .ForNullableObject -> {
315
+ val modifier: AndroidQuery .(String , Any? ) -> AndroidQuery = when (clause) {
316
+ is WhereClause .EqualTo -> AndroidQuery ::whereEqualTo
317
+ is WhereClause .NotEqualTo -> AndroidQuery ::whereNotEqualTo
318
+ }
319
+ modifier.invoke(query, field, clause.safeValue)
320
+ }
321
+ is WhereClause .ForObject -> {
322
+ val modifier: AndroidQuery .(String , Any ) -> AndroidQuery = when (clause) {
323
+ is WhereClause .LessThan -> AndroidQuery ::whereLessThan
324
+ is WhereClause .GreaterThan -> AndroidQuery ::whereGreaterThan
325
+ is WhereClause .LessThanOrEqualTo -> AndroidQuery ::whereLessThanOrEqualTo
326
+ is WhereClause .GreaterThanOrEqualTo -> AndroidQuery ::whereGreaterThanOrEqualTo
327
+ is WhereClause .ArrayContains -> AndroidQuery ::whereArrayContains
328
+ }
329
+ modifier.invoke(query, field, clause.safeValue)
330
+ }
331
+ is WhereClause .ForArray -> {
332
+ val modifier: AndroidQuery .(String , List <Any >) -> AndroidQuery = when (clause) {
333
+ is WhereClause .InArray -> AndroidQuery ::whereIn
334
+ is WhereClause .ArrayContainsAny -> AndroidQuery ::whereArrayContainsAny
335
+ is WhereClause .NotInArray -> AndroidQuery ::whereNotIn
336
+ }
337
+ modifier.invoke(query, field, clause.safeValues)
338
+ }
319
339
}
320
340
}
321
341
)
322
342
323
- internal actual fun _where (path : FieldPath , lessThan : Any? , greaterThan : Any? , arrayContains : Any? ) = Query (
324
- (lessThan?.let { android.whereLessThan(path.android, it) } ? : android).let { android2 ->
325
- (greaterThan?.let { android2.whereGreaterThan(path.android, it) } ? : android2).let { android3 ->
326
- arrayContains?.let { android3.whereArrayContains(path.android, it) } ? : android3
343
+ internal actual fun where (path : FieldPath , vararg clauses : WhereClause ) = Query (
344
+ clauses.fold(android) { query, clause ->
345
+ when (clause) {
346
+ is WhereClause .ForNullableObject -> {
347
+ val modifier: AndroidQuery .(AndroidFieldPath , Any? ) -> AndroidQuery = when (clause) {
348
+ is WhereClause .EqualTo -> AndroidQuery ::whereEqualTo
349
+ is WhereClause .NotEqualTo -> AndroidQuery ::whereNotEqualTo
350
+ }
351
+ modifier.invoke(query, path.android, clause.safeValue)
352
+ }
353
+ is WhereClause .ForObject -> {
354
+ val modifier: AndroidQuery .(AndroidFieldPath , Any ) -> AndroidQuery = when (clause) {
355
+ is WhereClause .LessThan -> AndroidQuery ::whereLessThan
356
+ is WhereClause .GreaterThan -> AndroidQuery ::whereGreaterThan
357
+ is WhereClause .LessThanOrEqualTo -> AndroidQuery ::whereLessThanOrEqualTo
358
+ is WhereClause .GreaterThanOrEqualTo -> AndroidQuery ::whereGreaterThanOrEqualTo
359
+ is WhereClause .ArrayContains -> AndroidQuery ::whereArrayContains
360
+ }
361
+ modifier.invoke(query, path.android, clause.safeValue)
362
+ }
363
+ is WhereClause .ForArray -> {
364
+ val modifier: AndroidQuery .(AndroidFieldPath , List <Any >) -> AndroidQuery = when (clause) {
365
+ is WhereClause .InArray -> AndroidQuery ::whereIn
366
+ is WhereClause .ArrayContainsAny -> AndroidQuery ::whereArrayContainsAny
367
+ is WhereClause .NotInArray -> AndroidQuery ::whereNotIn
368
+ }
369
+ modifier.invoke(query, path.android, clause.safeValues)
370
+ }
327
371
}
328
372
}
329
373
)
330
374
331
- internal actual fun _where (field : String , inArray : List <Any >? , arrayContainsAny : List <Any >? ) = Query (
332
- (inArray?.let { android.whereIn(field, it) } ? : android).let { android2 ->
333
- arrayContainsAny?.let { android2.whereArrayContainsAny(field, it) } ? : android2
334
- }
335
- )
336
-
337
- internal actual fun _where (path : FieldPath , inArray : List <Any >? , arrayContainsAny : List <Any >? ) = Query (
338
- (inArray?.let { android.whereIn(path.android, it) } ? : android).let { android2 ->
339
- arrayContainsAny?.let { android2.whereArrayContainsAny(path.android, it) } ? : android2
340
- }
341
- )
375
+ private fun <T : Any > AndroidQuery.whereField (
376
+ field : String ,
377
+ nullable : T ? ,
378
+ modified : AndroidQuery .(String , T ) -> AndroidQuery
379
+ ) : AndroidQuery = nullable?.let {
380
+ modified(field, it)
381
+ } ? : this
382
+
383
+ private fun <T : Any > AndroidQuery.wherePath (
384
+ path : FieldPath ,
385
+ nullable : T ? ,
386
+ modified : AndroidQuery .(com.google.firebase.firestore.FieldPath , T ) -> AndroidQuery
387
+ ) : AndroidQuery = nullable?.let {
388
+ modified(path.android, it)
389
+ } ? : this
342
390
343
391
internal actual fun _orderBy (field : String , direction : Direction ) = Query (android.orderBy(field, direction))
344
392
internal actual fun _orderBy (field : FieldPath , direction : Direction ) = Query (android.orderBy(field.android, direction))
0 commit comments