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.runBlocking
@@ -20,6 +19,10 @@ import kotlinx.serialization.DeserializationStrategy
20
19
import kotlinx.serialization.Serializable
21
20
import kotlinx.serialization.SerializationStrategy
22
21
22
+ import com.google.firebase.firestore.Query as AndroidQuery
23
+ import com.google.firebase.firestore.FieldPath as AndroidFieldPath
24
+ import com.google.firebase.firestore.Filter as AndroidFilter
25
+
23
26
actual val Firebase .firestore get() =
24
27
FirebaseFirestore (com.google.firebase.firestore.FirebaseFirestore .getInstance())
25
28
@@ -226,7 +229,7 @@ actual class DocumentReference actual constructor(internal actual val nativeValu
226
229
}
227
230
}
228
231
229
- actual typealias NativeQuery = com.google.firebase.firestore. Query
232
+ actual typealias NativeQuery = AndroidQuery
230
233
231
234
actual open class Query internal actual constructor(nativeQuery : NativeQuery ) {
232
235
@@ -253,39 +256,72 @@ actual open class Query internal actual constructor(nativeQuery: NativeQuery) {
253
256
awaitClose { listener.remove() }
254
257
}
255
258
256
- internal actual fun _where (field : String , equalTo : Any? ) = Query (android.whereEqualTo(field, equalTo))
257
- internal actual fun _where (path : FieldPath , equalTo : Any? ) = Query (android.whereEqualTo(path.android, equalTo))
258
-
259
- internal actual fun _where (field : String , equalTo : DocumentReference ) = Query (android.whereEqualTo(field, equalTo.android))
260
- internal actual fun _where (path : FieldPath , equalTo : DocumentReference ) = Query (android.whereEqualTo(path.android, equalTo.android))
261
-
262
- internal actual fun _where (field : String , lessThan : Any? , greaterThan : Any? , arrayContains : Any? ) = Query (
263
- (lessThan?.let { android.whereLessThan(field, it) } ? : android).let { android2 ->
264
- (greaterThan?.let { android2.whereGreaterThan(field, it) } ? : android2).let { android3 ->
265
- arrayContains?.let { android3.whereArrayContains(field, it) } ? : android3
266
- }
267
- }
259
+ internal actual fun where (filter : Filter ) = Query (
260
+ android.where(filter.toAndroidFilter())
268
261
)
269
262
270
- internal actual fun _where (path : FieldPath , lessThan : Any? , greaterThan : Any? , arrayContains : Any? ) = Query (
271
- (lessThan?.let { android.whereLessThan(path.android, it) } ? : android).let { android2 ->
272
- (greaterThan?.let { android2.whereGreaterThan(path.android, it) } ? : android2).let { android3 ->
273
- arrayContains?.let { android3.whereArrayContains(path.android, it) } ? : android3
263
+ private fun Filter.toAndroidFilter (): AndroidFilter = when (this ) {
264
+ is Filter .And -> AndroidFilter .and (* filters.map { it.toAndroidFilter() }.toTypedArray())
265
+ is Filter .Or -> AndroidFilter .or (* filters.map { it.toAndroidFilter() }.toTypedArray())
266
+ is Filter .Field -> {
267
+ when (constraint) {
268
+ is WhereConstraint .ForNullableObject -> {
269
+ val modifier: (String , Any? ) -> AndroidFilter = when (constraint) {
270
+ is WhereConstraint .EqualTo -> AndroidFilter ::equalTo
271
+ is WhereConstraint .NotEqualTo -> AndroidFilter ::notEqualTo
272
+ }
273
+ modifier.invoke(field, constraint.safeValue)
274
+ }
275
+ is WhereConstraint .ForObject -> {
276
+ val modifier: (String , Any ) -> AndroidFilter = when (constraint) {
277
+ is WhereConstraint .LessThan -> AndroidFilter ::lessThan
278
+ is WhereConstraint .GreaterThan -> AndroidFilter ::greaterThan
279
+ is WhereConstraint .LessThanOrEqualTo -> AndroidFilter ::lessThanOrEqualTo
280
+ is WhereConstraint .GreaterThanOrEqualTo -> AndroidFilter ::greaterThanOrEqualTo
281
+ is WhereConstraint .ArrayContains -> AndroidFilter ::arrayContains
282
+ }
283
+ modifier.invoke(field, constraint.safeValue)
284
+ }
285
+ is WhereConstraint .ForArray -> {
286
+ val modifier: (String , List <Any >) -> AndroidFilter = when (constraint) {
287
+ is WhereConstraint .InArray -> AndroidFilter ::inArray
288
+ is WhereConstraint .ArrayContainsAny -> AndroidFilter ::arrayContainsAny
289
+ is WhereConstraint .NotInArray -> AndroidFilter ::notInArray
290
+ }
291
+ modifier.invoke(field, constraint.safeValues)
292
+ }
274
293
}
275
294
}
276
- )
277
-
278
- internal actual fun _where (field : String , inArray : List <Any >? , arrayContainsAny : List <Any >? ) = Query (
279
- (inArray?.let { android.whereIn(field, it) } ? : android).let { android2 ->
280
- arrayContainsAny?.let { android2.whereArrayContainsAny(field, it) } ? : android2
281
- }
282
- )
283
-
284
- internal actual fun _where (path : FieldPath , inArray : List <Any >? , arrayContainsAny : List <Any >? ) = Query (
285
- (inArray?.let { android.whereIn(path.android, it) } ? : android).let { android2 ->
286
- arrayContainsAny?.let { android2.whereArrayContainsAny(path.android, it) } ? : android2
295
+ is Filter .Path -> {
296
+ when (constraint) {
297
+ is WhereConstraint .ForNullableObject -> {
298
+ val modifier: (AndroidFieldPath , Any? ) -> AndroidFilter = when (constraint) {
299
+ is WhereConstraint .EqualTo -> AndroidFilter ::equalTo
300
+ is WhereConstraint .NotEqualTo -> AndroidFilter ::notEqualTo
301
+ }
302
+ modifier.invoke(path.android, constraint.safeValue)
303
+ }
304
+ is WhereConstraint .ForObject -> {
305
+ val modifier: (AndroidFieldPath , Any ) -> AndroidFilter = when (constraint) {
306
+ is WhereConstraint .LessThan -> AndroidFilter ::lessThan
307
+ is WhereConstraint .GreaterThan -> AndroidFilter ::greaterThan
308
+ is WhereConstraint .LessThanOrEqualTo -> AndroidFilter ::lessThanOrEqualTo
309
+ is WhereConstraint .GreaterThanOrEqualTo -> AndroidFilter ::greaterThanOrEqualTo
310
+ is WhereConstraint .ArrayContains -> AndroidFilter ::arrayContains
311
+ }
312
+ modifier.invoke(path.android, constraint.safeValue)
313
+ }
314
+ is WhereConstraint .ForArray -> {
315
+ val modifier: (AndroidFieldPath , List <Any >) -> AndroidFilter = when (constraint) {
316
+ is WhereConstraint .InArray -> AndroidFilter ::inArray
317
+ is WhereConstraint .ArrayContainsAny -> AndroidFilter ::arrayContainsAny
318
+ is WhereConstraint .NotInArray -> AndroidFilter ::notInArray
319
+ }
320
+ modifier.invoke(path.android, constraint.safeValues)
321
+ }
322
+ }
287
323
}
288
- )
324
+ }
289
325
290
326
internal actual fun _orderBy (field : String , direction : Direction ) = Query (android.orderBy(field, direction))
291
327
internal actual fun _orderBy (field : FieldPath , direction : Direction ) = Query (android.orderBy(field.android, direction))
0 commit comments