Skip to content

Commit a287882

Browse files
committed
Adopt CassandraParameters and CassandraParameter to reflect the actual parameter type when using generics.
Closes #1456
1 parent 5d041b0 commit a287882

File tree

4 files changed

+31
-28
lines changed

4 files changed

+31
-28
lines changed

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/CassandraParameters.java

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@
2929
import org.springframework.data.cassandra.repository.query.CassandraParameters.CassandraParameter;
3030
import org.springframework.data.repository.query.Parameter;
3131
import org.springframework.data.repository.query.Parameters;
32+
import org.springframework.data.repository.query.ParametersSource;
3233
import org.springframework.data.repository.util.QueryExecutionConverters;
3334
import org.springframework.data.repository.util.ReactiveWrapperConverters;
3435
import org.springframework.data.repository.util.ReactiveWrappers;
36+
import org.springframework.data.util.TypeInformation;
3537
import org.springframework.lang.Nullable;
3638

3739
/**
@@ -45,15 +47,16 @@ public class CassandraParameters extends Parameters<CassandraParameters, Cassand
4547
private final @Nullable Integer queryOptionsIndex;
4648

4749
/**
48-
* Create a new {@link CassandraParameters} instance from the given {@link Method}
50+
* Create a new {@link CassandraParameters} instance from the given {@link Method}.
4951
*
50-
* @param method must not be {@literal null}.
52+
* @param parametersSource must not be {@literal null}.
5153
*/
52-
public CassandraParameters(Method method) {
54+
public CassandraParameters(ParametersSource parametersSource) {
55+
super(parametersSource,
56+
methodParameter -> new CassandraParameter(methodParameter, parametersSource.getDomainTypeInformation()));
5357

54-
super(method);
55-
56-
this.queryOptionsIndex = Arrays.asList(method.getParameterTypes()).indexOf(QueryOptions.class);
58+
this.queryOptionsIndex = Arrays.asList(parametersSource.getMethod().getParameterTypes())
59+
.indexOf(QueryOptions.class);
5760
}
5861

5962
private CassandraParameters(List<CassandraParameter> originals, @Nullable Integer queryOptionsIndex) {
@@ -63,11 +66,6 @@ private CassandraParameters(List<CassandraParameter> originals, @Nullable Intege
6366
this.queryOptionsIndex = queryOptionsIndex;
6467
}
6568

66-
@Override
67-
protected CassandraParameter createParameter(MethodParameter parameter) {
68-
return new CassandraParameter(parameter);
69-
}
70-
7169
@Override
7270
protected CassandraParameters createFrom(List<CassandraParameter> parameters) {
7371
return new CassandraParameters(parameters, queryOptionsIndex);
@@ -93,9 +91,9 @@ static class CassandraParameter extends Parameter {
9391
private final @Nullable CassandraType cassandraType;
9492
private final Class<?> parameterType;
9593

96-
CassandraParameter(MethodParameter parameter) {
94+
CassandraParameter(MethodParameter parameter, TypeInformation<?> domainType) {
9795

98-
super(parameter);
96+
super(parameter, domainType);
9997

10098
AnnotatedParameter annotatedParameter = new AnnotatedParameter(parameter);
10199

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/CassandraQueryMethod.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import org.springframework.data.mapping.context.MappingContext;
3030
import org.springframework.data.projection.ProjectionFactory;
3131
import org.springframework.data.repository.core.RepositoryMetadata;
32+
import org.springframework.data.repository.query.Parameters;
33+
import org.springframework.data.repository.query.ParametersSource;
3234
import org.springframework.data.repository.query.QueryMethod;
3335
import org.springframework.data.util.TypeInformation;
3436
import org.springframework.lang.Nullable;
@@ -128,8 +130,8 @@ public CassandraParameters getParameters() {
128130
}
129131

130132
@Override
131-
protected CassandraParameters createParameters(Method method) {
132-
return new CassandraParameters(method);
133+
protected Parameters<?, ?> createParameters(ParametersSource parametersSource) {
134+
return new CassandraParameters(parametersSource);
133135
}
134136

135137
/**

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/QueryDerivationIntegrationTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ class QueryDerivationIntegrationTests extends AbstractSpringDataEmbeddedCassandr
8080

8181
@Configuration
8282
@EnableCassandraRepositories(considerNestedRepositories = true,
83-
includeFilters = @Filter(pattern = ".*PersonRepository", type = FilterType.REGEX))
83+
includeFilters = @Filter(classes = { PersonRepository.class, EmbeddedPersonRepository.class },
84+
type = FilterType.ASSIGNABLE_TYPE))
8485
public static class Config extends IntegrationTestConfig {
8586

8687
@Override

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/query/CassandraParametersUnitTests.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
import org.mockito.junit.jupiter.MockitoExtension;
2929
import org.springframework.data.cassandra.core.mapping.CassandraType;
3030
import org.springframework.data.cassandra.domain.Person;
31+
import org.springframework.data.repository.Repository;
32+
import org.springframework.data.repository.core.support.DefaultRepositoryMetadata;
33+
import org.springframework.data.repository.query.ParametersSource;
3134

3235
/**
3336
* Unit tests for {@link CassandraParameters}.
@@ -43,7 +46,8 @@ class CassandraParametersUnitTests {
4346
void shouldReturnUnknownDataTypeForSimpleType() throws Exception {
4447

4548
Method method = PersonRepository.class.getMethod("findByFirstname", String.class);
46-
CassandraParameters cassandraParameters = new CassandraParameters(method);
49+
CassandraParameters cassandraParameters = new CassandraParameters(
50+
ParametersSource.of(method));
4751

4852
assertThat(cassandraParameters.getParameter(0).getCassandraType()).isNull();
4953
}
@@ -52,17 +56,17 @@ void shouldReturnUnknownDataTypeForSimpleType() throws Exception {
5256
void shouldReturnDataTypeForAnnotatedSimpleType() throws Exception {
5357

5458
Method method = PersonRepository.class.getMethod("findByFirstTime", String.class);
55-
CassandraParameters cassandraParameters = new CassandraParameters(method);
59+
CassandraParameters cassandraParameters = new CassandraParameters(
60+
ParametersSource.of(method));
5661

57-
assertThat(cassandraParameters.getParameter(0).getCassandraType().type())
58-
.isEqualTo(Name.TIME);
62+
assertThat(cassandraParameters.getParameter(0).getCassandraType().type()).isEqualTo(Name.TIME);
5963
}
6064

6165
@Test // DATACASS-296
6266
void shouldReturnNoTypeForComplexType() throws Exception {
6367

6468
Method method = PersonRepository.class.getMethod("findByObject", Object.class);
65-
CassandraParameters cassandraParameters = new CassandraParameters(method);
69+
CassandraParameters cassandraParameters = new CassandraParameters(ParametersSource.of(method));
6670

6771
assertThat(cassandraParameters.getParameter(0).getCassandraType()).isNull();
6872
}
@@ -71,23 +75,21 @@ void shouldReturnNoTypeForComplexType() throws Exception {
7175
void shouldReturnTypeForAnnotatedType() throws Exception {
7276

7377
Method method = PersonRepository.class.getMethod("findByAnnotatedObject", Object.class);
74-
CassandraParameters cassandraParameters = new CassandraParameters(method);
78+
CassandraParameters cassandraParameters = new CassandraParameters(ParametersSource.of(method));
7579

76-
assertThat(cassandraParameters.getParameter(0).getCassandraType().type())
77-
.isEqualTo(Name.TIME);
80+
assertThat(cassandraParameters.getParameter(0).getCassandraType().type()).isEqualTo(Name.TIME);
7881
}
7982

8083
@Test // DATACASS-296
8184
void shouldReturnTypeForComposedAnnotationType() throws Exception {
8285

8386
Method method = PersonRepository.class.getMethod("findByComposedAnnotationObject", Object.class);
84-
CassandraParameters cassandraParameters = new CassandraParameters(method);
87+
CassandraParameters cassandraParameters = new CassandraParameters(ParametersSource.of(method));
8588

86-
assertThat(cassandraParameters.getParameter(0).getCassandraType().type())
87-
.isEqualTo(Name.BOOLEAN);
89+
assertThat(cassandraParameters.getParameter(0).getCassandraType().type()).isEqualTo(Name.BOOLEAN);
8890
}
8991

90-
interface PersonRepository {
92+
interface PersonRepository extends Repository<Person, String> {
9193

9294
Person findByFirstname(String firstname);
9395

0 commit comments

Comments
 (0)