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

mariofusco pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git


The following commit(s) were added to refs/heads/main by this push:
     new 4efd1157a0 [DROOLS-7583] fix insert logical for rule units (#5579)
4efd1157a0 is described below

commit 4efd1157a0e483190d8469b92720f364f33f201d
Author: Mario Fusco <[email protected]>
AuthorDate: Thu Nov 9 13:53:31 2023 +0100

    [DROOLS-7583] fix insert logical for rule units (#5579)
---
 .../core/rule/consequence/KnowledgeHelper.java     |  2 +
 .../consequence/DefaultKnowledgeHelper.java        | 29 +++++-----
 .../impl/LogicalAddByElementTestUnit.java          | 54 ++++++++++++++++++
 .../ruleunits/impl/RuleUnitProviderImplTest.java   | 65 +++++++++++++++++++++-
 .../drools/ruleunits/impl/LogicalAddByElement.drl  | 35 ++++++++++++
 5 files changed, 169 insertions(+), 16 deletions(-)

diff --git 
a/drools-core/src/main/java/org/drools/core/rule/consequence/KnowledgeHelper.java
 
b/drools-core/src/main/java/org/drools/core/rule/consequence/KnowledgeHelper.java
index 970ac5672b..07b3cce82f 100644
--- 
a/drools-core/src/main/java/org/drools/core/rule/consequence/KnowledgeHelper.java
+++ 
b/drools-core/src/main/java/org/drools/core/rule/consequence/KnowledgeHelper.java
@@ -37,6 +37,8 @@ public interface KnowledgeHelper extends ConsequenceContext, 
Serializable {
     
     void setActivation(InternalMatch internalMatch);
 
+    InternalMatch getActivation();
+
     default void restoreActivationOnConsequenceFailure(InternalMatch 
internalMatch) { }
 
 
diff --git 
a/drools-kiesession/src/main/java/org/drools/kiesession/consequence/DefaultKnowledgeHelper.java
 
b/drools-kiesession/src/main/java/org/drools/kiesession/consequence/DefaultKnowledgeHelper.java
index 2b53bd0b94..4dab8d194a 100644
--- 
a/drools-kiesession/src/main/java/org/drools/kiesession/consequence/DefaultKnowledgeHelper.java
+++ 
b/drools-kiesession/src/main/java/org/drools/kiesession/consequence/DefaultKnowledgeHelper.java
@@ -18,6 +18,14 @@
  */
 package org.drools.kiesession.consequence;
 
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
 import org.drools.base.beliefsystem.Mode;
 import org.drools.base.definitions.rule.impl.RuleImpl;
 import org.drools.base.factmodel.traits.CoreWrapper;
@@ -37,9 +45,9 @@ import org.drools.core.reteoo.RuleTerminalNode;
 import org.drools.core.reteoo.Tuple;
 import org.drools.core.rule.consequence.InternalMatch;
 import org.drools.core.rule.consequence.KnowledgeHelper;
-import org.drools.util.bitmask.BitMask;
 import org.drools.kiesession.rulebase.InternalKnowledgeBase;
 import org.drools.kiesession.session.StatefulKnowledgeSessionImpl;
+import org.drools.util.bitmask.BitMask;
 import org.kie.api.runtime.Channel;
 import org.kie.api.runtime.KieRuntime;
 import org.kie.api.runtime.process.NodeInstance;
@@ -51,14 +59,6 @@ import org.kie.api.runtime.rule.EntryPoint;
 import org.kie.api.runtime.rule.FactHandle;
 import org.kie.api.runtime.rule.Match;
 
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-
 import static 
org.drools.base.reteoo.PropertySpecificUtil.allSetButTraitBitMask;
 import static org.drools.base.reteoo.PropertySpecificUtil.onlyTraitBitSetMask;
 
@@ -165,12 +165,13 @@ public class DefaultKnowledgeHelper implements 
KnowledgeHelper, Externalizable {
         if (!TruthMaintenanceSystemFactory.present()) {
             TruthMaintenanceSystemFactory.throwExceptionForMissingTms();
         }
-        if (tmsKnowledgeHelper != null) {
-            return tmsKnowledgeHelper;
+        if (tmsKnowledgeHelper == null) {
+            reteEvaluator.enableTMS();
+            tmsKnowledgeHelper = reteEvaluator.createKnowledgeHelper();
+        }
+        if (internalMatch != tmsKnowledgeHelper.getActivation()) {
+            tmsKnowledgeHelper.setActivation(internalMatch);
         }
-        reteEvaluator.enableTMS();
-        tmsKnowledgeHelper = reteEvaluator.createKnowledgeHelper();
-        tmsKnowledgeHelper.setActivation(internalMatch);
         return tmsKnowledgeHelper;
     }
 
diff --git 
a/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/LogicalAddByElementTestUnit.java
 
b/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/LogicalAddByElementTestUnit.java
new file mode 100644
index 0000000000..c76942cedc
--- /dev/null
+++ 
b/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/LogicalAddByElementTestUnit.java
@@ -0,0 +1,54 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.drools.ruleunits.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.ruleunits.api.DataSource;
+import org.drools.ruleunits.api.DataStore;
+import org.drools.ruleunits.api.RuleUnitData;
+
+public class LogicalAddByElementTestUnit implements RuleUnitData {
+    private final DataStore<String> strings;
+    private final DataStore<Integer> ints;
+    private final List<String> results = new ArrayList<>();
+
+    public LogicalAddByElementTestUnit() {
+        this(DataSource.createStore(), DataSource.createStore());
+    }
+
+    public LogicalAddByElementTestUnit(DataStore<String> strings, 
DataStore<Integer> ints) {
+        this.strings = strings;
+        this.ints = ints;
+    }
+
+    public DataStore<String> getStrings() {
+        return strings;
+    }
+
+    public DataStore<Integer> getInts() {
+        return ints;
+    }
+
+    public List<String> getResults() {
+        return results;
+    }
+
+}
diff --git 
a/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/RuleUnitProviderImplTest.java
 
b/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/RuleUnitProviderImplTest.java
index 04865bcae8..6bf4e5b8b6 100644
--- 
a/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/RuleUnitProviderImplTest.java
+++ 
b/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/RuleUnitProviderImplTest.java
@@ -18,6 +18,10 @@
  */
 package org.drools.ruleunits.impl;
 
+import java.util.ArrayList;
+import java.util.Objects;
+import java.util.Optional;
+
 import org.drools.core.base.RuleNameStartsWithAgendaFilter;
 import org.drools.ruleunits.api.DataHandle;
 import org.drools.ruleunits.api.RuleUnitInstance;
@@ -29,8 +33,10 @@ import 
org.drools.ruleunits.impl.listener.TestRuleEventListener;
 import org.drools.ruleunits.impl.listener.TestRuleRuntimeEventListener;
 import org.junit.jupiter.api.Test;
 import org.kie.api.builder.CompilationErrorsException;
-
-import java.util.Objects;
+import org.kie.api.event.rule.ObjectDeletedEvent;
+import org.kie.api.event.rule.ObjectInsertedEvent;
+import org.kie.api.event.rule.ObjectUpdatedEvent;
+import org.kie.api.event.rule.RuleRuntimeEventListener;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.fail;
@@ -77,6 +83,61 @@ public class RuleUnitProviderImplTest {
         }
     }
 
+    @Test
+    public void logicalAddByElement() {
+        // DROOLS-7583
+        LogicalAddByElementTestUnit unit = new LogicalAddByElementTestUnit();
+
+        ArrayList<String> eventsRecorded = new ArrayList<>();
+
+        RuleConfig ruleConfig = RuleUnitProvider.get().newRuleConfig();
+        ruleConfig.getRuleRuntimeListeners().add(new 
RuleRuntimeEventListener() {
+            @Override
+            public void objectInserted(ObjectInsertedEvent event) {
+                String byRuleName = Optional.ofNullable(event.getRule())
+                  .map(rule -> " by " + rule.getName())
+                  .orElse("");
+                eventsRecorded.add(event.getObject() + " inserted" + 
byRuleName);
+            }
+
+            @Override
+            public void objectUpdated(ObjectUpdatedEvent event) {
+            }
+
+            @Override
+            public void objectDeleted(ObjectDeletedEvent event) {
+                String byRuleName = Optional.ofNullable(event.getRule())
+                  .map(rule -> " by " + rule.getName())
+                  .orElse("");
+                eventsRecorded.add(event.getOldObject() + " deleted" + 
byRuleName);
+            }
+        });
+
+        try ( RuleUnitInstance<LogicalAddByElementTestUnit> unitInstance = 
RuleUnitProvider.get().createRuleUnitInstance(unit, ruleConfig) ) {
+
+            DataHandle handleToStringWithLength3 = 
unit.getStrings().add("abc");
+            unit.getStrings().add("len4");
+
+            assertThat(unitInstance.fire()).isEqualTo(4);
+
+            assertThat(eventsRecorded).containsExactly(
+              "abc inserted",
+              "len4 inserted",
+              "3 inserted by R1",
+              "4 inserted by R1");
+            assertThat(unit.getResults()).containsExactly("3 exists", "4 
exists");
+
+            eventsRecorded.clear();
+            unit.getResults().clear();
+
+            unit.getStrings().remove(handleToStringWithLength3);
+            assertThat(unitInstance.fire()).isEqualTo(0);
+
+            assertThat(eventsRecorded).doesNotContain("4 deleted");
+            assertThat(eventsRecorded).containsExactly("abc deleted", "3 
deleted");
+        }
+    }
+
     @Test
     public void update() {
         UpdateTestUnit unit = new UpdateTestUnit();
diff --git 
a/drools-ruleunits/drools-ruleunits-impl/src/test/resources/org/drools/ruleunits/impl/LogicalAddByElement.drl
 
b/drools-ruleunits/drools-ruleunits-impl/src/test/resources/org/drools/ruleunits/impl/LogicalAddByElement.drl
new file mode 100644
index 0000000000..7badb5d3ec
--- /dev/null
+++ 
b/drools-ruleunits/drools-ruleunits-impl/src/test/resources/org/drools/ruleunits/impl/LogicalAddByElement.drl
@@ -0,0 +1,35 @@
+/**
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.drools.ruleunits.impl;
+unit LogicalAddByElementTestUnit;
+
+rule R1 when
+    $s: /strings
+then
+    ints.addLogical($s.length());
+end
+
+rule R2 when
+    exists ( /ints[ this == 3] )
+then
+    results.add("3 exists");
+end
+
+rule R3 when
+    exists ( /ints[ this == 4] )
+then
+    results.add("4 exists");
+end
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to