Skip to content

Commit 1c28ed3

Browse files
committed
Adding support for encoded queries
1 parent a1c9f57 commit 1c28ed3

File tree

7 files changed

+252
-107
lines changed

7 files changed

+252
-107
lines changed

firebase-firestore/src/androidMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeQueryWrapper.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ internal actual open class NativeQueryWrapper internal actual constructor(actual
5959
is WhereConstraint.EqualTo -> com.google.firebase.firestore.Filter::equalTo
6060
is WhereConstraint.NotEqualTo -> com.google.firebase.firestore.Filter::notEqualTo
6161
}
62-
modifier.invoke(field, constraint.safeValue)
62+
modifier.invoke(field, constraint.value)
6363
}
6464
is WhereConstraint.ForObject -> {
6565
val modifier: (String, Any) -> com.google.firebase.firestore.Filter = when (constraint) {
@@ -69,15 +69,15 @@ internal actual open class NativeQueryWrapper internal actual constructor(actual
6969
is WhereConstraint.GreaterThanOrEqualTo -> com.google.firebase.firestore.Filter::greaterThanOrEqualTo
7070
is WhereConstraint.ArrayContains -> com.google.firebase.firestore.Filter::arrayContains
7171
}
72-
modifier.invoke(field, constraint.safeValue)
72+
modifier.invoke(field, constraint.value)
7373
}
7474
is WhereConstraint.ForArray -> {
7575
val modifier: (String, List<Any>) -> com.google.firebase.firestore.Filter = when (constraint) {
7676
is WhereConstraint.InArray -> com.google.firebase.firestore.Filter::inArray
7777
is WhereConstraint.ArrayContainsAny -> com.google.firebase.firestore.Filter::arrayContainsAny
7878
is WhereConstraint.NotInArray -> com.google.firebase.firestore.Filter::notInArray
7979
}
80-
modifier.invoke(field, constraint.safeValues)
80+
modifier.invoke(field, constraint.values)
8181
}
8282
}
8383
}
@@ -88,7 +88,7 @@ internal actual open class NativeQueryWrapper internal actual constructor(actual
8888
is WhereConstraint.EqualTo -> com.google.firebase.firestore.Filter::equalTo
8989
is WhereConstraint.NotEqualTo -> com.google.firebase.firestore.Filter::notEqualTo
9090
}
91-
modifier.invoke(path.android, constraint.safeValue)
91+
modifier.invoke(path.android, constraint.value)
9292
}
9393
is WhereConstraint.ForObject -> {
9494
val modifier: (FieldPath, Any) -> com.google.firebase.firestore.Filter = when (constraint) {
@@ -98,15 +98,15 @@ internal actual open class NativeQueryWrapper internal actual constructor(actual
9898
is WhereConstraint.GreaterThanOrEqualTo -> com.google.firebase.firestore.Filter::greaterThanOrEqualTo
9999
is WhereConstraint.ArrayContains -> com.google.firebase.firestore.Filter::arrayContains
100100
}
101-
modifier.invoke(path.android, constraint.safeValue)
101+
modifier.invoke(path.android, constraint.value)
102102
}
103103
is WhereConstraint.ForArray -> {
104104
val modifier: (FieldPath, List<Any>) -> com.google.firebase.firestore.Filter = when (constraint) {
105105
is WhereConstraint.InArray -> com.google.firebase.firestore.Filter::inArray
106106
is WhereConstraint.ArrayContainsAny -> com.google.firebase.firestore.Filter::arrayContainsAny
107107
is WhereConstraint.NotInArray -> com.google.firebase.firestore.Filter::notInArray
108108
}
109-
modifier.invoke(path.android, constraint.safeValues)
109+
modifier.invoke(path.android, constraint.values)
110110
}
111111
}
112112
}

firebase-firestore/src/commonMain/kotlin/dev/gitlive/firebase/firestore/Filter.kt

Lines changed: 200 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,31 @@
11
package dev.gitlive.firebase.firestore
22

3-
import dev.gitlive.firebase.firestore.internal.safeValue
3+
import dev.gitlive.firebase.EncodeSettings
4+
import kotlinx.serialization.SerializationStrategy
45

