You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by jk...@apache.org on 2021/12/27 17:59:22 UTC

[unomi] 01/01: UNOMI-539: avoid event count twice in SetEventOccurenceCountAction and fix profile updated return statement

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

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

commit f1db5ebbaf27c7461ab1050f9e20b6e665e22deb
Author: Kevan <ke...@jahia.com>
AuthorDate: Mon Dec 27 18:58:19 2021 +0100

    UNOMI-539: avoid event count twice in SetEventOccurenceCountAction and fix profile updated return statement
---
 .../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) {