From 2191ab3bba104de28d0d87fa0125ec6ee0548d2c Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 13 Sep 2018 21:18:02 +0200 Subject: [PATCH] DATAMONGO-2086 - Fix Fluent API Kotlin extension generics to allow projections. We now fixed Kotlin extension generics to properly use projections by ignoring the source type of the Fluent API object. Previously, the source and target type were linked which prevented the use of a different result type. Original Pull Request: #609 --- .../core/ExecutableFindOperationExtensions.kt | 7 +++---- .../core/ReactiveFindOperationExtensions.kt | 6 +++--- .../ExecutableFindOperationExtensionsTests.kt | 20 +++++++++---------- .../ReactiveFindOperationExtensionsTests.kt | 20 +++++++++---------- 4 files changed, 26 insertions(+), 27 deletions(-) diff --git a/spring-data-mongodb/src/main/kotlin/org/springframework/data/mongodb/core/ExecutableFindOperationExtensions.kt b/spring-data-mongodb/src/main/kotlin/org/springframework/data/mongodb/core/ExecutableFindOperationExtensions.kt index 83585111f..da9bec417 100644 --- a/spring-data-mongodb/src/main/kotlin/org/springframework/data/mongodb/core/ExecutableFindOperationExtensions.kt +++ b/spring-data-mongodb/src/main/kotlin/org/springframework/data/mongodb/core/ExecutableFindOperationExtensions.kt @@ -1,5 +1,5 @@ /* - * Copyright 2017 the original author or authors. + * Copyright 2017-2018 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. @@ -37,7 +37,6 @@ fun ExecutableFindOperation.query(entityClass: KClass): ExecutableF inline fun ExecutableFindOperation.query(): ExecutableFindOperation.ExecutableFind = query(T::class.java) - /** * Extension for [ExecutableFindOperation.FindWithProjection. as] providing a [KClass] based variant. * @@ -45,7 +44,7 @@ inline fun ExecutableFindOperation.query(): ExecutableFindOper * @author Mark Paluch * @since 2.0 */ -fun ExecutableFindOperation.FindWithProjection.asType(resultType: KClass): ExecutableFindOperation.FindWithQuery = +fun ExecutableFindOperation.FindWithProjection<*>.asType(resultType: KClass): ExecutableFindOperation.FindWithQuery = `as`(resultType.java) /** @@ -55,7 +54,7 @@ fun ExecutableFindOperation.FindWithProjection.asType(resultType: K * @author Mark Paluch * @since 2.0 */ -inline fun ExecutableFindOperation.FindWithProjection.asType(): ExecutableFindOperation.FindWithQuery = +inline fun ExecutableFindOperation.FindWithProjection<*>.asType(): ExecutableFindOperation.FindWithQuery = `as`(T::class.java) /** diff --git a/spring-data-mongodb/src/main/kotlin/org/springframework/data/mongodb/core/ReactiveFindOperationExtensions.kt b/spring-data-mongodb/src/main/kotlin/org/springframework/data/mongodb/core/ReactiveFindOperationExtensions.kt index 37531f4ae..815d7efa5 100644 --- a/spring-data-mongodb/src/main/kotlin/org/springframework/data/mongodb/core/ReactiveFindOperationExtensions.kt +++ b/spring-data-mongodb/src/main/kotlin/org/springframework/data/mongodb/core/ReactiveFindOperationExtensions.kt @@ -1,5 +1,5 @@ /* - * Copyright 2017 the original author or authors. + * Copyright 2017-2018 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. @@ -41,7 +41,7 @@ inline fun ReactiveFindOperation.query(): ReactiveFindOperatio * @author Mark Paluch * @since 2.0 */ -fun ReactiveFindOperation.FindWithProjection.asType(resultType: KClass): ReactiveFindOperation.FindWithQuery = +fun ReactiveFindOperation.FindWithProjection<*>.asType(resultType: KClass): ReactiveFindOperation.FindWithQuery = `as`(resultType.java) /** @@ -50,7 +50,7 @@ fun ReactiveFindOperation.FindWithProjection.asType(resultType: KCl * @author Mark Paluch * @since 2.0 */ -inline fun ReactiveFindOperation.FindWithProjection.asType(): ReactiveFindOperation.FindWithQuery = +inline fun ReactiveFindOperation.FindWithProjection<*>.asType(): ReactiveFindOperation.FindWithQuery = `as`(T::class.java) /** diff --git a/spring-data-mongodb/src/test/kotlin/org/springframework/data/mongodb/core/ExecutableFindOperationExtensionsTests.kt b/spring-data-mongodb/src/test/kotlin/org/springframework/data/mongodb/core/ExecutableFindOperationExtensionsTests.kt index 4f8a60d34..40edc7029 100644 --- a/spring-data-mongodb/src/test/kotlin/org/springframework/data/mongodb/core/ExecutableFindOperationExtensionsTests.kt +++ b/spring-data-mongodb/src/test/kotlin/org/springframework/data/mongodb/core/ExecutableFindOperationExtensionsTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2017 the original author or authors. + * Copyright 2017-2018 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. @@ -53,24 +53,24 @@ class ExecutableFindOperationExtensionsTests { verify(operation).query(First::class.java) } - @Test // DATAMONGO-1689 + @Test // DATAMONGO-1689, DATAMONGO-2086 fun `ExecutableFindOperation#FindOperationWithProjection#asType(KClass) extension should call its Java counterpart`() { - operationWithProjection.asType(First::class) - verify(operationWithProjection).`as`(First::class.java) + operationWithProjection.asType(User::class) + verify(operationWithProjection).`as`(User::class.java) } - @Test // DATAMONGO-1689 + @Test // DATAMONGO-1689, DATAMONGO-2086 fun `ExecutableFindOperation#FindOperationWithProjection#asType() with reified type parameter extension should call its Java counterpart`() { - operationWithProjection.asType() - verify(operationWithProjection).`as`(First::class.java) + operationWithProjection.asType() + verify(operationWithProjection).`as`(User::class.java) } - @Test // DATAMONGO-1761 + @Test // DATAMONGO-1761, DATAMONGO-2086 fun `ExecutableFindOperation#DistinctWithProjection#asType(KClass) extension should call its Java counterpart`() { - distinctWithProjection.asType(First::class) - verify(distinctWithProjection).`as`(First::class.java) + distinctWithProjection.asType(User::class) + verify(distinctWithProjection).`as`(User::class.java) } } diff --git a/spring-data-mongodb/src/test/kotlin/org/springframework/data/mongodb/core/ReactiveFindOperationExtensionsTests.kt b/spring-data-mongodb/src/test/kotlin/org/springframework/data/mongodb/core/ReactiveFindOperationExtensionsTests.kt index 7e0ee6c97..22cdd36c8 100644 --- a/spring-data-mongodb/src/test/kotlin/org/springframework/data/mongodb/core/ReactiveFindOperationExtensionsTests.kt +++ b/spring-data-mongodb/src/test/kotlin/org/springframework/data/mongodb/core/ReactiveFindOperationExtensionsTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2017 the original author or authors. + * Copyright 2017-2018 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. @@ -52,24 +52,24 @@ class ReactiveFindOperationExtensionsTests { verify(operation).query(First::class.java) } - @Test // DATAMONGO-1719 + @Test // DATAMONGO-1719, DATAMONGO-2086 fun `ReactiveFind#FindOperatorWithProjection#asType(KClass) extension should call its Java counterpart`() { - operationWithProjection.asType(First::class) - verify(operationWithProjection).`as`(First::class.java) + operationWithProjection.asType(User::class) + verify(operationWithProjection).`as`(User::class.java) } - @Test // DATAMONGO-1719 + @Test // DATAMONGO-1719, DATAMONGO-2086 fun `ReactiveFind#FindOperatorWithProjection#asType() with reified type parameter extension should call its Java counterpart`() { - operationWithProjection.asType() - verify(operationWithProjection).`as`(First::class.java) + operationWithProjection.asType() + verify(operationWithProjection).`as`(User::class.java) } - @Test // DATAMONGO-1761 + @Test // DATAMONGO-1761, DATAMONGO-2086 fun `ReactiveFind#DistinctWithProjection#asType(KClass) extension should call its Java counterpart`() { - distinctWithProjection.asType(First::class) - verify(distinctWithProjection).`as`(First::class.java) + distinctWithProjection.asType(User::class) + verify(distinctWithProjection).`as`(User::class.java) } }