56
public sealed interface WhereConstraint {
67

78
public sealed interface ForNullableObject : WhereConstraint {
89
public val value: Any?
9-
public val safeValue: Any? get() = value?.safeValue
1010
}
1111

1212
public sealed interface ForObject : WhereConstraint {
1313
public val value: Any
14-
public val safeValue: Any get() = value.safeValue
1514
}
1615
public sealed interface ForArray : WhereConstraint {
1716
public val values: List<Any>
18-
public val safeValues: List<Any> get() = values.map { it.safeValue }
1917
}
2018

21-
public data class EqualTo internal constructor(override val value: Any?) : ForNullableObject
22-
public data class NotEqualTo internal constructor(override val value: Any?) : ForNullableObject
23-
public data class LessThan internal constructor(override val value: Any) : ForObject
24-
public data class GreaterThan internal constructor(override val value: Any) : ForObject
25-
public data class LessThanOrEqualTo internal constructor(override val value: Any) : ForObject
26-
public data class GreaterThanOrEqualTo internal constructor(override val value: Any) : ForObject
27-
public data class ArrayContains internal constructor(override val value: Any) : ForObject
28-
public data class ArrayContainsAny internal constructor(override val values: List<Any>) : ForArray
29-
public data class InArray internal constructor(override val values: List<Any>) : ForArray
30-
public data class NotInArray internal constructor(override val values: List<Any>) : ForArray
19+
public data class EqualTo @PublishedApi internal constructor(override val value: Any?) : ForNullableObject
20+
public data class NotEqualTo @PublishedApi internal constructor(override val value: Any?) : ForNullableObject
21+
public data class LessThan @PublishedApi internal constructor(override val value: Any) : ForObject
22+
public data class GreaterThan @PublishedApi internal constructor(override val value: Any) : ForObject
23+
public data class LessThanOrEqualTo @PublishedApi internal constructor(override val value: Any) : ForObject
24+
public data class GreaterThanOrEqualTo @PublishedApi internal constructor(override val value: Any) : ForObject
25+
public data class ArrayContains @PublishedApi internal constructor(override val value: Any) : ForObject
26+
public data class ArrayContainsAny @PublishedApi internal constructor(override val values: List<Any>) : ForArray
27+
public data class InArray @PublishedApi internal constructor(override val values: List<Any>) : ForArray
28+
public data class NotInArray @PublishedApi internal constructor(override val values: List<Any>) : ForArray
3129
}
3230

3331
public sealed class Filter {
@@ -37,51 +35,199 @@ public sealed class Filter {
3735
public abstract val constraint: WhereConstraint
3836
}
3937

40-
public data class Field internal constructor(val field: String, override val constraint: WhereConstraint) : WithConstraint()
41-
public data class Path internal constructor(val path: FieldPath, override val constraint: WhereConstraint) : WithConstraint()
38+
public data class Field @PublishedApi internal constructor(val field: String, override val constraint: WhereConstraint) : WithConstraint()
39+
public data class Path @PublishedApi internal constructor(val path: FieldPath, override val constraint: WhereConstraint) : WithConstraint()
4240
}
4341

