in services/src/main/java/org/apache/unomi/services/impl/rules/RulesServiceImpl.java [162:250]
public Set<Rule> getMatchingRules(Event event) {
Set<Rule> matchedRules = new LinkedHashSet<Rule>();
Boolean hasEventAlreadyBeenRaised = null;
Boolean hasEventAlreadyBeenRaisedForSession = null;
Boolean hasEventAlreadyBeenRaisedForProfile = null;
Set<Rule> eventTypeRules = new HashSet<>(allRules); // local copy to avoid concurrency issues
if (optimizedRulesActivated) {
eventTypeRules = rulesByEventType.get(event.getEventType());
if (eventTypeRules == null) {
eventTypeRules = new HashSet<>();
}
eventTypeRules = new HashSet<>(eventTypeRules); // local copy to avoid concurrency issues
Set<Rule> allEventRules = rulesByEventType.get("*");
if (allEventRules != null && !allEventRules.isEmpty()) {
eventTypeRules.addAll(allEventRules); // retrieve rules that should always be evaluated.
}
if (eventTypeRules.isEmpty()) {
return matchedRules;
}
}
for (Rule rule : eventTypeRules) {
if (!rule.getMetadata().isEnabled()) {
continue;
}
RuleStatistics ruleStatistics = getLocalRuleStatistics(rule);
long ruleConditionStartTime = System.currentTimeMillis();
String scope = rule.getMetadata().getScope();
if (scope.equals(Metadata.SYSTEM_SCOPE) || scope.equals(event.getScope())) {
Condition eventCondition = definitionsService.extractConditionBySystemTag(rule.getCondition(), "eventCondition");
if (eventCondition == null) {
updateRuleStatistics(ruleStatistics, ruleConditionStartTime);
continue;
}
fireEvaluate(rule, event);
if (!persistenceService.testMatch(eventCondition, event)) {
updateRuleStatistics(ruleStatistics, ruleConditionStartTime);
continue;
}
Condition sourceCondition = definitionsService.extractConditionBySystemTag(rule.getCondition(), "sourceEventCondition");
if (sourceCondition != null && !persistenceService.testMatch(sourceCondition, event.getSource())) {
updateRuleStatistics(ruleStatistics, ruleConditionStartTime);
continue;
}
if (rule.isRaiseEventOnlyOnce()) {
hasEventAlreadyBeenRaised = hasEventAlreadyBeenRaised != null ? hasEventAlreadyBeenRaised : eventService.hasEventAlreadyBeenRaised(event);
if (hasEventAlreadyBeenRaised) {
updateRuleStatistics(ruleStatistics, ruleConditionStartTime);
fireAlreadyRaised(RuleListenerService.AlreadyRaisedFor.EVENT, rule, event);
continue;
}
} else if (rule.isRaiseEventOnlyOnceForProfile()) {
hasEventAlreadyBeenRaisedForProfile = hasEventAlreadyBeenRaisedForProfile != null ? hasEventAlreadyBeenRaisedForProfile : eventService.hasEventAlreadyBeenRaised(event, false);
if (hasEventAlreadyBeenRaisedForProfile) {
updateRuleStatistics(ruleStatistics, ruleConditionStartTime);
fireAlreadyRaised(RuleListenerService.AlreadyRaisedFor.PROFILE, rule, event);
continue;
}
} else if (rule.isRaiseEventOnlyOnceForSession()) {
hasEventAlreadyBeenRaisedForSession = hasEventAlreadyBeenRaisedForSession != null ? hasEventAlreadyBeenRaisedForSession : eventService.hasEventAlreadyBeenRaised(event, true);
if (hasEventAlreadyBeenRaisedForSession) {
updateRuleStatistics(ruleStatistics, ruleConditionStartTime);
fireAlreadyRaised(RuleListenerService.AlreadyRaisedFor.SESSION, rule, event);
continue;
}
}
Condition profileCondition = definitionsService.extractConditionBySystemTag(rule.getCondition(), "profileCondition");
if (profileCondition != null && !persistenceService.testMatch(profileCondition, event.getProfile())) {
updateRuleStatistics(ruleStatistics, ruleConditionStartTime);
continue;
}
Condition sessionCondition = definitionsService.extractConditionBySystemTag(rule.getCondition(), "sessionCondition");
if (sessionCondition != null && !persistenceService.testMatch(sessionCondition, event.getSession())) {
updateRuleStatistics(ruleStatistics, ruleConditionStartTime);
continue;
}
matchedRules.add(rule);
}
}
return matchedRules;
}