From 10be79e67e1e4fd3e0df3c55bac0f0ee5e2279e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Mon, 22 Jun 2026 20:36:28 +0200 Subject: [PATCH] feat(driver-coroutines): Implement CoroutineMongoIterable --- .../src/jvmMain/kotlin/KMongoExt.kt | 4 +- .../jvmMain/kotlin/CoroutineMongoIterable.kt | 3 ++ .../kotlin/CoroutineMongoIterableImpl.kt | 51 +++++++++++++++++++ .../src/jvmMain/kotlin/JvmMongoCollection.kt | 8 +-- .../src/jvmMain/kotlin/JvmMongoIterable.kt | 6 +-- test/src/jvmMain/kotlin/TestDatabase.jvm.kt | 6 +-- 6 files changed, 66 insertions(+), 12 deletions(-) create mode 100644 driver-coroutines/src/jvmMain/kotlin/CoroutineMongoIterableImpl.kt diff --git a/driver-coroutines-kmongo/src/jvmMain/kotlin/KMongoExt.kt b/driver-coroutines-kmongo/src/jvmMain/kotlin/KMongoExt.kt index d9a13705..9c07e73b 100644 --- a/driver-coroutines-kmongo/src/jvmMain/kotlin/KMongoExt.kt +++ b/driver-coroutines-kmongo/src/jvmMain/kotlin/KMongoExt.kt @@ -18,7 +18,7 @@ package opensavvy.ktmongo.coroutines.kmongo import com.mongodb.reactivestreams.client.MongoCollection import opensavvy.ktmongo.coroutines.JvmMongoCollection -import opensavvy.ktmongo.coroutines.asKtMongo +import opensavvy.ktmongo.coroutines.asKtMongoLegacy import opensavvy.ktmongo.dsl.path.PropertyNameStrategy import opensavvy.ktmongo.utils.kmongo.KMongoNameStrategy @@ -28,4 +28,4 @@ import opensavvy.ktmongo.utils.kmongo.KMongoNameStrategy inline fun MongoCollection.asKtMongo( nameStrategy: PropertyNameStrategy = KMongoNameStrategy(), ): JvmMongoCollection = - com.mongodb.kotlin.client.coroutine.MongoCollection(this).asKtMongo(nameStrategy) + com.mongodb.kotlin.client.coroutine.MongoCollection(this).asKtMongoLegacy(nameStrategy) diff --git a/driver-coroutines/src/jvmMain/kotlin/CoroutineMongoIterable.kt b/driver-coroutines/src/jvmMain/kotlin/CoroutineMongoIterable.kt index 7a48b5d2..c5836775 100644 --- a/driver-coroutines/src/jvmMain/kotlin/CoroutineMongoIterable.kt +++ b/driver-coroutines/src/jvmMain/kotlin/CoroutineMongoIterable.kt @@ -14,6 +14,9 @@ * limitations under the License. */ +@file:JvmMultifileClass +@file:JvmName("KtMongo") + package opensavvy.ktmongo.coroutines import com.mongodb.kotlin.client.coroutine.FindFlow diff --git a/driver-coroutines/src/jvmMain/kotlin/CoroutineMongoIterableImpl.kt b/driver-coroutines/src/jvmMain/kotlin/CoroutineMongoIterableImpl.kt new file mode 100644 index 00000000..c003dfe1 --- /dev/null +++ b/driver-coroutines/src/jvmMain/kotlin/CoroutineMongoIterableImpl.kt @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2026, OpenSavvy and contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@file:JvmMultifileClass +@file:JvmName("KtMongo") + +package opensavvy.ktmongo.coroutines + +import com.mongodb.kotlin.client.coroutine.FindFlow +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.firstOrNull + +private class CoroutineMongoIterableImpl( + private val inner: FindFlow, +) : CoroutineMongoIterable { + + override fun asOfficial(): FindFlow = + inner + + override suspend fun first(): Document = + inner.first() + + override suspend fun firstOrNull(): Document? = + inner.firstOrNull() + + override suspend fun forEach(action: suspend (Document) -> Unit): Unit = + inner.collect(action) + + override fun asFlow(): Flow = + inner +} + +/** + * Instantiates a KtMongo [CoroutineMongoIterable] using an existing flow from the official Kotlin driver. + */ +fun FindFlow.asKtMongo(): CoroutineMongoIterable = + CoroutineMongoIterableImpl(this) diff --git a/driver-coroutines/src/jvmMain/kotlin/JvmMongoCollection.kt b/driver-coroutines/src/jvmMain/kotlin/JvmMongoCollection.kt index 5eea0eb7..5b8b370a 100644 --- a/driver-coroutines/src/jvmMain/kotlin/JvmMongoCollection.kt +++ b/driver-coroutines/src/jvmMain/kotlin/JvmMongoCollection.kt @@ -58,7 +58,7 @@ import kotlin.reflect.typeOf * * To access the inner iterable, see [asKotlinClient]. * - * To convert an existing MongoDB iterable into an instance of this class, see [asKtMongo]. + * To convert an existing MongoDB iterable into an instance of this class, see [asKtMongoLegacy]. */ class JvmMongoCollection internal constructor( inner: com.mongodb.kotlin.client.coroutine.MongoCollection, @@ -430,7 +430,7 @@ class JvmMongoCollection internal constructor( /** * Converts a [MongoDB collection][com.mongodb.kotlin.client.coroutine.MongoCollection] into a [KtMongo collection][JvmMongoCollection]. */ -fun com.mongodb.kotlin.client.coroutine.MongoCollection.asKtMongo( +fun com.mongodb.kotlin.client.coroutine.MongoCollection.asKtMongoLegacy( nameStrategy: PropertyNameStrategy = PropertyNameStrategy.Default, documentType: KType, ): JvmMongoCollection = @@ -439,10 +439,10 @@ fun com.mongodb.kotlin.client.coroutine.MongoCollection com.mongodb.kotlin.client.coroutine.MongoCollection.asKtMongo( +inline fun com.mongodb.kotlin.client.coroutine.MongoCollection.asKtMongoLegacy( nameStrategy: PropertyNameStrategy = PropertyNameStrategy.Default, ): JvmMongoCollection = - asKtMongo(nameStrategy, typeOf()) + asKtMongoLegacy(nameStrategy, typeOf()) @LowLevelApi private fun com.mongodb.kotlin.client.coroutine.MongoCollection.withWriteConcern(option: WithWriteConcern): com.mongodb.kotlin.client.coroutine.MongoCollection { diff --git a/driver-coroutines/src/jvmMain/kotlin/JvmMongoIterable.kt b/driver-coroutines/src/jvmMain/kotlin/JvmMongoIterable.kt index 7d1001ba..bc222436 100644 --- a/driver-coroutines/src/jvmMain/kotlin/JvmMongoIterable.kt +++ b/driver-coroutines/src/jvmMain/kotlin/JvmMongoIterable.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024-2025, OpenSavvy and contributors. + * Copyright (c) 2024-2026, OpenSavvy and contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,7 +27,7 @@ import opensavvy.ktmongo.dsl.LowLevelApi * * To access the inner iterable, see [asKotlinMongoIterable]. * - * To convert an existing MongoDB iterable into an instance of this class, see [asKtMongo]. + * To convert an existing MongoDB iterable into an instance of this class, see [asKtMongoLegacy]. */ class JvmMongoIterable internal constructor( private val inner: com.mongodb.kotlin.client.coroutine.FindFlow, @@ -64,5 +64,5 @@ class JvmMongoIterable internal constructor( * Converts a [MongoDB FindFlow][com.mongodb.kotlin.client.coroutine.FindFlow] into a * [KtMongo MongoIterable][JvmMongoIterable]. */ -fun com.mongodb.kotlin.client.coroutine.FindFlow.asKtMongo(): JvmMongoIterable = +fun com.mongodb.kotlin.client.coroutine.FindFlow.asKtMongoLegacy(): JvmMongoIterable = JvmMongoIterable(this) diff --git a/test/src/jvmMain/kotlin/TestDatabase.jvm.kt b/test/src/jvmMain/kotlin/TestDatabase.jvm.kt index 02020458..690e9a6e 100644 --- a/test/src/jvmMain/kotlin/TestDatabase.jvm.kt +++ b/test/src/jvmMain/kotlin/TestDatabase.jvm.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024-2025, OpenSavvy and contributors. + * Copyright (c) 2024-2026, OpenSavvy and contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ import com.mongodb.MongoTimeoutException import com.mongodb.kotlin.client.coroutine.MongoClient import kotlinx.coroutines.CoroutineName import opensavvy.ktmongo.coroutines.MongoCollection -import opensavvy.ktmongo.coroutines.asKtMongo +import opensavvy.ktmongo.coroutines.asKtMongoLegacy import opensavvy.prepared.suite.PreparedProvider import opensavvy.prepared.suite.prepared import opensavvy.prepared.suite.shared @@ -40,5 +40,5 @@ internal val database by shared(CoroutineName("mongodb-establish-connection")) { actual inline fun testCollectionExact(name: String): PreparedProvider> = prepared(CoroutineName("mongodb-create-collection-$name")) { val collection = database().getCollection(name) - collection.asKtMongo() + collection.asKtMongoLegacy() } -- 2.51.2