From a92970236c29a3c9e8ff1dba48742fb5e0d37e6a Mon Sep 17 00:00:00 2001 From: gsrinivas10 <44026152+gsrinivas10@users.noreply.github.com> Date: Sun, 22 Mar 2020 12:59:32 +0530 Subject: [PATCH] DATAES-763 - Allow map properties in entity with null values. Original PR: #405 --- .../MappingElasticsearchConverter.java | 11 +++- ...appingElasticsearchConverterUnitTests.java | 55 +++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java b/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java index 28d74c2f6..0d42274da 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java @@ -354,6 +354,11 @@ public class MappingElasticsearchConverter Collection target = createCollectionForValue(targetType, source.size()); for (Object value : source) { + + if(value == null) { + return null; + } + if (isSimpleType(value)) { target.add( @@ -386,8 +391,10 @@ public class MappingElasticsearchConverter Map target = new LinkedHashMap<>(); for (Entry entry : source.entrySet()) { - - if (isSimpleType(entry.getValue())) { + + if(entry.getValue() == null) { + target.put(entry.getKey(),null); + } else if (isSimpleType(entry.getValue())) { target.put(entry.getKey(), readSimpleValue(entry.getValue(), targetType.isMap() ? targetType.getComponentType() : targetType)); } else { diff --git a/src/test/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverterUnitTests.java b/src/test/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverterUnitTests.java index 35a27b6a4..b3bb07cc1 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverterUnitTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverterUnitTests.java @@ -98,6 +98,7 @@ public class MappingElasticsearchConverterUnitTests { Document rifleAsMap; Document shotGunAsMap; Document bigBunsCafeAsMap; + Document notificationAsMap; @BeforeEach public void init() { @@ -193,6 +194,17 @@ public class MappingElasticsearchConverterUnitTests { shotGunAsMap = Document.create(); shotGunAsMap.put("model", "Ithaca 37 Pump Shotgun"); shotGunAsMap.put("_class", ShotGun.class.getName()); + + notificationAsMap = Document.create(); + notificationAsMap.put("id",1L); + notificationAsMap.put("fromEmail","from@email.com"); + notificationAsMap.put("toEmail","to@email.com"); + Map data = new HashMap<>(); + data.put("documentType","abc"); + data.put("content",null); + notificationAsMap.put("params",data); + notificationAsMap.put("_class", + "org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverterUnitTests$Notification"); } @Test @@ -615,6 +627,40 @@ public class MappingElasticsearchConverterUnitTests { assertThat(person.getBirthDate()).isEqualTo(LocalDate.of(2000, 8, 22)); assertThat(person.getGender()).isEqualTo(Gender.MAN); } + + @Test //DATAES-763 + void writeEntityWithMapDataType() { + + Notification notification = new Notification(); + notification.fromEmail="from@email.com"; + notification.toEmail="to@email.com"; + Map data = new HashMap<>(); + data.put("documentType","abc"); + data.put("content",null); + notification.params= data; + notification.id= 1L; + + Document document = Document.create(); + mappingElasticsearchConverter.write(notification,document); + assertThat(document).isEqualTo(notificationAsMap); + } + + @Test //DATAES-763 + void readEntityWithMapDataType() { + + Document document = Document.create(); + document.put("id",1L); + document.put("fromEmail","from@email.com"); + document.put("toEmail","to@email.com"); + Map data = new HashMap<>(); + data.put("documentType","abc"); + data.put("content",null); + document.put("params",data); + + Notification notification = mappingElasticsearchConverter.read(Notification.class,document); + assertThat(notification.params.get("documentType")).isEqualTo("abc"); + assertThat(notification.params.get("content")).isNull(); + } private String pointTemplate(String name, Point point) { return String.format(Locale.ENGLISH, "\"%s\":{\"lat\":%.1f,\"lon\":%.1f}", name, point.getX(), point.getY()); @@ -748,6 +794,15 @@ public class MappingElasticsearchConverterUnitTests { List objectList; Map objectMap; } + + @Data + static class Notification { + + Long id; + String fromEmail; + String toEmail; + Map params; + } @WritingConverter static class ShotGunToMapConverter implements Converter> {