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.
This commit is contained in:
@@ -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<Enum>) target, value.toString());
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user