From cc20e194d546217070fdba03f4d091e3478c77e1 Mon Sep 17 00:00:00 2001 From: Toshiya Kobayashi Date: Fri, 6 Oct 2023 18:47:03 +0900 Subject: [PATCH] [DROOLS-7571] SessionStats eventsMatched isn't correctly calculated in case of match_multiple_rules --- .../rulesengine/RegisterOnlyAgendaFilter.java | 20 +++++++++---------- .../api/MultipleRuleMatchTest.java | 8 ++++++++ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/drools-ansible-rulebook-integration-api/src/main/java/org/drools/ansible/rulebook/integration/api/rulesengine/RegisterOnlyAgendaFilter.java b/drools-ansible-rulebook-integration-api/src/main/java/org/drools/ansible/rulebook/integration/api/rulesengine/RegisterOnlyAgendaFilter.java index 49edbf07..f4e9772e 100644 --- a/drools-ansible-rulebook-integration-api/src/main/java/org/drools/ansible/rulebook/integration/api/rulesengine/RegisterOnlyAgendaFilter.java +++ b/drools-ansible-rulebook-integration-api/src/main/java/org/drools/ansible/rulebook/integration/api/rulesengine/RegisterOnlyAgendaFilter.java @@ -31,7 +31,7 @@ public class RegisterOnlyAgendaFilter implements AgendaFilter { private final Set matchedRules = new LinkedHashSet<>(); - private final Set eventsToBeDeleted = Collections.newSetFromMap(new IdentityHashMap<>()); + private final Set matchedEvents = Collections.newSetFromMap(new IdentityHashMap<>()); public RegisterOnlyAgendaFilter(RulesExecutorSession rulesExecutorSession) { this.rulesExecutorSession = rulesExecutorSession; @@ -55,11 +55,9 @@ public boolean accept(Match match) { matchedRules.add( matchTransformers.getOrDefault(metadata.get(RULE_TYPE_TAG), Function.identity()).apply(match) ); } - if (!rulesExecutorSession.isMatchMultipleRules()) { - for (InternalFactHandle fh : fhs) { - if (fh.isEvent()) { - eventsToBeDeleted.add(fh); - } + for (InternalFactHandle fh : fhs) { + if (fh.isEvent()) { + matchedEvents.add(fh); } } @@ -67,11 +65,13 @@ public boolean accept(Match match) { } public List finalizeAndGetResults(boolean event) { - rulesExecutorSession.registerMatchedEvents(eventsToBeDeleted); - for (FactHandle toBeDeleted : eventsToBeDeleted) { - rulesExecutorSession.delete(toBeDeleted); + rulesExecutorSession.registerMatchedEvents(matchedEvents); + if (!rulesExecutorSession.isMatchMultipleRules()) { + for (FactHandle toBeDeleted : matchedEvents) { + rulesExecutorSession.delete(toBeDeleted); + } } - eventsToBeDeleted.clear(); + matchedEvents.clear(); List matches = new ArrayList<>( matchedRules ); matchedRules.clear(); diff --git a/drools-ansible-rulebook-integration-api/src/test/java/org/drools/ansible/rulebook/integration/api/MultipleRuleMatchTest.java b/drools-ansible-rulebook-integration-api/src/test/java/org/drools/ansible/rulebook/integration/api/MultipleRuleMatchTest.java index f9782881..cb166681 100644 --- a/drools-ansible-rulebook-integration-api/src/test/java/org/drools/ansible/rulebook/integration/api/MultipleRuleMatchTest.java +++ b/drools-ansible-rulebook-integration-api/src/test/java/org/drools/ansible/rulebook/integration/api/MultipleRuleMatchTest.java @@ -16,12 +16,14 @@ package org.drools.ansible.rulebook.integration.api; +import org.drools.ansible.rulebook.integration.api.rulesengine.SessionStats; import org.junit.Test; import org.kie.api.runtime.rule.Match; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; public class MultipleRuleMatchTest { @@ -126,6 +128,12 @@ public void processEventsWithMatchMultipleRules_shouldMatchMultipleRules() { assertThat(matchedRules).hasSize(2); assertThat(matchedRules.stream().map(m -> m.getRule().getName())).contains("R1", "R2"); + SessionStats stats = rulesExecutor.getSessionStats(); + assertEquals(2, stats.getRulesTriggered()); + assertEquals(1, stats.getEventsProcessed()); + assertEquals(1, stats.getEventsMatched()); + assertEquals(0, stats.getEventsSuppressed()); + rulesExecutor.dispose(); }