You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by "Romain Gauthier (Jira)" <ji...@apache.org> on 2026/10/23 13:23:00 UTC

[jira] [Commented] (UNOMI-1017) Profile merge replaces properties.interests instead of summing the points by key

    [ https://issues.apache.org/jira/browse/UNOMI-1017?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18130920#comment-18130920 ] 

Romain Gauthier commented on UNOMI-1017:
----------------------------------------

The same replacement hits a counter per scope that is stored as a map, such as {{properties.pageViewCount.<scope>}}, which {{incrementPropertyAction}} increments. The web-tracker sample filters on this property ([index.html#L89|https://github.com/apache/unomi/blob/b795eaa693df0b398c683dad5d0aedb026c529af/extensions/web-tracker/wab/src/main/webapp/index.html#L89]).

* {{PropertyHelper.flatten}} descends into the map, so each scope becomes its own key, for example {{pageViewCount.site1}} ([PropertyHelper.java#L283-L285|https://github.com/apache/unomi/blob/b795eaa693df0b398c683dad5d0aedb026c529af/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PropertyHelper.java#L283-L285]).
* {{mergeProfiles}} looks up the merge strategy with this flattened key ([ProfileServiceImpl.java#L772-L773|https://github.com/apache/unomi/blob/b795eaa693df0b398c683dad5d0aedb026c529af/services/src/main/java/org/apache/unomi/services/impl/profiles/ProfileServiceImpl.java#L772-L773]). No property type has this ID, so {{defaultMergeStrategy}} keeps the count of the last merged profile.
* Example: the master has 40 page views on {{site1}}, and the merged profiles have 10 and then 16. After the merge, the master has 16, and the sum is 66.

A property type cannot fix this case, because its ID would have to contain the scope, such as {{pageViewCount.site1}}. The fix needs a lookup on the parent key {{pageViewCount}}, with a strategy that adds the values of the map by key. The sum-by-key strategy proposed for {{interests}} can cover both the list and the map.

> Profile merge replaces properties.interests instead of summing the points by key
> --------------------------------------------------------------------------------
>
>                 Key: UNOMI-1017
>                 URL: https://issues.apache.org/jira/browse/UNOMI-1017
>             Project: Apache Unomi
>          Issue Type: Bug
>          Components: unomi(-core)
>    Affects Versions: unomi-2.7.0, unomi-3.0.1
>            Reporter: Romain Gauthier
>            Priority: Major
>
> When profiles merge, the master profile loses its {{properties.interests}} list. The list of the last merged profile replaces it, and the interest points are not added.
> *Cause:* no profile property type declares {{interests}}, so {{mergeProfiles}} uses {{defaultMergeStrategy}} ([ProfileServiceImpl.java#L773|https://github.com/apache/unomi/blob/b795eaa693df0b398c683dad5d0aedb026c529af/services/src/main/java/org/apache/unomi/services/impl/profiles/ProfileServiceImpl.java#L773]). That executor sets each non-empty value with {{alwaysSet}}, so the last profile wins ([DefaultPropertyMergeStrategyExecutor.java#L28-L37|https://github.com/apache/unomi/blob/b795eaa693df0b398c683dad5d0aedb026c529af/services/src/main/java/org/apache/unomi/services/mergers/DefaultPropertyMergeStrategyExecutor.java#L28-L37]).
> *Proposed fix:* declare an {{interests}} profile property type with a new merge strategy that sums {{value}} by {{key}}. The mapping already declares the field ([profile.json#L50|https://github.com/apache/unomi/blob/b795eaa693df0b398c683dad5d0aedb026c529af/persistence-elasticsearch/core/src/main/resources/META-INF/cxs/mappings/profile.json#L50]). The existing {{addMergeStrategy}} does not fit, because it throws on a list ([AddPropertyMergeStrategyExecutor.java#L65|https://github.com/apache/unomi/blob/b795eaa693df0b398c683dad5d0aedb026c529af/services/src/main/java/org/apache/unomi/services/mergers/AddPropertyMergeStrategyExecutor.java#L65]).
> *Example:* the master has {{funds}} 30, and the merged profile has {{funds}} 5 and {{pension}} 7.
> {code:json}
> // master after the merge, today
> [{"key": "funds", "value": 5}, {"key": "pension", "value": 7}]
> // expected
> [{"key": "funds", "value": 35}, {"key": "pension", "value": 7}]
> {code}
> *Verified:* code reading on master {{b795eaa69}}, on {{unomi-root-3.0.1}} and on {{unomi-root-2.7.0}}, where the merge code is the same. No test run.
> Related: UNOMI-441 asks for a strategy that appends lists. An append keeps two {{funds}} entries and does not sum them.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)