Helper methods and extensions to improve kotlin interop.#1478
Helper methods and extensions to improve kotlin interop.#1478rozza merged 7 commits intomongodb:kotlin-extensionsfrom
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
vbabanin
left a comment
There was a problem hiding this comment.
Looks good overall! Just a couple of questions.
NOTE: I am still reviewing some of the files before LGTM.
|
LGTM, noting that I'm not deeply versed in Kotlin! |
nhachicha
left a comment
There was a problem hiding this comment.
LGTM some minor comments 👍
| import org.bson.conversions.Bson | ||
|
|
||
| /** Filters extension methods to improve Kotlin interop */ | ||
| public object Filters { |
There was a problem hiding this comment.
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.nameThere was a problem hiding this comment.
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)
}
|
@nhachicha thanks for the review - I think I've responded to everything or have asked follow questions. |
nhachicha
left a comment
There was a problem hiding this comment.
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-syncandmongodb-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