4442
public class FilterBuilder internal constructor() {
4543

46-
public infix fun String.equalTo(value: Any?): Filter.WithConstraint = Filter.Field(this, WhereConstraint.EqualTo(value))
47-
48-
public infix fun FieldPath.equalTo(value: Any?): Filter.WithConstraint = Filter.Path(this, WhereConstraint.EqualTo(value))
49-
50-
public infix fun String.notEqualTo(value: Any?): Filter.WithConstraint = Filter.Field(this, WhereConstraint.NotEqualTo(value))
51-
52-
public infix fun FieldPath.notEqualTo(value: Any?): Filter.WithConstraint = Filter.Path(this, WhereConstraint.NotEqualTo(value))
53-
54-
public infix fun String.lessThan(value: Any): Filter.WithConstraint = Filter.Field(this, WhereConstraint.LessThan(value))
55-
56-
public infix fun FieldPath.lessThan(value: Any): Filter.WithConstraint = Filter.Path(this, WhereConstraint.LessThan(value))
57-
58-
public infix fun String.greaterThan(value: Any): Filter.WithConstraint = Filter.Field(this, WhereConstraint.GreaterThan(value))
59-
60-
public infix fun FieldPath.greaterThan(value: Any): Filter.WithConstraint = Filter.Path(this, WhereConstraint.GreaterThan(value))
61-
62-
public infix fun String.lessThanOrEqualTo(value: Any): Filter.WithConstraint = Filter.Field(this, WhereConstraint.LessThanOrEqualTo(value))
63-
64-
public infix fun FieldPath.lessThanOrEqualTo(value: Any): Filter.WithConstraint = Filter.Path(this, WhereConstraint.LessThanOrEqualTo(value))
65-
66-
public infix fun String.greaterThanOrEqualTo(value: Any): Filter.WithConstraint = Filter.Field(this, WhereConstraint.GreaterThanOrEqualTo(value))
67-
68-
public infix fun FieldPath.greaterThanOrEqualTo(value: Any): Filter.WithConstraint = Filter.Path(this, WhereConstraint.GreaterThanOrEqualTo(value))
69-
70-
public infix fun String.contains(value: Any): Filter.WithConstraint = Filter.Field(this, WhereConstraint.ArrayContains(value))
71-
72-
public infix fun FieldPath.contains(value: Any): Filter.WithConstraint = Filter.Path(this, WhereConstraint.ArrayContains(value))
73-
74-
public infix fun String.containsAny(values: List<Any>): Filter.WithConstraint = Filter.Field(this, WhereConstraint.ArrayContainsAny(values))
75-
76-
public infix fun FieldPath.containsAny(values: List<Any>): Filter.WithConstraint = Filter.Path(this, WhereConstraint.ArrayContainsAny(values))
77-
78-
public infix fun String.inArray(values: List<Any>): Filter.WithConstraint = Filter.Field(this, WhereConstraint.InArray(values))
79-
80-
public infix fun FieldPath.inArray(values: List<Any>): Filter.WithConstraint = Filter.Path(this, WhereConstraint.InArray(values))
81-
82-
public infix fun String.notInArray(values: List<Any>): Filter.WithConstraint = Filter.Field(this, WhereConstraint.NotInArray(values))
44+
public var buildSettings: EncodeSettings.Builder.() -> Unit = {
45+
encodeDefaults = true
46+
}
8347

84-
public infix fun FieldPath.notInArray(values: List<Any>): Filter.WithConstraint = Filter.Path(this, WhereConstraint.NotInArray(values))
48+
public val String.isNull: Filter.WithConstraint get() = Filter.Field(this, WhereConstraint.EqualTo(null))
49+
public inline infix fun <reified T> String.equalTo(value: T): Filter.WithConstraint = Filter.Field(
50+
this,
51+
WhereConstraint.EqualTo(encode(value, buildSettings))
52+
)
53+
public fun <T : Any> String.equalTo(strategy: SerializationStrategy<T>, value: T): Filter.WithConstraint = Filter.Field(
54+
this,
55+
WhereConstraint.EqualTo(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings))
56+
)
57+
58+
public val FieldPath.isNull: Filter.WithConstraint get() = Filter.Path(this, WhereConstraint.EqualTo(null))
59+
public inline infix fun <reified T> FieldPath.equalTo(value: T): Filter.WithConstraint = Filter.Path(
60+
this,
61+
WhereConstraint.EqualTo(encode(value, buildSettings))
62+
)
63+
public fun <T : Any> FieldPath.equalTo(strategy: SerializationStrategy<T>, value: T): Filter.WithConstraint = Filter.Path(
64+
this,
65+
WhereConstraint.EqualTo(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings))
66+
)
67+
68+
public val String.isNotNull: Filter.WithConstraint get() = Filter.Field(this, WhereConstraint.NotEqualTo(null))
69+
public inline infix fun <reified T> String.notEqualTo(value: T): Filter.WithConstraint = Filter.Field(
70+
this,
71+
WhereConstraint.NotEqualTo(encode(value, buildSettings))
72+
)
73+
public fun <T : Any> String.notEqualTo(strategy: SerializationStrategy<T>, value: T): Filter.WithConstraint = Filter.Field(
74+
this,
75+
WhereConstraint.NotEqualTo(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings))
76+
)
77+
78+
public val FieldPath.isNotNull: Filter.WithConstraint get() = Filter.Path(this, WhereConstraint.NotEqualTo(null))
79+
public inline infix fun <reified T> FieldPath.notEqualTo(value: T): Filter.WithConstraint = Filter.Path(
80+
this,
81+
WhereConstraint.NotEqualTo(encode(value, buildSettings))
82+
)
83+
public fun <T : Any> FieldPath.notEqualTo(strategy: SerializationStrategy<T>, value: T): Filter.WithConstraint = Filter.Path(
84+
this,
85+
WhereConstraint.NotEqualTo(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings))
86+
)
87+
88+
public inline infix fun <reified T : Any> String.lessThan(value: T): Filter.WithConstraint = Filter.Field(
89+
this,
90+
WhereConstraint.LessThan(encode(value, buildSettings)!!)
91+
)
92+
public fun <T : Any> String.lessThan(strategy: SerializationStrategy<T>, value: T): Filter.WithConstraint = Filter.Field(
93+
this,
94+
WhereConstraint.LessThan(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings)!!)
95+
)
96+
97+
public inline infix fun <reified T : Any> FieldPath.lessThan(value: T): Filter.WithConstraint = Filter.Path(
98+
this,
99+
WhereConstraint.LessThan(encode(value, buildSettings)!!)
100+
)
101+
public fun <T : Any> FieldPath.lessThan(strategy: SerializationStrategy<T>, value: T): Filter.WithConstraint = Filter.Path(
102+
this,
103+
WhereConstraint.LessThan(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings)!!)
104+
)
105+
106+
public inline infix fun <reified T : Any> String.greaterThan(value: T): Filter.WithConstraint = Filter.Field(
107+
this,
108+
WhereConstraint.GreaterThan(encode(value, buildSettings)!!)
109+
)
110+
public fun <T : Any> String.greaterThan(strategy: SerializationStrategy<T>, value: T): Filter.WithConstraint = Filter.Field(
111+
this,
112+
WhereConstraint.GreaterThan(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings)!!)
113+
)
114+
115+
public inline infix fun <reified T : Any> FieldPath.greaterThan(value: T): Filter.WithConstraint = Filter.Path(
116+
this,
117+
WhereConstraint.GreaterThan(encode(value, buildSettings)!!)
118+
)
119+
public fun <T : Any> FieldPath.greaterThan(strategy: SerializationStrategy<T>, value: T): Filter.WithConstraint = Filter.Path(
120+
this,
121+
WhereConstraint.GreaterThan(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings)!!)
122+
)
123+
124+
public inline infix fun <reified T : Any> String.lessThanOrEqualTo(value: T): Filter.WithConstraint = Filter.Field(
125+
this,
126+
WhereConstraint.LessThanOrEqualTo(encode(value, buildSettings)!!)
127+
)
128+
public fun <T : Any> String.lessThanOrEqualTo(strategy: SerializationStrategy<T>, value: T): Filter.WithConstraint = Filter.Field(
129+
this,
130+
WhereConstraint.LessThanOrEqualTo(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings)!!)
131+
)
132+
133+
public inline infix fun <reified T : Any> FieldPath.lessThanOrEqualTo(value: T): Filter.WithConstraint = Filter.Path(
134+
this,
135+
WhereConstraint.LessThanOrEqualTo(encode(value, buildSettings)!!)
136+
)
137+
public fun <T : Any> FieldPath.lessThanOrEqualTo(strategy: SerializationStrategy<T>, value: T): Filter.WithConstraint = Filter.Path(
138+
this,
139+
WhereConstraint.GreaterThanOrEqualTo(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings)!!)
140+
)
141+
142+
public inline infix fun <reified T : Any> String.greaterThanOrEqualTo(value: T): Filter.WithConstraint = Filter.Field(
143+
this,
144+
WhereConstraint.GreaterThanOrEqualTo(encode(value, buildSettings)!!)
145+
)
146+
public fun <T : Any> String.greaterThanOrEqualTo(strategy: SerializationStrategy<T>, value: T): Filter.WithConstraint = Filter.Field(
147+
this,
148+
WhereConstraint.GreaterThanOrEqualTo(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings)!!)
149+
)
150+
151+
public inline infix fun <reified T : Any> FieldPath.greaterThanOrEqualTo(value: T): Filter.WithConstraint = Filter.Path(
152+
this,
153+
WhereConstraint.GreaterThanOrEqualTo(encode(value, buildSettings)!!)
154+
)
155+
public fun <T : Any> FieldPath.greaterThanOrEqualTo(strategy: SerializationStrategy<T>, value: T): Filter.WithConstraint = Filter.Path(
156+
this,
157+
WhereConstraint.LessThanOrEqualTo(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings)!!)
158+
)
159+
160+
public inline infix fun <reified T : Any> String.contains(value: T): Filter.WithConstraint = Filter.Field(
161+
this,
162+
WhereConstraint.ArrayContains(encode(value, buildSettings)!!)
163+
)
164+
public fun <T : Any> String.contains(strategy: SerializationStrategy<T>, value: T): Filter.WithConstraint = Filter.Field(
165+
this,
166+
WhereConstraint.ArrayContains(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings)!!)
167+
)
168+
169+
public inline infix fun <reified T : Any> FieldPath.contains(value: T): Filter.WithConstraint = Filter.Path(
170+
this,
171+
WhereConstraint.ArrayContains(encode(value, buildSettings)!!)
172+
)
173+
public fun <T : Any> FieldPath.contains(strategy: SerializationStrategy<T>, value: T): Filter.WithConstraint = Filter.Path(
174+
this,
175+
WhereConstraint.ArrayContains(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings)!!)
176+
)
177+
178+
public inline infix fun <reified T : Any> String.containsAny(values: List<T>): Filter.WithConstraint = Filter.Field(
179+
this,
180+
WhereConstraint.ArrayContainsAny(values.map { encode(it, buildSettings)!! })
181+
)
182+
public fun <T : Any> String.containsAny(strategy: SerializationStrategy<T>, values: List<T>): Filter.WithConstraint = Filter.Field(
183+
this,
184+
WhereConstraint.ArrayContainsAny(values.map {dev.gitlive.firebase.internal.encode(strategy, it, buildSettings)!! })
185+
)
186+
187+
public inline infix fun <reified T : Any> FieldPath.containsAny(values: List<T>): Filter.WithConstraint = Filter.Path(
188+
this,
189+
WhereConstraint.ArrayContainsAny(values.map { encode(it, buildSettings)!! })
190+
)
191+
public fun <T : Any> FieldPath.containsAny(strategy: SerializationStrategy<T>, values: List<T>): Filter.WithConstraint = Filter.Path(
192+
this,
193+
WhereConstraint.ArrayContainsAny(values.map {dev.gitlive.firebase.internal.encode(strategy, it, buildSettings)!! })
194+
)
195+
196+
public inline infix fun <reified T : Any> String.inArray(values: List<T>): Filter.WithConstraint = Filter.Field(
197+
this,
198+
WhereConstraint.InArray(values.map { encode(it, buildSettings)!! })
199+
)
200+
public fun <T : Any> String.inArray(strategy: SerializationStrategy<T>, values: List<T>): Filter.WithConstraint = Filter.Field(
201+
this,
202+
WhereConstraint.InArray(values.map {dev.gitlive.firebase.internal.encode(strategy, it, buildSettings)!! })
203+
)
204+
205+
public inline infix fun <reified T : Any> FieldPath.inArray(values: List<T>): Filter.WithConstraint = Filter.Path(
206+
this,
207+
WhereConstraint.InArray(values.map { encode(it, buildSettings)!! })
208+
)
209+
public fun <T : Any> FieldPath.inArray(strategy: SerializationStrategy<T>, values: List<T>): Filter.WithConstraint = Filter.Path(
210+
this,
211+
WhereConstraint.InArray(values.map {dev.gitlive.firebase.internal.encode(strategy, it, buildSettings)!! })
212+
)
213+
214+
public inline infix fun <reified T : Any> String.notInArray(values: List<T>): Filter.WithConstraint = Filter.Field(
215+
this,
216+
WhereConstraint.NotInArray(values.map { encode(it, buildSettings)!! })
217+
)
218+
public fun <T : Any> String.notInArray(strategy: SerializationStrategy<T>, values: List<T>): Filter.WithConstraint = Filter.Field(
219+
this,
220+
WhereConstraint.NotInArray(values.map {dev.gitlive.firebase.internal.encode(strategy, it, buildSettings)!! })
221+
)
222+
223+
public inline infix fun <reified T : Any> FieldPath.notInArray(values: List<T>): Filter.WithConstraint = Filter.Path(
224+
this,
225+
WhereConstraint.NotInArray(values.map { encode(it, buildSettings)!! })
226+
)
227+
public fun <T : Any> FieldPath.notInArray(strategy: SerializationStrategy<T>, values: List<T>): Filter.WithConstraint = Filter.Path(
228+
this,
229+
WhereConstraint.NotInArray(values.map {dev.gitlive.firebase.internal.encode(strategy, it, buildSettings)!! })
230+
)
85231

86232
public infix fun Filter.and(right: Filter): Filter.And {
87233
val leftList = when (this) {

0 commit comments

Comments
 (0)