diff --git a/driver-multiplatform/src/commonMain/kotlin/MultiplatformMongoCollectionImpl.kt b/driver-multiplatform/src/commonMain/kotlin/MultiplatformMongoCollectionImpl.kt index 735f39db..2f2c4309 100644 --- a/driver-multiplatform/src/commonMain/kotlin/MultiplatformMongoCollectionImpl.kt +++ b/driver-multiplatform/src/commonMain/kotlin/MultiplatformMongoCollectionImpl.kt @@ -238,7 +238,8 @@ internal class MultiplatformMongoCollectionImpl( override fun find(): MultiplatformMongoIterable = MultiplatformMongoIterableFindImpl( collection = this, - operation = Find(context), + options = {}, + filter = {}, type = type, isDefault = true, ) @@ -246,10 +247,8 @@ internal class MultiplatformMongoCollectionImpl( override fun find(options: FindOptions.() -> Unit, filter: FilterQuery.() -> Unit): MultiplatformMongoIterable = MultiplatformMongoIterableFindImpl( collection = this, - operation = Find(context).apply { - this.options.options() - this.filter.filter() - }, + options = options, + filter = filter, type = type, isDefault = false, ) diff --git a/driver-multiplatform/src/commonMain/kotlin/MultiplatformMongoIterableImpl.kt b/driver-multiplatform/src/commonMain/kotlin/MultiplatformMongoIterableImpl.kt index 2920caaa..56aa862c 100644 --- a/driver-multiplatform/src/commonMain/kotlin/MultiplatformMongoIterableImpl.kt +++ b/driver-multiplatform/src/commonMain/kotlin/MultiplatformMongoIterableImpl.kt @@ -24,27 +24,46 @@ import opensavvy.ktmongo.dsl.BsonContext import opensavvy.ktmongo.dsl.LowLevelApi import opensavvy.ktmongo.dsl.aggregation.PipelineChainLink import opensavvy.ktmongo.dsl.command.Find +import opensavvy.ktmongo.dsl.command.FindOptions import opensavvy.ktmongo.dsl.options.CommentOption import opensavvy.ktmongo.dsl.options.MaxTimeOption import opensavvy.ktmongo.dsl.options.option +import opensavvy.ktmongo.dsl.query.FilterQuery import opensavvy.ktmongo.dsl.tree.AbstractBsonNode import opensavvy.ktmongo.multiplatform.wire.Message import kotlin.reflect.KType internal class MultiplatformMongoIterableFindImpl( private val collection: MultiplatformMongoCollection<*>, - private val operation: Find, + private val options: FindOptions.() -> Unit, + private val filter: FilterQuery.() -> Unit, private val type: KType, private val isDefault: Boolean, ) : MultiplatformMongoIterable { - override suspend fun first(): Document { - TODO() + @OptIn(LowLevelApi::class) + private val model by lazy(LazyThreadSafetyMode.NONE) { + Find(collection.context).apply { + this.options.options() + this.filter.filter() + } } - override suspend fun firstOrNull(): Document? { - TODO() - } + override suspend fun first(): Document = firstOrNull() + ?: throw NoSuchElementException("No element found") + + override suspend fun firstOrNull(): Document? = + MultiplatformMongoIterableFindImpl( + collection = collection, + options = { + options() + limit(1) + }, + filter = filter, + type = type, + isDefault = isDefault + ).asFlow() + .firstOrNull() @OptIn(LowLevelApi::class) override suspend fun forEach(action: suspend (Document) -> Unit) { @@ -53,7 +72,8 @@ internal class MultiplatformMongoIterableFindImpl( document { writeString("find", collection.name) writeString($$"$db", collection.database.name) - operation.writeTo(this) + + model.writeTo(this) } } ) @@ -88,8 +108,8 @@ internal class MultiplatformMongoIterableFindImpl( // TODO re-specify the batch size option - operation.options.option()?.writeTo(this) - operation.options.option()?.writeTo(this) + model.options.option()?.writeTo(this) + model.options.option()?.writeTo(this) } } ) @@ -105,7 +125,7 @@ internal class MultiplatformMongoIterableFindImpl( } override fun toString(): String = - "$collection.find(${if (isDefault) "{}" else operation.toString()})" + "$collection.find(${if (isDefault) "{}" else model.toString()})" } @LowLevelApi