Adopt CassandraParameters and CassandraParameter to reflect the actual parameter type when using generics.
Closes #1456
This commit is contained in:
@@ -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<CassandraParameters, Cassand
|
||||
private final @Nullable Integer queryOptionsIndex;
|
||||
|
||||
/**
|
||||
* Create a new {@link CassandraParameters} instance from the given {@link Method}
|
||||
* Create a new {@link CassandraParameters} instance from the given {@link Method}.
|
||||
*
|
||||
* @param method must not be {@literal null}.
|
||||
* @param parametersSource must not be {@literal null}.
|
||||
*/
|
||||
public CassandraParameters(Method method) {
|
||||
public CassandraParameters(ParametersSource parametersSource) {
|
||||
super(parametersSource,
|
||||
methodParameter -> 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<CassandraParameter> originals, @Nullable Integer queryOptionsIndex) {
|
||||
@@ -63,11 +66,6 @@ public class CassandraParameters extends Parameters<CassandraParameters, Cassand
|
||||
this.queryOptionsIndex = queryOptionsIndex;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected CassandraParameter createParameter(MethodParameter parameter) {
|
||||
return new CassandraParameter(parameter);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected CassandraParameters createFrom(List<CassandraParameter> parameters) {
|
||||
return new CassandraParameters(parameters, queryOptionsIndex);
|
||||
@@ -93,9 +91,9 @@ public class CassandraParameters extends Parameters<CassandraParameters, Cassand
|
||||
private final @Nullable CassandraType cassandraType;
|
||||
private final Class<?> parameterType;
|
||||
|
||||
CassandraParameter(MethodParameter parameter) {
|
||||
CassandraParameter(MethodParameter parameter, TypeInformation<?> domainType) {
|
||||
|
||||
super(parameter);
|
||||
super(parameter, domainType);
|
||||
|
||||
AnnotatedParameter annotatedParameter = new AnnotatedParameter(parameter);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, String> {
|
||||
|
||||
Person findByFirstname(String firstname);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user