@@ -18,6 +18,7 @@ import kotlinx.serialization.SerializationStrategy
1818
1919import com.google.firebase.firestore.Query as AndroidQuery
2020import com.google.firebase.firestore.FieldPath as AndroidFieldPath
21+ import com.google.firebase.firestore.Filter as AndroidFilter
2122
2223actual val Firebase .firestore get() =
2324 FirebaseFirestore (com.google.firebase.firestore.FirebaseFirestore .getInstance())
@@ -308,69 +309,72 @@ actual open class Query(open val android: AndroidQuery) {
308309 awaitClose { listener.remove() }
309310 }
310311
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
312+ internal actual fun where (filter : Filter ) = Query (
313+ android.where(filter.toAndroidFilter())
314+ )
315+
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
318325 }
319- modifier.invoke(query, field, clause .safeValue)
326+ modifier.invoke(field, constraint .safeValue)
320327 }
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+ 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
328335 }
329- modifier.invoke(query, field, clause .safeValue)
336+ modifier.invoke(field, constraint .safeValue)
330337 }
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
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
336343 }
337- modifier.invoke(query, field, clause .safeValues)
344+ modifier.invoke(field, constraint .safeValues)
338345 }
339346 }
340347 }
341- )
342-
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
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
350354 }
351- modifier.invoke(query, path.android, clause .safeValue)
355+ modifier.invoke(path.android, constraint .safeValue)
352356 }
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
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
360364 }
361- modifier.invoke(query, path.android, clause .safeValue)
365+ modifier.invoke(path.android, constraint .safeValue)
362366 }
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
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
368372 }
369- modifier.invoke(query, path.android, clause .safeValues)
373+ modifier.invoke(path.android, constraint .safeValues)
370374 }
371375 }
372376 }
373- )
377+ }
374378
375379 internal actual fun _orderBy (field : String , direction : Direction ) = Query (android.orderBy(field, direction))
376380 internal actual fun _orderBy (field : FieldPath , direction : Direction ) = Query (android.orderBy(field.android, direction))
0 commit comments