-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Helper methods and extensions to improve kotlin interop. #1478
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…ngo-property but provides both infix and nested helpers. Adds a new package `org.mongodb.mongodb-driver-kotlin-extensions`. Its both kotlin drivers and bson kotlin implementations agnostic. So can be used with any combination of `bson-kotlin`, `bson-kotlinx`, `mongodb-driver-kotlin-sync` and `mongodb-driver-kotlin-coroutine`. Initial Filters extensions support, with both inflix and nested helpers eg: ``` import com.mongodb.kotlin.client.model.Filters.eq // infix Person::name.eq(person.name) // nested val bson = eq(Person::name, person.name) ``` Also adds path based support which works with vairous annotations on the data class: `@SerialName("_id")`, `@BsonId`, `@BsonProperty("_id")`: ``` (Restaurant::reviews / Review::score).path() == "reviews.rating" ``` JAVA-5308 JAVA-5484
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good overall! Just a couple of questions.
NOTE: I am still reviewing some of the files before LGTM.
driver-kotlin-extensions/src/main/kotlin/com/mongodb/kotlin/client/model/Filters/Filters.kt
Outdated
Show resolved
Hide resolved
driver-kotlin-extensions/src/main/kotlin/com/mongodb/kotlin/client/model/Properties.kt
Outdated
Show resolved
Hide resolved
driver-kotlin-extensions/src/main/kotlin/com/mongodb/kotlin/client/model/Properties.kt
Show resolved
Hide resolved
driver-kotlin-extensions/src/main/kotlin/com/mongodb/kotlin/client/model/Properties.kt
Outdated
Show resolved
Hide resolved
driver-kotlin-extensions/src/main/kotlin/com/mongodb/kotlin/client/property/KPropertyPath.kt
Show resolved
Hide resolved
LGTM, noting that I'm not deeply versed in Kotlin! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM some minor comments 👍
driver-kotlin-extensions/src/main/kotlin/com/mongodb/kotlin/client/model/Filters.kt
Outdated
Show resolved
Hide resolved
import org.bson.conversions.Bson | ||
|
||
/** Filters extension methods to improve Kotlin interop */ | ||
public object Filters { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Note that driver-core defines the same overloads for String property name
so if a user combines both filters they need to FQN the second one.
val bsonExt = eq(Person::name, person.name)
val bson = com.mongodb.client.model.Filters.eq(Person::name.name, person.name)
Extension functions can reside as top methods on a Kotlin file, the suggested approach below might offer IDE help when importing (although you still need 2 static imports for both)
- FiltersExt.kt
package com.mongodb.client.model.ext
import com.mongodb.client.model.Filters
import com.mongodb.kotlin.client.model.path
import org.bson.conversions.Bson
import kotlin.internal.OnlyInputTypes
import kotlin.reflect.KProperty
@JvmName("eqExt")
public infix fun <@OnlyInputTypes T> KProperty<T?>.eq(value: T?): Bson = Filters.eq(path(), value)
public fun <@OnlyInputTypes T> eq(property: KProperty<T?>, value: T?): Bson = property.eq(value)
and in the
- FiltersTes.kt
import com.mongodb.client.model.Filters.eq
import com.mongodb.client.model.ext.eq
val bson = eq(Person::name, person.name)
val bson2 = eq(Person::name.name, person.name)
assertEquals(expected, bson.document)
val kmongoDsl = Person::name eq person.name
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As the namespaces are different they can import both methods:
import com.mongodb.client.model.Filters.eq
import com.mongodb.kotlin.client.model.Filters.eq
...
@Test
fun testEqSupport() {
val expected = BsonDocument.parse("""{"name": "Ada"}""")
val bson = eq(Person::name, person.name)
assertEquals(expected, bson.document)
val bson2 = eq(Person::name.name, person.name)
assertEquals(expected, bson2.document)
val kmongoDsl = Person::name eq person.name
assertEquals(expected, kmongoDsl.document)
}
driver-kotlin-extensions/src/main/kotlin/com/mongodb/kotlin/client/model/Filters.kt
Show resolved
Hide resolved
driver-kotlin-extensions/src/main/kotlin/com/mongodb/kotlin/client/model/Filters.kt
Show resolved
Hide resolved
driver-kotlin-extensions/src/main/kotlin/com/mongodb/kotlin/client/model/Filters.kt
Show resolved
Hide resolved
driver-kotlin-extensions/src/main/kotlin/com/mongodb/kotlin/client/property/KPropertyPath.kt
Outdated
Show resolved
Hide resolved
driver-kotlin-extensions/src/main/kotlin/com/mongodb/kotlin/client/property/KPropertyPath.kt
Outdated
Show resolved
Hide resolved
driver-kotlin-extensions/src/main/kotlin/com/mongodb/kotlin/client/property/KPropertyPath.kt
Outdated
Show resolved
Hide resolved
driver-kotlin-extensions/src/test/kotlin/com/mongodb/kotlin/client/model/KPropertiesTest.kt
Show resolved
Hide resolved
driver-kotlin-extensions/src/test/kotlin/com/mongodb/kotlin/client/model/FiltersTest.kt
Show resolved
Hide resolved
@nhachicha thanks for the review - I think I've responded to everything or have asked follow questions. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice one 🎉
Should this still target master or a feature branch?
Adds a new package `org.mongodb.mongodb-driver-kotlin-extensions`. Its both, kotlin driver and bson kotlin implementation agnostic. Can be used with any combination of `bson-kotlin`, `bson-kotlinx`, `mongodb-driver-kotlin-sync` and `mongodb-driver-kotlin-coroutine`. Initial Filters extensions support, with both inflix and nested helpers eg: ``` import com.mongodb.kotlin.client.model.Filters.eq // infix Person::name.eq(person.name) // nested val bson = eq(Person::name, person.name) ``` Also adds path based support which works with vairous annotations on the data class: `@SerialName("_id")`, `@BsonId`, `@BsonProperty("_id")`: ``` (Restaurant::reviews / Review::score).path() == "reviews.rating" ``` JAVA-5308 JAVA-5484
* Helper methods and extensions to improve kotlin interop. (#1478) Adds a new package `org.mongodb.mongodb-driver-kotlin-extensions`. Its both, kotlin driver and bson kotlin implementation agnostic. Can be used with any combination of `bson-kotlin`, `bson-kotlinx`, `mongodb-driver-kotlin-sync` and `mongodb-driver-kotlin-coroutine`. Initial Filters extensions support, with both inflix and nested helpers eg: ``` import com.mongodb.kotlin.client.model.Filters.eq // infix Person::name.eq(person.name) // nested val bson = eq(Person::name, person.name) ``` Also adds path based support which works with vairous annotations on the data class: `@SerialName("_id")`, `@BsonId`, `@BsonProperty("_id")`: ``` (Restaurant::reviews / Review::score).path() == "reviews.rating" ``` JAVA-5308 JAVA-5484 * Gradle: Support custom header annotation * Added since annotation to Filters.kt JAVA-5308 * Adding Kotlin extensions methods for projection. (#1515) * Adding Kotlin extensions methods for projection. Fixes JAVA-5603 --------- Co-authored-by: Ross Lawley <[email protected]> * Adding Kotlin extensions methods for updates (#1529) * Adding Kotlin extension function for Updates operations JAVA-5601 * Grouping static checks under the same task (#1526) * Grouping all static checks under the "check" task JAVA-5633 * Add extension methods for Indexes (#1532) JAVA-5604 * Adding extension methods for Sorts (#1533) JAVA-5602 * Adding extensions for Aggregators and Accumulators (#1562) * Adding extensions for Aggregators and Accumulators --------- Co-authored-by: Ross Lawley <[email protected]> Co-authored-by: Ross Lawley <[email protected]>
Based on kmongo-property but provides both infix and nested helpers.
Adds a new package
org.mongodb.mongodb-driver-kotlin-extensions
. Its both kotlin drivers and bson kotlin implementations agnostic. So can be used with any combination ofbson-kotlin
,bson-kotlinx
,mongodb-driver-kotlin-sync
andmongodb-driver-kotlin-coroutine
.Initial Filters extensions support, with both inflix and nested helpers eg:
Also adds path based support which works with vairous annotations on the data class:
@SerialName("_id")
,@BsonId
,@BsonProperty("_id")
:JAVA-5308 JAVA-5484