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,9 @@ 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+
2022actual val Firebase .firestore get() =
2123 FirebaseFirestore (com.google.firebase.firestore.FirebaseFirestore .getInstance())
2224
@@ -283,7 +285,7 @@ actual class DocumentReference actual constructor(internal actual val nativeValu
283285 override fun toString (): String = nativeValue.toString()
284286}
285287
286- actual open class Query (open val android : com.google.firebase.firestore. Query ) {
288+ actual open class Query (open val android : AndroidQuery ) {
287289
288290 actual suspend fun get () = QuerySnapshot (android.get().await())
289291
@@ -306,39 +308,85 @@ actual open class Query(open val android: com.google.firebase.firestore.Query) {
306308 awaitClose { listener.remove() }
307309 }
308310
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+ }
319339 }
320340 }
321341 )
322342
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+ }
327371 }
328372 }
329373 )
330374
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
342390
343391 internal actual fun _orderBy (field : String , direction : Direction ) = Query (android.orderBy(field, direction))
344392 internal actual fun _orderBy (field : FieldPath , direction : Direction ) = Query (android.orderBy(field.android, direction))
0 commit comments