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

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


The following commit(s) were added to refs/heads/master by this push:
     new cbe3849  when merging profiles properties flatten nested properties 
(#262)
cbe3849 is described below

commit cbe3849f5e23335d4acbac294d019a1bdc5b491d
Author: giladw <[email protected]>
AuthorDate: Wed Apr 21 18:18:17 2021 +0300

    when merging profiles properties flatten nested properties (#262)
---
 .../unomi/persistence/spi/PropertyHelper.java      | 28 ++++++++++++++++++++++
 .../services/impl/profiles/ProfileServiceImpl.java | 17 ++++++-------
 .../DefaultPropertyMergeStrategyExecutor.java      |  7 +++---
 3 files changed, 41 insertions(+), 11 deletions(-)

diff --git 
a/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PropertyHelper.java
 
b/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PropertyHelper.java
index 38a09e0..6315025 100644
--- 
a/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PropertyHelper.java
+++ 
b/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PropertyHelper.java
@@ -21,11 +21,13 @@ import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.beanutils.NestedNullException;
 import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.commons.beanutils.expression.DefaultResolver;
+import org.apache.unomi.api.Profile;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * Helper method for properties
@@ -194,5 +196,31 @@ public class PropertyHelper {
         }
     }
 
+    public static Map<String, Object> flatten(Map<String, Object> in) {
+        return in.entrySet().stream()
+                .filter(entry -> entry.getValue() != null)
+                .flatMap(entry -> flatten(entry).entrySet().stream())
+                .collect(Collectors.toMap(
+                        Map.Entry::getKey,
+                        Map.Entry::getValue));
+    }
+
+    private static Map<String, Object> flatten(Map.Entry<String, Object> in) {
+        // for other then Map objects return them
+        if (!Map.class.isInstance(in.getValue())) {
+            return Collections.singletonMap(in.getKey(), in.getValue());
+        }
+        // extract the key prefix for nested objects
+        String prefix = in.getKey();
+        Map<String, Object> values = (Map<String, Object>) in.getValue();
+        // create a new Map, with prefix added to each key
+        Map<String, Object> flattenMap = new HashMap<>();
+        values.keySet().forEach(key -> {
+            // use a dot as a joining char
+            flattenMap.put(prefix + "." + key, values.get(key));
+        });
+        // use recursion to flatten the structure deeper
+        return flatten(flattenMap);
+    }
 
 }
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 ec4ac84..38356cf 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
@@ -632,7 +632,8 @@ public class ProfileServiceImpl implements ProfileService, 
SynchronousBundleList
 
         Set<String> allProfileProperties = new LinkedHashSet<>();
         for (Profile profile : profilesToMerge) {
-            allProfileProperties.addAll(profile.getProperties().keySet());
+            final Set<String> flatNestedPropertiesKeys = 
PropertyHelper.flatten(profile.getProperties()).keySet();
+            allProfileProperties.addAll(flatNestedPropertiesKeys);
         }
 
         Collection<PropertyType> profilePropertyTypes = 
getTargetPropertyTypes("profiles");
@@ -701,12 +702,12 @@ public class ProfileServiceImpl implements 
ProfileService, SynchronousBundleList
         // we now have to merge the profile's consents
         for (Profile profile : profilesToMerge) {
             if (profile.getConsents() != null && profile.getConsents().size() 
> 0) {
-                for(String consentId : profile.getConsents().keySet()) {
-                    if(masterProfile.getConsents().containsKey(consentId)) {
-                        
if(masterProfile.getConsents().get(consentId).getRevokeDate().before(new 
Date())) {
+                for (String consentId : profile.getConsents().keySet()) {
+                    if (masterProfile.getConsents().containsKey(consentId)) {
+                        if 
(masterProfile.getConsents().get(consentId).getRevokeDate().before(new Date())) 
{
                             masterProfile.getConsents().remove(consentId);
                             masterProfileChanged = true;
-                        } else 
if(masterProfile.getConsents().get(consentId).getStatusDate().before(profile.getConsents().get(consentId).getStatusDate()))
 {
+                        } else if 
(masterProfile.getConsents().get(consentId).getStatusDate().before(profile.getConsents().get(consentId).getStatusDate()))
 {
                             masterProfile.getConsents().replace(consentId, 
profile.getConsents().get(consentId));
                             masterProfileChanged = true;
                         }
@@ -790,7 +791,7 @@ public class ProfileServiceImpl implements ProfileService, 
SynchronousBundleList
         profileCondition.setParameter("comparisonOperator", "equals");
         profileCondition.setParameter("propertyValue", profileId);
 
-        persistenceService.removeByQuery(profileCondition,Session.class);
+        persistenceService.removeByQuery(profileCondition, Session.class);
     }
 
     @Override
@@ -1061,8 +1062,8 @@ public class ProfileServiceImpl implements 
ProfileService, SynchronousBundleList
                         changed = true;
                     }
                 } else if (newEntry.getValue().getClass().isEnum()) {
-                        target.put(newEntry.getKey(), newEntry.getValue());
-                        changed = true;
+                    target.put(newEntry.getKey(), newEntry.getValue());
+                    changed = true;
                 } else {
                     if (target.get(newEntry.getKey()) != null) {
                         changed |= merge(target.get(newEntry.getKey()), 
newEntry.getValue());
diff --git 
a/services/src/main/java/org/apache/unomi/services/mergers/DefaultPropertyMergeStrategyExecutor.java
 
b/services/src/main/java/org/apache/unomi/services/mergers/DefaultPropertyMergeStrategyExecutor.java
index e77f7e3..257875c 100644
--- 
a/services/src/main/java/org/apache/unomi/services/mergers/DefaultPropertyMergeStrategyExecutor.java
+++ 
b/services/src/main/java/org/apache/unomi/services/mergers/DefaultPropertyMergeStrategyExecutor.java
@@ -20,6 +20,7 @@ package org.apache.unomi.services.mergers;
 import org.apache.unomi.api.Profile;
 import org.apache.unomi.api.PropertyMergeStrategyExecutor;
 import org.apache.unomi.api.PropertyType;
+import org.apache.unomi.persistence.spi.PropertyHelper;
 
 import java.util.List;
 
@@ -27,9 +28,9 @@ public class DefaultPropertyMergeStrategyExecutor implements 
PropertyMergeStrate
     public boolean mergeProperty(String propertyName, PropertyType 
propertyType, List<Profile> profilesToMerge, Profile targetProfile) {
         boolean modified = false;
         for (Profile profileToMerge : profilesToMerge) {
-            if (profileToMerge.getProperty(propertyName) != null &&
-                    
profileToMerge.getProperty(propertyName).toString().length() > 0) {
-                targetProfile.setProperty(propertyName, 
profileToMerge.getProperty(propertyName));
+            if (profileToMerge.getNestedProperty(propertyName) != null &&
+                    
profileToMerge.getNestedProperty(propertyName).toString().length() > 0) {
+                PropertyHelper.setProperty(targetProfile, "properties." + 
propertyName, profileToMerge.getNestedProperty(propertyName), "alwaysSet");
                 modified = true;
             }
         }

Reply via email to