From 9239c51dc723e11d95337a7210215ef263eba2e8 Mon Sep 17 00:00:00 2001 From: audghks1996 Date: Mon, 3 Mar 2025 19:49:39 +0900 Subject: [PATCH 1/2] Add extension functions for BulkOperations methods converting kotlin.Pair to Spring Pair class. Signed-off-by: audghks1996 --- .../mongodb/core/BulkOperationsExtensions.kt | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 spring-data-mongodb/src/main/kotlin/org/springframework/data/mongodb/core/BulkOperationsExtensions.kt 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 From 549b05db80188114a4cdf29fb372df99faf01737 Mon Sep 17 00:00:00 2001 From: audghks1996 Date: Mon, 3 Mar 2025 19:49:57 +0900 Subject: [PATCH 2/2] Add tests for BulkOperations extensions. Signed-off-by: audghks1996 --- .../core/BulkOperationExtensionsTests.kt | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 spring-data-mongodb/src/test/kotlin/org/springframework/data/mongodb/core/BulkOperationExtensionsTests.kt 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