This is an automated email from the ASF dual-hosted git repository.
jkevan 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 638e1c3 UNOMI-539: avoid event count twice in
SetEventOccurenceCountAction and fix profile updated return statement (#370)
638e1c3 is described below
commit 638e1c37e58f1a39f5439ac6a81aca72613384d4
Author: kevan Jahanshahi <[email protected]>
AuthorDate: Tue Dec 28 14:28:55 2021 +0100
UNOMI-539: avoid event count twice in SetEventOccurenceCountAction and fix
profile updated return statement (#370)
---
.../org/apache/unomi/itests/ContextServletIT.java | 7 +++---
.../unomi/persistence/spi/PropertyHelper.java | 15 ++++++++++++
.../actions/SetEventOccurenceCountAction.java | 27 ++++++++++++----------
3 files changed, 34 insertions(+), 15 deletions(-)
diff --git a/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
b/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
index c3e2b3d..cdedf34 100644
--- a/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
@@ -345,16 +345,17 @@ public class ContextServletIT extends BaseIT {
HttpPost request = new HttpPost(regularURI);
request.setEntity(new
StringEntity(objectMapper.writeValueAsString(contextRequest),
ContentType.create("application/json")));
//The first event is with a default timestamp (now)
- String cookieHeaderValue =
TestUtils.executeContextJSONRequest(request, sessionId).getCookieHeaderValue();
+ TestUtils.RequestResponse response =
TestUtils.executeContextJSONRequest(request, sessionId);
+ String cookieHeaderValue = response.getCookieHeaderValue();
refreshPersistence();
//The second event is with a customized timestamp
request.setURI(URI.create(customTimestampURI));
request.addHeader("Cookie", cookieHeaderValue);
- ContextResponse response =
(TestUtils.executeContextJSONRequest(request, sessionId)).getContextResponse();
//second event
+ response = (TestUtils.executeContextJSONRequest(request, sessionId));
//second event
refreshPersistence();
//Assert
- assertEquals(0, response.getProfileSegments().size());
+ assertEquals(0,
response.getContextResponse().getProfileSegments().size());
}
@Test
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 33735ac..538f71e 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
@@ -137,6 +137,19 @@ public class PropertyHelper {
return null;
}
+ public static Long getLong(Object value) {
+ if (value instanceof Number) {
+ return ((Number) value).longValue();
+ } else {
+ try {
+ return Long.parseLong(value.toString());
+ } catch (NumberFormatException e) {
+ // Not a number
+ }
+ }
+ return null;
+ }
+
public static Double getDouble(Object value) {
if (value instanceof Number) {
return ((Number) value).doubleValue();
@@ -189,6 +202,8 @@ public class PropertyHelper {
}
if (propertyValue instanceof Integer) {
return propertyValue.equals(getInteger(beanPropertyValue));
+ } if (propertyValue instanceof Long) {
+ return propertyValue.equals(getLong(beanPropertyValue));
} else if (propertyValue instanceof Boolean) {
return propertyValue.equals(getBooleanValue(beanPropertyValue));
} else {
diff --git
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/SetEventOccurenceCountAction.java
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/SetEventOccurenceCountAction.java
index 19b1afa..aa26976 100644
---
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/SetEventOccurenceCountAction.java
+++
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/SetEventOccurenceCountAction.java
@@ -24,6 +24,7 @@ import org.apache.unomi.api.conditions.Condition;
import org.apache.unomi.api.services.DefinitionsService;
import org.apache.unomi.api.services.EventService;
import org.apache.unomi.persistence.spi.PersistenceService;
+import org.apache.unomi.persistence.spi.PropertyHelper;
import java.time.Duration;
import java.time.LocalDateTime;
@@ -66,6 +67,13 @@ public class SetEventOccurenceCountAction implements
ActionExecutor {
c.setParameter("propertyValue", event.getProfileId());
conditions.add(c);
+ // may be current event is already persisted and indexed, in that case
we filter it from the count to increment it manually at the end
+ Condition eventIdFilter = new
Condition(definitionsService.getConditionType("eventPropertyCondition"));
+ eventIdFilter.setParameter("propertyName", "itemId");
+ eventIdFilter.setParameter("comparisonOperator", "notEquals");
+ eventIdFilter.setParameter("propertyValue", event.getItemId());
+ conditions.add(eventIdFilter);
+
Integer numberOfDays = (Integer)
pastEventCondition.getParameter("numberOfDays");
String fromDate = (String) pastEventCondition.getParameter("fromDate");
String toDate = (String) pastEventCondition.getParameter("toDate");
@@ -98,12 +106,6 @@ public class SetEventOccurenceCountAction implements
ActionExecutor {
long count = persistenceService.queryCount(andCondition,
Event.ITEM_TYPE);
- Map<String, Object> pastEvents = (Map<String, Object>)
event.getProfile().getSystemProperties().get("pastEvents");
- if (pastEvents == null) {
- pastEvents = new LinkedHashMap<>();
- event.getProfile().getSystemProperties().put("pastEvents",
pastEvents);
- }
-
LocalDateTime fromDateTime = null;
if (fromDate != null) {
Calendar fromDateCalendar =
DatatypeConverter.parseDateTime(fromDate);
@@ -117,15 +119,16 @@ public class SetEventOccurenceCountAction implements
ActionExecutor {
LocalDateTime eventTime =
LocalDateTime.ofInstant(event.getTimeStamp().toInstant(),ZoneId.of("UTC"));
- if (!persistenceService.isConsistent(event)) {
- if (inTimeRange(eventTime, numberOfDays, fromDateTime,
toDateTime)) {
- count++;
- }
+ if (inTimeRange(eventTime, numberOfDays, fromDateTime, toDateTime)) {
+ count++;
}
- pastEvents.put((String)
pastEventCondition.getParameter("generatedPropertyKey"), count);
+ String generatedPropertyKey = (String)
pastEventCondition.getParameter("generatedPropertyKey");
+ if (PropertyHelper.setProperty(event.getProfile(),
"systemProperties.pastEvents." + generatedPropertyKey, count, "alwaysSet")) {
+ return EventService.PROFILE_UPDATED;
+ }
- return EventService.PROFILE_UPDATED;
+ return EventService.NO_CHANGE;
}
private boolean inTimeRange(LocalDateTime eventTime, Integer numberOfDays,
LocalDateTime fromDate, LocalDateTime toDate) {