From f9f1d2e37586e8fbfc402b6da467b6e4624fadca Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Fri, 8 Dec 2023 11:33:56 +0100 Subject: [PATCH] Adopt `CassandraParameters` and `CassandraParameter` to reflect the actual parameter type when using generics. Closes #1456 --- .../repository/query/CassandraParameters.java | 24 ++++++++--------- .../query/CassandraQueryMethod.java | 6 +++-- .../QueryDerivationIntegrationTests.java | 3 ++- .../query/CassandraParametersUnitTests.java | 26 ++++++++++--------- 4 files changed, 31 insertions(+), 28 deletions(-) diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/CassandraParameters.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/CassandraParameters.java index 202851762..58ec81258 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/CassandraParameters.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/CassandraParameters.java @@ -29,9 +29,11 @@ import org.springframework.data.cassandra.core.mapping.CassandraType; import org.springframework.data.cassandra.repository.query.CassandraParameters.CassandraParameter; import org.springframework.data.repository.query.Parameter; import org.springframework.data.repository.query.Parameters; +import org.springframework.data.repository.query.ParametersSource; import org.springframework.data.repository.util.QueryExecutionConverters; import org.springframework.data.repository.util.ReactiveWrapperConverters; import org.springframework.data.repository.util.ReactiveWrappers; +import org.springframework.data.util.TypeInformation; import org.springframework.lang.Nullable; /** @@ -45,15 +47,16 @@ public class CassandraParameters extends Parameters new CassandraParameter(methodParameter, parametersSource.getDomainTypeInformation())); - super(method); - - this.queryOptionsIndex = Arrays.asList(method.getParameterTypes()).indexOf(QueryOptions.class); + this.queryOptionsIndex = Arrays.asList(parametersSource.getMethod().getParameterTypes()) + .indexOf(QueryOptions.class); } private CassandraParameters(List originals, @Nullable Integer queryOptionsIndex) { @@ -63,11 +66,6 @@ public class CassandraParameters extends Parameters parameters) { return new CassandraParameters(parameters, queryOptionsIndex); @@ -93,9 +91,9 @@ public class CassandraParameters extends Parameters parameterType; - CassandraParameter(MethodParameter parameter) { + CassandraParameter(MethodParameter parameter, TypeInformation domainType) { - super(parameter); + super(parameter, domainType); AnnotatedParameter annotatedParameter = new AnnotatedParameter(parameter); diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/CassandraQueryMethod.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/CassandraQueryMethod.java index 48b50069b..9e1ff270c 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/CassandraQueryMethod.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/CassandraQueryMethod.java @@ -29,6 +29,8 @@ import org.springframework.data.cassandra.repository.Query.Idempotency; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.projection.ProjectionFactory; import org.springframework.data.repository.core.RepositoryMetadata; +import org.springframework.data.repository.query.Parameters; +import org.springframework.data.repository.query.ParametersSource; import org.springframework.data.repository.query.QueryMethod; import org.springframework.data.util.TypeInformation; import org.springframework.lang.Nullable; @@ -128,8 +130,8 @@ public class CassandraQueryMethod extends QueryMethod { } @Override - protected CassandraParameters createParameters(Method method) { - return new CassandraParameters(method); + protected Parameters createParameters(ParametersSource parametersSource) { + return new CassandraParameters(parametersSource); } /** diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/QueryDerivationIntegrationTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/QueryDerivationIntegrationTests.java index d0658fa68..6292b2f76 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/QueryDerivationIntegrationTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/QueryDerivationIntegrationTests.java @@ -80,7 +80,8 @@ class QueryDerivationIntegrationTests extends AbstractSpringDataEmbeddedCassandr @Configuration @EnableCassandraRepositories(considerNestedRepositories = true, - includeFilters = @Filter(pattern = ".*PersonRepository", type = FilterType.REGEX)) + includeFilters = @Filter(classes = { PersonRepository.class, EmbeddedPersonRepository.class }, + type = FilterType.ASSIGNABLE_TYPE)) public static class Config extends IntegrationTestConfig { @Override diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/query/CassandraParametersUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/query/CassandraParametersUnitTests.java index 4e9bcd5f2..32985152a 100755 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/query/CassandraParametersUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/query/CassandraParametersUnitTests.java @@ -28,6 +28,9 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.data.cassandra.core.mapping.CassandraType; import org.springframework.data.cassandra.domain.Person; +import org.springframework.data.repository.Repository; +import org.springframework.data.repository.core.support.DefaultRepositoryMetadata; +import org.springframework.data.repository.query.ParametersSource; /** * Unit tests for {@link CassandraParameters}. @@ -43,7 +46,8 @@ class CassandraParametersUnitTests { void shouldReturnUnknownDataTypeForSimpleType() throws Exception { Method method = PersonRepository.class.getMethod("findByFirstname", String.class); - CassandraParameters cassandraParameters = new CassandraParameters(method); + CassandraParameters cassandraParameters = new CassandraParameters( + ParametersSource.of(method)); assertThat(cassandraParameters.getParameter(0).getCassandraType()).isNull(); } @@ -52,17 +56,17 @@ class CassandraParametersUnitTests { void shouldReturnDataTypeForAnnotatedSimpleType() throws Exception { Method method = PersonRepository.class.getMethod("findByFirstTime", String.class); - CassandraParameters cassandraParameters = new CassandraParameters(method); + CassandraParameters cassandraParameters = new CassandraParameters( + ParametersSource.of(method)); - assertThat(cassandraParameters.getParameter(0).getCassandraType().type()) - .isEqualTo(Name.TIME); + assertThat(cassandraParameters.getParameter(0).getCassandraType().type()).isEqualTo(Name.TIME); } @Test // DATACASS-296 void shouldReturnNoTypeForComplexType() throws Exception { Method method = PersonRepository.class.getMethod("findByObject", Object.class); - CassandraParameters cassandraParameters = new CassandraParameters(method); + CassandraParameters cassandraParameters = new CassandraParameters(ParametersSource.of(method)); assertThat(cassandraParameters.getParameter(0).getCassandraType()).isNull(); } @@ -71,23 +75,21 @@ class CassandraParametersUnitTests { void shouldReturnTypeForAnnotatedType() throws Exception { Method method = PersonRepository.class.getMethod("findByAnnotatedObject", Object.class); - CassandraParameters cassandraParameters = new CassandraParameters(method); + CassandraParameters cassandraParameters = new CassandraParameters(ParametersSource.of(method)); - assertThat(cassandraParameters.getParameter(0).getCassandraType().type()) - .isEqualTo(Name.TIME); + assertThat(cassandraParameters.getParameter(0).getCassandraType().type()).isEqualTo(Name.TIME); } @Test // DATACASS-296 void shouldReturnTypeForComposedAnnotationType() throws Exception { Method method = PersonRepository.class.getMethod("findByComposedAnnotationObject", Object.class); - CassandraParameters cassandraParameters = new CassandraParameters(method); + CassandraParameters cassandraParameters = new CassandraParameters(ParametersSource.of(method)); - assertThat(cassandraParameters.getParameter(0).getCassandraType().type()) - .isEqualTo(Name.BOOLEAN); + assertThat(cassandraParameters.getParameter(0).getCassandraType().type()).isEqualTo(Name.BOOLEAN); } - interface PersonRepository { + interface PersonRepository extends Repository { Person findByFirstname(String firstname);