This is an automated email from the ASF dual-hosted git repository.

jkevan pushed a commit to branch propertyTypeAutoMapping
in repository https://gitbox.apache.org/repos/asf/unomi.git

commit 8b47b108d9375fed3c5f8098c7b2616c49c38662
Author: Kevan <ke...@jahia.com>
AuthorDate: Fri Mar 24 16:09:14 2023 +0100

    UNOMI-709: avoid updating property type mapping in case a mapping already 
exists
---
 .../ElasticSearchPersistenceServiceImpl.java       | 38 +++++++++++++++++-----
 .../services/impl/profiles/ProfileServiceImpl.java |  4 ++-
 2 files changed, 32 insertions(+), 10 deletions(-)

diff --git 
a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
 
b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
index 4562dd5cc..2ad652387 100644
--- 
a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
+++ 
b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
@@ -1544,11 +1544,6 @@ public class ElasticSearchPersistenceServiceImpl 
implements PersistenceService,
 
     public void setPropertyMapping(final PropertyType property, final String 
itemType) {
         try {
-            Map<String, Object> propertyMapping = 
createPropertyMapping(property);
-            if (propertyMapping.isEmpty()) {
-                return;
-            }
-
             Map<String, Map<String, Object>> mappings = 
getPropertiesMapping(itemType);
             if (mappings == null) {
                 mappings = new HashMap<>();
@@ -1556,6 +1551,16 @@ public class ElasticSearchPersistenceServiceImpl 
implements PersistenceService,
             Map<String, Object> subMappings = 
mappings.computeIfAbsent("properties", k -> new HashMap<>());
             Map<String, Object> subSubMappings = (Map<String, Object>) 
subMappings.computeIfAbsent("properties", k -> new HashMap<>());
 
+            if (subSubMappings.containsKey(property.getItemId())) {
+                logger.warn("Mapping already exists for type " + itemType + " 
and property " + property.getItemId());
+                return;
+            }
+
+            Map<String, Object> propertyMapping = 
createPropertyMapping(property);
+            if (propertyMapping.isEmpty()) {
+                return;
+            }
+
             mergePropertiesMapping(subSubMappings, propertyMapping);
 
             Map<String, Object> mappingsWrapper = new HashMap<>();
@@ -1621,16 +1626,31 @@ public class ElasticSearchPersistenceServiceImpl 
implements PersistenceService,
                 return "date";
             case "string":
             case "id":
+            case "email": // TODO Consider supporting email mapping in ES, 
right now will be map to text to avoid warning in logs
                 return "text";
             default:
                 return null;
         }
     }
 
-    private void putMapping(final String source, final String indexName) 
throws IOException {
-        PutMappingRequest putMappingRequest = new PutMappingRequest(indexName);
-        putMappingRequest.source(source, XContentType.JSON);
-        client.indices().putMapping(putMappingRequest, RequestOptions.DEFAULT);
+    private boolean putMapping(final String source, final String indexName) 
throws IOException {
+        Boolean result = new InClassLoaderExecute<Boolean>(metricsService, 
this.getClass().getName() + ".putMapping", this.bundleContext, 
this.fatalIllegalStateErrors, throwExceptions) {
+            protected Boolean execute(Object... args) throws Exception {
+                try {
+                    PutMappingRequest putMappingRequest = new 
PutMappingRequest(indexName);
+                    putMappingRequest.source(source, XContentType.JSON);
+                    AcknowledgedResponse response = 
client.indices().putMapping(putMappingRequest, RequestOptions.DEFAULT);
+                    return response.isAcknowledged();
+                } catch (Exception e) {
+                    throw new Exception("Cannot create/update mapping", e);
+                }
+            }
+        }.catchingExecuteInClassLoader(true);
+        if (result == null) {
+            return false;
+        } else {
+            return result;
+        }
     }
 
     @Override
diff --git 
a/services/src/main/java/org/apache/unomi/services/impl/profiles/ProfileServiceImpl.java
 
b/services/src/main/java/org/apache/unomi/services/impl/profiles/ProfileServiceImpl.java
index 211e3e3de..a595ba892 100644
--- 
a/services/src/main/java/org/apache/unomi/services/impl/profiles/ProfileServiceImpl.java
+++ 
b/services/src/main/java/org/apache/unomi/services/impl/profiles/ProfileServiceImpl.java
@@ -475,13 +475,15 @@ public class ProfileServiceImpl implements 
ProfileService, SynchronousBundleList
         PropertyType previousProperty = 
persistenceService.load(property.getItemId(), PropertyType.class);
         boolean result = false;
         if (previousProperty == null) {
+            persistenceService.setPropertyMapping(property, Profile.ITEM_TYPE);
             result = persistenceService.save(property);
             propertyTypes = propertyTypes.with(property);
         } else if (merge(previousProperty, property)) {
+            persistenceService.setPropertyMapping(previousProperty, 
Profile.ITEM_TYPE);
             result = persistenceService.save(previousProperty);
             propertyTypes = propertyTypes.with(previousProperty);
         }
-        persistenceService.setPropertyMapping(property, Profile.ITEM_TYPE);
+
         return result;
     }
 

Reply via email to