@@ -18,6 +18,7 @@ import kotlinx.serialization.SerializationStrategy
18
18
19
19
import com.google.firebase.firestore.Query as AndroidQuery
20
20
import com.google.firebase.firestore.FieldPath as AndroidFieldPath
21
+ import com.google.firebase.firestore.Filter as AndroidFilter
21
22
22
23
actual val Firebase .firestore get() =
23
24
FirebaseFirestore (com.google.firebase.firestore.FirebaseFirestore .getInstance())
@@ -308,69 +309,72 @@ actual open class Query(open val android: AndroidQuery) {
308
309
awaitClose { listener.remove() }
309
310
}
310
311
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
318
325
}
319
- modifier.invoke(query, field, clause .safeValue)
326
+ modifier.invoke(field, constraint .safeValue)
320
327
}
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
328
335
}
329
- modifier.invoke(query, field, clause .safeValue)
336
+ modifier.invoke(field, constraint .safeValue)
330
337
}
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
336
343
}
337
- modifier.invoke(query, field, clause .safeValues)
344
+ modifier.invoke(field, constraint .safeValues)
338
345
}
339
346
}
340
347
}
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
350
354
}
351
- modifier.invoke(query, path.android, clause .safeValue)
355
+ modifier.invoke(path.android, constraint .safeValue)
352
356
}
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
360
364
}
361
- modifier.invoke(query, path.android, clause .safeValue)
365
+ modifier.invoke(path.android, constraint .safeValue)
362
366
}
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
368
372
}
369
- modifier.invoke(query, path.android, clause .safeValues)
373
+ modifier.invoke(path.android, constraint .safeValues)
370
374
}
371
375
}
372
376
}
373
- )
377
+ }
374
378
375
379
internal actual fun _orderBy (field : String , direction : Direction ) = Query (android.orderBy(field, direction))
376
380
internal actual fun _orderBy (field : FieldPath , direction : Direction ) = Query (android.orderBy(field.android, direction))
0 commit comments