From 3a895588c8a68cd2ccd9e5dd70e30b16d4eabebe 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. --- .../core/ExecutableFindOperationExtensions.kt | 17 +++++++---------- .../core/ReactiveFindOperationExtensions.kt | 6 +++--- .../ExecutableFindOperationExtensionsTests.kt | 15 +++++++-------- .../ReactiveFindOperationExtensionsTests.kt | 14 +++++++------- 4 files changed, 24 insertions(+), 28 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 f51621f5d..4788ccaac 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. @@ -25,7 +25,7 @@ import kotlin.reflect.KClass * @since 2.0 */ fun ExecutableFindOperation.query(entityClass: KClass): ExecutableFindOperation.ExecutableFind = - query(entityClass.java) + query(entityClass.java) /** * Extension for [ExecutableFindOperation.query] leveraging reified type parameters. @@ -35,8 +35,7 @@ fun ExecutableFindOperation.query(entityClass: KClass): ExecutableF * @since 2.0 */ inline fun ExecutableFindOperation.query(): ExecutableFindOperation.ExecutableFind = - query(T::class.java) - + query(T::class.java) /** * Extension for [ExecutableFindOperation.FindWithProjection. as] providing a [KClass] based variant. @@ -45,8 +44,8 @@ inline fun ExecutableFindOperation.query(): ExecutableFindOper * @author Mark Paluch * @since 2.0 */ -fun ExecutableFindOperation.FindWithProjection.asType(resultType: KClass): ExecutableFindOperation.FindWithQuery = - `as`(resultType.java) +fun ExecutableFindOperation.FindWithProjection<*>.asType(resultType: KClass): ExecutableFindOperation.FindWithQuery = + `as`(resultType.java) /** * Extension for [ExecutableFindOperation.FindWithProjection. as] leveraging reified type parameters. @@ -55,7 +54,5 @@ fun ExecutableFindOperation.FindWithProjection.asType(resultType: K * @author Mark Paluch * @since 2.0 */ -inline fun ExecutableFindOperation.FindWithProjection.asType(): ExecutableFindOperation.FindWithQuery = - `as`(T::class.java) - - +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 354bae8e5..d12218be6 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 7d61ee20b..0fd94a8c2 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. @@ -50,18 +50,17 @@ 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) } - } 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 fda680cb7..e9fa94b1c 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. @@ -49,17 +49,17 @@ 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) } }