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]