From 5b0e3f0c569fd716661f3da885fab37411ea97e7 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 23 Mar 2020 10:58:37 +0100 Subject: [PATCH] DATACASS-743 - Introduce ColumnTypeResolver. We now resolve column types by using ColumnTypeResolver that encapsulates type lookups that previously were spread across different areas of the converter. We consistently apply type resolution for singular properties and collection/Map-like properties. --- .../core/convert/CassandraColumnType.java | 54 ++ .../core/convert/CassandraConverter.java | 28 +- .../cassandra/core/convert/ColumnType.java | 258 +++++++++ .../core/convert/ColumnTypeResolver.java | 83 +++ .../convert/DefaultCassandraColumnType.java | 81 +++ .../core/convert/DefaultColumnType.java | 128 +++++ .../convert/DefaultColumnTypeResolver.java | 498 ++++++++++++++++++ .../convert/MappingCassandraConverter.java | 168 +++--- .../cassandra/core/convert/QueryMapper.java | 51 +- .../cassandra/core/convert/UpdateMapper.java | 16 +- .../core/mapping/CassandraMappingContext.java | 4 +- .../query/ConvertingParameterAccessor.java | 110 +--- .../convert/ColumnTypeResolverUnitTests.java | 219 ++++++++ .../MappingCassandraConverterUnitTests.java | 53 +- .../core/convert/QueryMapperUnitTests.java | 2 +- .../ConvertingParameterAccessorUnitTests.java | 16 - 16 files changed, 1525 insertions(+), 244 deletions(-) create mode 100644 spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraColumnType.java create mode 100644 spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/ColumnType.java create mode 100644 spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/ColumnTypeResolver.java create mode 100644 spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/DefaultCassandraColumnType.java create mode 100644 spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/DefaultColumnType.java create mode 100644 spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/DefaultColumnTypeResolver.java create mode 100644 spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/ColumnTypeResolverUnitTests.java diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraColumnType.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraColumnType.java new file mode 100644 index 000000000..b5688d2fe --- /dev/null +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraColumnType.java @@ -0,0 +1,54 @@ +/* + * Copyright 2020 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.cassandra.core.convert; + +import com.datastax.oss.driver.api.core.type.DataType; +import com.datastax.oss.driver.api.core.type.TupleType; +import com.datastax.oss.driver.api.core.type.UserDefinedType; + +/** + * Descriptor for a Cassandra column type exposing a {@link DataType}. + * + * @author Mark Paluch + * @since 3.0 + */ +public interface CassandraColumnType extends ColumnType { + + /** + * Returns the {@link DataType} associated with this column type. + * + * @return + */ + DataType getDataType(); + + /** + * Returns whether the associated {@link DataType} is a {@link TupleType}. + * + * @return + */ + default boolean isTupleType() { + return getDataType() instanceof TupleType; + } + + /** + * Returns whether the associated {@link DataType} is a {@link UserDefinedType}. + * + * @return + */ + default boolean isUserDefinedType() { + return getDataType() instanceof UserDefinedType; + } +} diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraConverter.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraConverter.java index daf6df034..30e037e22 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraConverter.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraConverter.java @@ -23,6 +23,7 @@ import org.springframework.data.convert.CustomConversions; import org.springframework.data.convert.EntityConverter; import org.springframework.data.util.TypeInformation; import org.springframework.lang.Nullable; +import org.springframework.util.Assert; /** * Central Cassandra specific converter interface from Object to Row. @@ -47,6 +48,15 @@ public interface CassandraConverter @Override CassandraMappingContext getMappingContext(); + /** + * Returns the {@link ColumnTypeResolver} to resolve {@link ColumnType} for properties, {@link TypeInformation}, and + * {@code values}. + * + * @return the {@link ColumnTypeResolver} + * @since 3.0 + */ + ColumnTypeResolver getColumnTypeResolver(); + /** * Returns the Id for an entity. It can return: *