From 268ef6cccfb4a665be0469e909b6bf100c481fd7 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Sun, 5 May 2019 17:49:30 +0200 Subject: [PATCH] DATACASS-652 - Fix enum materialization through ordinal values. We now consider the value type that is used to materialize an enum value. Previously, all values were converted to String and attempted to load through the name. --- .../convert/MappingCassandraConverter.java | 6 +++ .../MappingCassandraConverterUnitTests.java | 52 +++++++++---------- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java index b46242bb1..e9342e65a 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java @@ -917,6 +917,12 @@ public class MappingCassandraConverter extends AbstractCassandraConverter } if (Enum.class.isAssignableFrom(target)) { + + if (value instanceof Number) { + int ordinal = ((Number) value).intValue(); + return target.getEnumConstants()[ordinal]; + } + return Enum.valueOf((Class) target, value.toString()); } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverterUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverterUnitTests.java index 4356ff1ba..7cf743f95 100755 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverterUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverterUnitTests.java @@ -16,7 +16,6 @@ package org.springframework.data.cassandra.core.convert; import static org.assertj.core.api.Assertions.*; -import static org.junit.Assume.*; import static org.springframework.data.cassandra.core.mapping.BasicMapId.*; import static org.springframework.data.cassandra.test.util.RowMockUtil.*; @@ -33,14 +32,22 @@ import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.springframework.core.SpringVersion; -import org.springframework.core.convert.ConverterNotFoundException; + import org.springframework.data.annotation.Id; import org.springframework.data.annotation.ReadOnlyProperty; import org.springframework.data.annotation.Transient; @@ -118,36 +125,29 @@ public class MappingCassandraConverterUnitTests { assertThat(getValues(insert)).contains("MINT"); } - @Test // DATACASS-260 - public void insertEnumDoesNotMapToOrdinalBeforeSpring43() { - - assumeTrue(Version.parse(SpringVersion.getVersion()).isLessThan(VERSION_4_3)); - - expectedException.expect(ConverterNotFoundException.class); - - UnsupportedEnumToOrdinalMapping unsupportedEnumToOrdinalMapping = new UnsupportedEnumToOrdinalMapping(); - unsupportedEnumToOrdinalMapping.setAsOrdinal(Condition.MINT); - - Insert insert = QueryBuilder.insertInto("table"); - - mappingCassandraConverter.write(unsupportedEnumToOrdinalMapping, insert); - } - @Test // DATACASS-255 - public void insertEnumMapsToOrdinalWithSpring43AndHiger() { + public void insertEnumMapsToOrdinal() { - assumeTrue(Version.parse(SpringVersion.getVersion()).isGreaterThanOrEqualTo(VERSION_4_3)); - - UnsupportedEnumToOrdinalMapping unsupportedEnumToOrdinalMapping = new UnsupportedEnumToOrdinalMapping(); - unsupportedEnumToOrdinalMapping.setAsOrdinal(Condition.USED); + EnumToOrdinalMapping enumToOrdinalMapping = new EnumToOrdinalMapping(); + enumToOrdinalMapping.setAsOrdinal(Condition.USED); Insert insert = QueryBuilder.insertInto("table"); - mappingCassandraConverter.write(unsupportedEnumToOrdinalMapping, insert); + mappingCassandraConverter.write(enumToOrdinalMapping, insert); assertThat(getValues(insert)).contains((Object) Integer.valueOf(Condition.USED.ordinal())); } + @Test // DATACASS-255, DATACASS-652 + public void selectEnumMapsToOrdinal() { + + rowMock = RowMockUtil.newRowMock(column("asOrdinal", 1, DataType.cint())); + + EnumToOrdinalMapping loaded = mappingCassandraConverter.read(EnumToOrdinalMapping.class, rowMock); + + assertThat(loaded.getAsOrdinal()).isEqualTo(Condition.USED); + } + @Test // DATACASS-260 public void insertEnumAsPrimaryKeyShouldMapToString() { @@ -1064,7 +1064,7 @@ public class MappingCassandraConverterUnitTests { } @Table - public static class UnsupportedEnumToOrdinalMapping { + public static class EnumToOrdinalMapping { @PrimaryKey private String id;