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,10 @@ 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
+ import com.google.firebase.firestore.Filter as AndroidFilter
22
+
20
23
actual val Firebase .firestore get() =
21
24
FirebaseFirestore (com.google.firebase.firestore.FirebaseFirestore .getInstance())
22
25
@@ -283,7 +286,7 @@ actual class DocumentReference actual constructor(internal actual val nativeValu
283
286
override fun toString (): String = nativeValue.toString()
284
287
}
285
288
286
- actual open class Query (open val android : com.google.firebase.firestore. Query ) {
289
+ actual open class Query (open val android : AndroidQuery ) {
287
290
288
291
actual suspend fun get () = QuerySnapshot (android.get().await())
289
292
@@ -306,39 +309,72 @@ actual open class Query(open val android: com.google.firebase.firestore.Query) {
306
309
awaitClose { listener.remove() }
307
310
}
308
311
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
319
- }
320
- }
312
+ internal actual fun where (filter : Filter ) = Query (
313
+ android.where(filter.toAndroidFilter())
321
314
)
322
315
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
316
+ private fun Filter.toAndroidFilter (): AndroidFilter = when (this ) {
317
+ is Filter .And -> AndroidFilter .and (* filters.map { it.toAndroidFilter() }.toTypedArray())
318
+ is Filter .Or -> AndroidFilter .or (* filters.map { it.toAndroidFilter() }.toTypedArray())
319
+ is Filter .Field -> {
320
+ when (constraint) {
321
+ is WhereConstraint .ForNullableObject -> {
322
+ val modifier: (String , Any? ) -> AndroidFilter = when (constraint) {
323
+ is WhereConstraint .EqualTo -> AndroidFilter ::equalTo
324
+ is WhereConstraint .NotEqualTo -> AndroidFilter ::notEqualTo
325
+ }
326
+ modifier.invoke(field, constraint.safeValue)
327
+ }
328
+ is WhereConstraint .ForObject -> {
329
+ val modifier: (String , Any ) -> AndroidFilter = when (constraint) {
330
+ is WhereConstraint .LessThan -> AndroidFilter ::lessThan
331
+ is WhereConstraint .GreaterThan -> AndroidFilter ::greaterThan
332
+ is WhereConstraint .LessThanOrEqualTo -> AndroidFilter ::lessThanOrEqualTo
333
+ is WhereConstraint .GreaterThanOrEqualTo -> AndroidFilter ::greaterThanOrEqualTo
334
+ is WhereConstraint .ArrayContains -> AndroidFilter ::arrayContains
335
+ }
336
+ modifier.invoke(field, constraint.safeValue)
337
+ }
338
+ is WhereConstraint .ForArray -> {
339
+ val modifier: (String , List <Any >) -> AndroidFilter = when (constraint) {
340
+ is WhereConstraint .InArray -> AndroidFilter ::inArray
341
+ is WhereConstraint .ArrayContainsAny -> AndroidFilter ::arrayContainsAny
342
+ is WhereConstraint .NotInArray -> AndroidFilter ::notInArray
343
+ }
344
+ modifier.invoke(field, constraint.safeValues)
345
+ }
327
346
}
328
347
}
329
- )
330
-
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
348
+ is Filter .Path -> {
349
+ when (constraint) {
350
+ is WhereConstraint .ForNullableObject -> {
351
+ val modifier: (AndroidFieldPath , Any? ) -> AndroidFilter = when (constraint) {
352
+ is WhereConstraint .EqualTo -> AndroidFilter ::equalTo
353
+ is WhereConstraint .NotEqualTo -> AndroidFilter ::notEqualTo
354
+ }
355
+ modifier.invoke(path.android, constraint.safeValue)
356
+ }
357
+ is WhereConstraint .ForObject -> {
358
+ val modifier: (AndroidFieldPath , Any ) -> AndroidFilter = when (constraint) {
359
+ is WhereConstraint .LessThan -> AndroidFilter ::lessThan
360
+ is WhereConstraint .GreaterThan -> AndroidFilter ::greaterThan
361
+ is WhereConstraint .LessThanOrEqualTo -> AndroidFilter ::lessThanOrEqualTo
362
+ is WhereConstraint .GreaterThanOrEqualTo -> AndroidFilter ::greaterThanOrEqualTo
363
+ is WhereConstraint .ArrayContains -> AndroidFilter ::arrayContains
364
+ }
365
+ modifier.invoke(path.android, constraint.safeValue)
366
+ }
367
+ is WhereConstraint .ForArray -> {
368
+ val modifier: (AndroidFieldPath , List <Any >) -> AndroidFilter = when (constraint) {
369
+ is WhereConstraint .InArray -> AndroidFilter ::inArray
370
+ is WhereConstraint .ArrayContainsAny -> AndroidFilter ::arrayContainsAny
371
+ is WhereConstraint .NotInArray -> AndroidFilter ::notInArray
372
+ }
373
+ modifier.invoke(path.android, constraint.safeValues)
374
+ }
375
+ }
340
376
}
341
- )
377
+ }
342
378
343
379
internal actual fun _orderBy (field : String , direction : Direction ) = Query (android.orderBy(field, direction))
344
380
internal actual fun _orderBy (field : FieldPath , direction : Direction ) = Query (android.orderBy(field.android, direction))
0 commit comments