diff --git a/spring-data-mongodb/src/main/kotlin/org/springframework/data/mongodb/core/BulkOperationsExtensions.kt b/spring-data-mongodb/src/main/kotlin/org/springframework/data/mongodb/core/BulkOperationsExtensions.kt new file mode 100644 index 0000000000..2ee018b59d --- /dev/null +++ b/spring-data-mongodb/src/main/kotlin/org/springframework/data/mongodb/core/BulkOperationsExtensions.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2017-2025 the original author or authors. + * + * 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 + * + * https://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. + */ +package org.springframework.data.mongodb.core + +import org.springframework.data.mongodb.core.query.Query +import org.springframework.data.mongodb.core.query.Update +import org.springframework.data.mongodb.core.query.UpdateDefinition +import org.springframework.data.util.Pair.of + +/** + * Extension for [BulkOperations.updateMulti] that converts a [kotlin.Pair] to [org.springframework.data.util.Pair]. + * + * @author 2tsumo-hitori + */ +fun BulkOperations.updateMulti(kotlinPairs: List>): BulkOperations = + updateMulti(kotlinPairs.toSpringPairs()) + +/** + * Extension for [BulkOperations.upsert] that converts a [kotlin.Pair] to [org.springframework.data.util.Pair]. + * + * @author 2tsumo-hitori + */ +fun BulkOperations.upsert(kotlinPairs: List>) : BulkOperations = + upsert(kotlinPairs.toSpringPairs()) + +/** + * Extension for [BulkOperations.updateOne] that converts a [kotlin.Pair] to [org.springframework.data.util.Pair]. + * + * @author 2tsumo-hitori + */ +fun BulkOperations.updateOne(kotlinPairs: List>): BulkOperations = + updateOne(kotlinPairs.toSpringPairs()) + +private fun List>.toSpringPairs(): List> { + + return map { (first, second) -> of(first, second) } +} \ No newline at end of file diff --git a/spring-data-mongodb/src/test/kotlin/org/springframework/data/mongodb/core/BulkOperationExtensionsTests.kt b/spring-data-mongodb/src/test/kotlin/org/springframework/data/mongodb/core/BulkOperationExtensionsTests.kt new file mode 100644 index 0000000000..3e48685e73 --- /dev/null +++ b/spring-data-mongodb/src/test/kotlin/org/springframework/data/mongodb/core/BulkOperationExtensionsTests.kt @@ -0,0 +1,74 @@ +/* + * Copyright 2017-2025 the original author or authors. + * + * 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 + * + * https://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. + */ +package org.springframework.data.mongodb.core + +import io.mockk.mockk +import io.mockk.verify +import org.junit.Test +import org.springframework.data.mongodb.core.query.Criteria +import org.springframework.data.mongodb.core.query.Query +import org.springframework.data.mongodb.core.query.Update +import org.springframework.data.mongodb.core.query.UpdateDefinition +import org.springframework.data.util.Pair.of + +/** + * @author 2tsumo-hitori + */ +class BulkOperationExtensionsTests { + + private val bulkOperation = mockk(relaxed = true) + + @Test // GH-4911 + fun `BulkOperation#updateMulti#updates() using kotlin#Pair should call its Java counterpart`() { + val list : MutableList> = mutableListOf() + list.add(where("value", "v2") to set("value", "v3")) + + bulkOperation.updateMulti(list) + + val expected = list.map { (query, update) -> of(query, update) } + verify { bulkOperation.updateMulti(expected) } + } + + @Test // GH-4911 + fun `BulkOperation#upsert#updates() using kotlin#Pair should call its Java counterpart`() { + val list : MutableList> = mutableListOf() + list.add(where("value", "v2") to set("value", "v3")) + + bulkOperation.upsert(list) + + val expected = list.map { (query, update) -> of(query, update) } + verify { bulkOperation.upsert(expected) } + } + + @Test // GH-4911 + fun `BulkOperation#updateOne#updates() using kotlin#Pair should call its Java counterpart`() { + val list : MutableList> = mutableListOf() + list.add(where("value", "v2") to set("value", "v3")) + + bulkOperation.updateOne(list) + + val expected = list.map { (query, update) -> of(query, update) } + verify { bulkOperation.updateOne(expected) } + } + + private fun where(field: String, value: String): Query { + return Query().addCriteria(Criteria.where(field).`is`(value)) + } + + private fun set(field: String, value: String): Update { + return Update().set(field, value) + } +} \ No newline at end of file