You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by fg...@apache.org on 2022/12/28 13:14:53 UTC
[unomi] branch master updated: UNOMI-617: Update filters to adapt to interests data model changes (#525)
This is an automated email from the ASF dual-hosted git repository.
fgerthoffert 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 220802c82 UNOMI-617: Update filters to adapt to interests data model changes (#525)
220802c82 is described below
commit 220802c824ef6295918e77ef814f4072b36a0882
Author: anatol-sialitski <53...@users.noreply.github.com>
AuthorDate: Wed Dec 28 14:14:49 2022 +0100
UNOMI-617: Update filters to adapt to interests data model changes (#525)
---
.../factories/ProfileConditionFactory.java | 29 +++++++++++++---------
.../SegmentProfileInterestsConditionParser.java | 8 +++---
.../profile/ProfileInterestsDataFetcher.java | 20 ++++++++++++---
.../unomi/graphql/types/output/CDPPersona.java | 2 +-
.../unomi/graphql/types/output/CDPProfile.java | 4 +--
.../itests/graphql/GraphQLProfilePropertiesIT.java | 15 +++++------
6 files changed, 49 insertions(+), 29 deletions(-)
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/condition/factories/ProfileConditionFactory.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/condition/factories/ProfileConditionFactory.java
index 52a602878..a26fc87bf 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/condition/factories/ProfileConditionFactory.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/condition/factories/ProfileConditionFactory.java
@@ -153,44 +153,49 @@ public class ProfileConditionFactory extends ConditionFactory {
return booleanCondition("or", subConditions);
}
- private Condition interestFilterInputCondition(final CDPInterestFilterInput filterInput) {
- final List<Condition> rootSubConditions = new ArrayList<>();
+ private Condition buildConditionInterestValue(Double interestValue, String operator) {
+ return integerPropertyCondition("properties.interests.value", operator, interestValue);
+ }
- final String propertyName = "properties.interests." + filterInput.getTopic_equals();
+ private Condition interestFilterInputCondition(final CDPInterestFilterInput filterInput) {
+ final List<Condition> subConditions = new ArrayList<>();
if (filterInput.getTopic_equals() != null) {
- rootSubConditions.add(propertyCondition(propertyName, "exists", filterInput.getTopic_equals()));
+ subConditions.add(propertyCondition("properties.interests.key", filterInput.getTopic_equals()));
}
if (filterInput.getScore_equals() != null) {
- rootSubConditions.add(integerPropertyCondition(propertyName, filterInput.getScore_equals()));
+ subConditions.add(buildConditionInterestValue(filterInput.getScore_equals(), "equals"));
}
if (filterInput.getScore_gt() != null) {
- rootSubConditions.add(integerPropertyCondition(propertyName, "greaterThan", filterInput.getScore_gt()));
+ subConditions.add(buildConditionInterestValue(filterInput.getScore_gt(), "greaterThan"));
}
if (filterInput.getScore_gte() != null) {
- rootSubConditions.add(integerPropertyCondition(propertyName, "greaterThanOrEqualTo", filterInput.getScore_gte()));
+ subConditions.add(buildConditionInterestValue(filterInput.getScore_gte(), "greaterThanOrEqualTo"));
}
if (filterInput.getScore_lt() != null) {
- rootSubConditions.add(integerPropertyCondition(propertyName, "lessThan", filterInput.getScore_lt()));
+ subConditions.add(buildConditionInterestValue(filterInput.getScore_lt(), "lessThan"));
}
if (filterInput.getScore_lte() != null) {
- rootSubConditions.add(integerPropertyCondition(propertyName, "lessThanOrEqualTo", filterInput.getScore_lte()));
+ subConditions.add(buildConditionInterestValue(filterInput.getScore_lte(), "lessThanOrEqualTo"));
}
if (filterInput.getAnd() != null && !filterInput.getAnd().isEmpty()) {
- rootSubConditions.add(filtersToCondition(filterInput.getOr(), this::interestFilterInputCondition, "and"));
+ subConditions.add(filtersToCondition(filterInput.getOr(), this::interestFilterInputCondition, "and"));
}
if (filterInput.getOr() != null && !filterInput.getOr().isEmpty()) {
- rootSubConditions.add(filtersToCondition(filterInput.getOr(), this::interestFilterInputCondition, "or"));
+ subConditions.add(filtersToCondition(filterInput.getOr(), this::interestFilterInputCondition, "or"));
}
- return booleanCondition("and", rootSubConditions);
+ final Condition nestedCondition = new Condition(definitionsService.getConditionType("nestedCondition"));
+ nestedCondition.setParameter("path", "properties.interests");
+ nestedCondition.setParameter("subCondition", booleanCondition("and", subConditions));
+ return nestedCondition;
}
@SuppressWarnings("unchecked")
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/condition/parsers/SegmentProfileInterestsConditionParser.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/condition/parsers/SegmentProfileInterestsConditionParser.java
index 2f383bde9..4599431ef 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/condition/parsers/SegmentProfileInterestsConditionParser.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/condition/parsers/SegmentProfileInterestsConditionParser.java
@@ -67,11 +67,13 @@ public class SegmentProfileInterestsConditionParser {
final String comparisonOperator =
ComparisonConditionTranslator.translateFromUnomiToGraphQL(condition.getParameter("comparisonOperator").toString());
- final String fieldName = "score_" + comparisonOperator;
-
final Map<String, Object> tuple = new HashMap<>();
- tuple.put(fieldName, condition.getParameter("propertyValueInteger"));
+ if (!"exists".equals(comparisonOperator)) {
+ final String fieldName = "score_" + comparisonOperator;
+ tuple.put(fieldName, condition.getParameter("propertyValueInteger"));
+ }
+
tuple.put("topic_equals", condition.getParameter("propertyName").toString().replaceAll("properties.interests.", ""));
return tuple;
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/fetchers/profile/ProfileInterestsDataFetcher.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/fetchers/profile/ProfileInterestsDataFetcher.java
index 407fcde54..a0a0c8460 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/fetchers/profile/ProfileInterestsDataFetcher.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/fetchers/profile/ProfileInterestsDataFetcher.java
@@ -25,26 +25,38 @@ import org.apache.unomi.graphql.types.output.CDPInterest;
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.stream.Collectors;
public class ProfileInterestsDataFetcher implements DataFetcher<List<CDPInterest>> {
private final Profile profile;
- public ProfileInterestsDataFetcher(Profile profile) {
+ private final List<String> viewIds;
+
+ public ProfileInterestsDataFetcher(Profile profile, List<String> viewIds) {
this.profile = profile;
+ this.viewIds = viewIds;
}
@Override
@SuppressWarnings("unchecked")
public List<CDPInterest> get(DataFetchingEnvironment environment) throws Exception {
- final Map<String, Double> interests = (Map<String, Double>) profile.getProperties().get("interests");
+ final List<Map<String, Object>> interests = (List<Map<String, Object>>) profile.getProperties().get("interests");
if (interests == null) {
return Collections.emptyList();
}
- return interests.entrySet().stream()
- .map(entry -> new CDPInterest(entry.getKey(), entry.getValue()))
+ return interests.stream()
+ .map(interest -> {
+ final String topic = interest.get("key").toString();
+ final Double score = Double.parseDouble(interest.get("value").toString());
+ if (viewIds != null && !viewIds.isEmpty()) {
+ return viewIds.contains(topic) ? new CDPInterest(topic, score) : null;
+ }
+ return new CDPInterest(topic, score);
+ })
+ .filter(Objects::nonNull)
.collect(Collectors.toList());
}
}
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/types/output/CDPPersona.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/types/output/CDPPersona.java
index 5058a1924..82cfd71e1 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/types/output/CDPPersona.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/types/output/CDPPersona.java
@@ -96,7 +96,7 @@ public class CDPPersona implements CDPProfileInterface {
public List<CDPInterest> cdp_interests(
final @GraphQLName("views") List<String> viewIds,
final DataFetchingEnvironment environment) throws Exception {
- return persona != null ? new ProfileInterestsDataFetcher(persona).get(environment) : null;
+ return persona != null ? new ProfileInterestsDataFetcher(persona, viewIds).get(environment) : null;
}
@GraphQLField
diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/types/output/CDPProfile.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/types/output/CDPProfile.java
index 13a96ef4f..c8923c95d 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/types/output/CDPProfile.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/types/output/CDPProfile.java
@@ -47,7 +47,7 @@ public class CDPProfile implements CDPProfileInterface {
public static final String TYPE_NAME = "CDP_Profile";
- private Profile profile;
+ private final Profile profile;
public CDPProfile(Profile profile) {
this.profile = profile;
@@ -73,7 +73,7 @@ public class CDPProfile implements CDPProfileInterface {
@Override
@GraphQLField
public List<CDPInterest> cdp_interests(final @GraphQLName("views") List<String> viewIds, final DataFetchingEnvironment environment) throws Exception {
- return new ProfileInterestsDataFetcher(profile).get(environment);
+ return new ProfileInterestsDataFetcher(profile, viewIds).get(environment);
}
@Override
diff --git a/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLProfilePropertiesIT.java b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLProfilePropertiesIT.java
index ea9061443..587b72718 100644
--- a/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLProfilePropertiesIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLProfilePropertiesIT.java
@@ -21,19 +21,18 @@ import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.unomi.api.Consent;
import org.apache.unomi.api.ConsentStatus;
import org.apache.unomi.api.Profile;
-import org.apache.unomi.api.services.ProfileService;
import org.apache.unomi.graphql.utils.DateUtils;
import org.junit.Assert;
import org.junit.Test;
-import org.ops4j.pax.exam.util.Filter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.inject.Inject;
import java.time.OffsetDateTime;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -95,14 +94,16 @@ public class GraphQLProfilePropertiesIT extends BaseGraphQLIT {
Date revokationDate = DateUtils.toDate(OffsetDateTime.parse("2021-05-14T14:47:28Z"));
consent.setRevokeDate(revokationDate);
- final Map<String, Double> interestsAsMap = new HashMap<>();
-
- interestsAsMap.put("interestName", 0.5);
+ final List<Map<String, Object>> interests = new ArrayList<>();
+ Map<String, Object> interest1 = new HashMap<>();
+ interest1.put("key", "interestName");
+ interest1.put("value", 0.5);
+ interests.add(interest1);
final Profile profile = new Profile("profileId_testGetProfile_CDPFields");
profile.setConsent(consent);
- profile.setProperty("interests", interestsAsMap);
+ profile.setProperty("interests", interests);
profileService.save(profile);