From 74fe0924f35a03f12be65e0621c33830bb098ec1 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 26 Jul 2021 11:20:18 +0200 Subject: [PATCH] Properly consider frozen map creation. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now correctly consider the Frozen annotation when annotating a property to define a frozen> type. Previously we only considered frozen key and value components instead of the entire type. Closes #1148 --- .../data/cassandra/core/convert/ColumnType.java | 15 ++++++++++++++- .../core/convert/DefaultColumnTypeResolver.java | 2 +- .../core/convert/ColumnTypeResolverUnitTests.java | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/ColumnType.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/ColumnType.java index 60c86bf1e..abe87099c 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/ColumnType.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/ColumnType.java @@ -159,8 +159,21 @@ public interface ColumnType { * @return */ static CassandraColumnType mapOf(CassandraColumnType keyType, CassandraColumnType valueType) { + return ColumnType.mapOf(keyType, valueType, false); + } + + /** + * Creates a Map {@link CassandraColumnType} given its {@link CassandraColumnType key and value types}. + * + * @param keyType must not be {@literal null}. + * @param valueType must not be {@literal null}. + * @param frozen + * @return + * @since 3.2.4 + */ + static CassandraColumnType mapOf(CassandraColumnType keyType, CassandraColumnType valueType, boolean frozen) { return new DefaultCassandraColumnType(ClassTypeInformation.MAP, - () -> DataTypes.mapOf(keyType.getDataType(), valueType.getDataType()), keyType, valueType); + () -> DataTypes.mapOf(keyType.getDataType(), valueType.getDataType(), frozen), keyType, valueType); } /** diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/DefaultColumnTypeResolver.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/DefaultColumnTypeResolver.java index 2d8ecea16..0d5b78e2f 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/DefaultColumnTypeResolver.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/DefaultColumnTypeResolver.java @@ -410,7 +410,7 @@ class DefaultColumnTypeResolver implements ColumnTypeResolver { FrozenIndicator frozenValue = frozen.getFrozen(1); return ColumnType.mapOf(resolve(typeInformation.getRequiredComponentType(), frozenKey), - resolve(typeInformation.getRequiredMapValueType(), frozenValue)); + resolve(typeInformation.getRequiredMapValueType(), frozenValue), frozen.isFrozen()); } CassandraPersistentEntity persistentEntity = mappingContext.getPersistentEntity(typeInformation); diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/ColumnTypeResolverUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/ColumnTypeResolverUnitTests.java index 6606dca1d..8295cff1a 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/ColumnTypeResolverUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/ColumnTypeResolverUnitTests.java @@ -260,6 +260,18 @@ public class ColumnTypeResolverUnitTests { .describedAs("The element type should be frozen").isTrue(); } + @Test // GH-1148 + void frozenMapProperty() { + + BasicCassandraPersistentEntity entity = mappingContext.getRequiredPersistentEntity(Person.class); + + DataType dataType = resolver.resolve(entity.getRequiredPersistentProperty("frozenMap")).getDataType(); + + assertThat(dataType).isInstanceOf(MapType.class); + assertThat(((MapType) dataType).isFrozen()).isTrue(); + assertThat(dataType.asCql(true, false)).isEqualTo("frozen>"); + } + @Test // DATACASS-465 void mapPropertyWithFrozenAnnotationOnKey() { @@ -345,6 +357,8 @@ public class ColumnTypeResolverUnitTests { @Frozen Set frozenSet; Set<@Frozen MyUdt> frozenSetContent; + @Frozen Map frozenMap; + Map<@Frozen MyUdt, MyUdt> frozenMapKey; Map frozenMapValue;