This is an automated email from the ASF dual-hosted git repository.
jkevan pushed a commit to branch unomi-1.6.x
in repository https://gitbox.apache.org/repos/asf/unomi.git
The following commit(s) were added to refs/heads/unomi-1.6.x by this push:
new 1beb50d4f UNOMI-676: fix past event recalculation limited to 50 rules
(#510)
1beb50d4f is described below
commit 1beb50d4f7a1288de614610c45f43a917e50bf37
Author: kevan Jahanshahi <[email protected]>
AuthorDate: Fri Sep 23 15:22:42 2022 +0200
UNOMI-676: fix past event recalculation limited to 50 rules (#510)
* UNOMI-676: fix past event recalculation limited to 50 rules
* UNOMI-676: fix past event recalculation limited to 50 rules
* UNOMI-676: fix past event recalculation limited to 50 rules
---
.../apache/unomi/api/services/RulesService.java | 10 +++++++++
.../test/java/org/apache/unomi/itests/BaseIT.java | 7 ++----
.../org/apache/unomi/itests/RuleServiceIT.java | 26 +++++++++++++++++++++-
.../services/impl/rules/RulesServiceImpl.java | 8 +++++--
.../services/impl/segments/SegmentServiceImpl.java | 21 ++++++++---------
5 files changed, 54 insertions(+), 18 deletions(-)
diff --git a/api/src/main/java/org/apache/unomi/api/services/RulesService.java
b/api/src/main/java/org/apache/unomi/api/services/RulesService.java
index 817e0882f..52a97ee34 100644
--- a/api/src/main/java/org/apache/unomi/api/services/RulesService.java
+++ b/api/src/main/java/org/apache/unomi/api/services/RulesService.java
@@ -26,6 +26,7 @@ import org.apache.unomi.api.query.Query;
import org.apache.unomi.api.rules.Rule;
import org.apache.unomi.api.rules.RuleStatistics;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -57,6 +58,15 @@ public interface RulesService {
*/
PartialList<Rule> getRuleDetails(Query query);
+ /**
+ * Get all rules available in the system.
+ * (This is not doing a persistence query to retrieve the rules, it's
using the internal in memory cache
+ * that is refreshed every second by default but can vary depending on
your own configuration)
+ *
+ * @return all rules available.
+ */
+ List<Rule> getAllRules();
+
/**
* Retrieves the rule identified by the specified identifier.
*
diff --git a/itests/src/test/java/org/apache/unomi/itests/BaseIT.java
b/itests/src/test/java/org/apache/unomi/itests/BaseIT.java
index 4defdfbb4..e75bee6b9 100644
--- a/itests/src/test/java/org/apache/unomi/itests/BaseIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/BaseIT.java
@@ -342,11 +342,8 @@ public abstract class BaseIT {
public void createAndWaitForRule(Rule rule) throws InterruptedException {
rulesService.setRule(rule);
- refreshPersistence();
- keepTrying("Failed waiting for rule to be saved",
- () -> rulesService.getRule(rule.getMetadata().getId()),
- Objects::nonNull,
- 3000,
+ keepTrying("Failed waiting for rule to be saved", () ->
rulesService.getAllRules(),
+ (rules) -> rules.stream().anyMatch(r ->
r.getItemId().equals(rule.getMetadata().getId())), 1000,
100);
rulesService.refreshRules();
}
diff --git a/itests/src/test/java/org/apache/unomi/itests/RuleServiceIT.java
b/itests/src/test/java/org/apache/unomi/itests/RuleServiceIT.java
index 2943d073d..d016f1e1b 100644
--- a/itests/src/test/java/org/apache/unomi/itests/RuleServiceIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/RuleServiceIT.java
@@ -87,8 +87,32 @@ public class RuleServiceIT extends BaseIT {
}
@Test
- public void testRuleEventTypeOptimization() throws InterruptedException {
+ public void getAllRulesShouldReturnAllRulesAvailable() throws
InterruptedException {
+ String ruleIDBase = "moreThan50RuleTest";
+ int originalRulesNumber = rulesService.getAllRules().size();
+ for (int i = 0; i < 60; i++) {
+ String ruleID = ruleIDBase + "_" + i;
+ Metadata metadata = new Metadata(ruleID);
+ metadata.setName(ruleID);
+ metadata.setDescription(ruleID);
+ metadata.setScope(TEST_SCOPE);
+ Rule nullRule = new Rule(metadata);
+ nullRule.setCondition(null);
+ nullRule.setActions(null);
+ createAndWaitForRule(nullRule);
+ }
+ assertEquals("Expected getAllRules to be able to retrieve all the
rules available in the system", originalRulesNumber + 60,
rulesService.getAllRules().size());
+ // cleanup
+ for (int i = 0; i < 60; i++) {
+ String ruleID = ruleIDBase + "_" + i;
+ rulesService.removeRule(ruleID);
+ }
+ refreshPersistence();
+ rulesService.refreshRules();
+ }
+ @Test
+ public void testRuleEventTypeOptimization() throws InterruptedException {
ConditionBuilder builder = new ConditionBuilder(definitionsService);
Rule simpleEventTypeRule = new Rule(new Metadata(TEST_SCOPE,
"simple-event-type-rule", "Simple event type rule", "A rule with a simple
condition to match an event type"));
simpleEventTypeRule.setCondition(builder.condition("eventTypeCondition").parameter("eventTypeId",
"view").build());
diff --git
a/services/src/main/java/org/apache/unomi/services/impl/rules/RulesServiceImpl.java
b/services/src/main/java/org/apache/unomi/services/impl/rules/RulesServiceImpl.java
index 79210caa5..46fc3c94d 100644
---
a/services/src/main/java/org/apache/unomi/services/impl/rules/RulesServiceImpl.java
+++
b/services/src/main/java/org/apache/unomi/services/impl/rules/RulesServiceImpl.java
@@ -273,7 +273,7 @@ public class RulesServiceImpl implements RulesService,
EventListenerService, Syn
try {
// we use local variables to make sure we quickly switch the
collections since the refresh is called often
// we want to avoid concurrency issues with the shared collections
- List<Rule> newAllRules = getAllRules();
+ List<Rule> newAllRules = queryAllRules();
this.rulesByEventType = getRulesByEventType(newAllRules);
this.allRules = newAllRules;
} catch (Throwable t) {
@@ -281,7 +281,11 @@ public class RulesServiceImpl implements RulesService,
EventListenerService, Syn
}
}
- private List<Rule> getAllRules() {
+ public List<Rule> getAllRules() {
+ return Collections.unmodifiableList(allRules);
+ }
+
+ private List<Rule> queryAllRules() {
List<Rule> rules = persistenceService.getAllItems(Rule.class, 0, -1,
"priority").getList();
for (Rule rule : rules) {
// Check rule integrity
diff --git
a/services/src/main/java/org/apache/unomi/services/impl/segments/SegmentServiceImpl.java
b/services/src/main/java/org/apache/unomi/services/impl/segments/SegmentServiceImpl.java
index deaad1236..cdeb96137 100644
---
a/services/src/main/java/org/apache/unomi/services/impl/segments/SegmentServiceImpl.java
+++
b/services/src/main/java/org/apache/unomi/services/impl/segments/SegmentServiceImpl.java
@@ -945,16 +945,17 @@ public class SegmentServiceImpl extends
AbstractServiceImpl implements SegmentSe
public void recalculatePastEventConditions() {
Set<String> segmentOrScoringIdsToReevaluate = new HashSet<>();
// reevaluate auto generated rules used to store the event occurrence
count on the profile
- for (Metadata metadata : rulesService.getRuleMetadatas()) {
- Rule rule = rulesService.getRule(metadata.getId());
- for (Action action : rule.getActions()) {
- if
(action.getActionTypeId().equals("setEventOccurenceCountAction")) {
- Condition pastEventCondition = (Condition)
action.getParameterValues().get("pastEventCondition");
- if (pastEventCondition.containsParameter("numberOfDays")) {
-
recalculatePastEventOccurrencesOnProfiles(rule.getCondition(),
pastEventCondition, true, true);
- logger.info("Event occurrence count on profiles
updated for rule: {}", rule.getItemId());
- if (rule.getLinkedItems() != null &&
rule.getLinkedItems().size() > 0) {
-
segmentOrScoringIdsToReevaluate.addAll(rule.getLinkedItems());
+ for (Rule rule : rulesService.getAllRules()) {
+ if (rule.getActions() != null && rule.getActions().size() > 0) {
+ for (Action action : rule.getActions()) {
+ if
(action.getActionTypeId().equals("setEventOccurenceCountAction")) {
+ Condition pastEventCondition = (Condition)
action.getParameterValues().get("pastEventCondition");
+ if
(pastEventCondition.containsParameter("numberOfDays")) {
+
recalculatePastEventOccurrencesOnProfiles(rule.getCondition(),
pastEventCondition, true, true);
+ logger.info("Event occurrence count on profiles
updated for rule: {}", rule.getItemId());
+ if (rule.getLinkedItems() != null &&
rule.getLinkedItems().size() > 0) {
+
segmentOrScoringIdsToReevaluate.addAll(rule.getLinkedItems());
+ }
}
}
}