55@file:JvmName(" android" )
66package dev.gitlive.firebase.firestore
77
8- import com.google.android.gms.tasks.Task
98import com.google.firebase.firestore.*
109import dev.gitlive.firebase.*
1110import kotlinx.coroutines.channels.awaitClose
@@ -17,6 +16,10 @@ import kotlinx.serialization.DeserializationStrategy
1716import kotlinx.serialization.Serializable
1817import kotlinx.serialization.SerializationStrategy
1918
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+
2023actual val Firebase .firestore get() =
2124 FirebaseFirestore (com.google.firebase.firestore.FirebaseFirestore .getInstance())
2225
@@ -283,7 +286,7 @@ actual class DocumentReference actual constructor(internal actual val nativeValu
283286 override fun toString (): String = nativeValue.toString()
284287}
285288
286- actual open class Query (open val android : com.google.firebase.firestore. Query ) {
289+ actual open class Query (open val android : AndroidQuery ) {
287290
288291 actual suspend fun get () = QuerySnapshot (android.get().await())
289292
@@ -306,39 +309,72 @@ actual open class Query(open val android: com.google.firebase.firestore.Query) {
306309 awaitClose { listener.remove() }
307310 }
308311
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())
321314 )
322315
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+ }
327346 }
328347 }
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+ }
340376 }
341- )
377+ }
342378
343379 internal actual fun _orderBy (field : String , direction : Direction ) = Query (android.orderBy(field, direction))
344380 internal actual fun _orderBy (field : FieldPath , direction : Direction ) = Query (android.orderBy(field.android, direction))
0 commit comments