This is an automated email from the ASF dual-hosted git repository.
tkobayas pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie.git
The following commit(s) were added to refs/heads/main by this push:
new 67f28bff6fb [incubator-kie-6911] RuleUnit DSL does not apply
RuleConfig clock type to session (#7080)
67f28bff6fb is described below
commit 67f28bff6fb9cfd4b1e515a35562b53bd6561eb2
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Thu Sep 10 18:04:35 2026 +0900
[incubator-kie-6911] RuleUnit DSL does not apply RuleConfig clock type to
session (#7080)
* [incubator-kie-6911] RuleUnit DSL does not apply RuleConfig clock type to
session
* - Do not modify sessionConfig from kbase
- avoid RuleConfigImpl cast
---
.../ruleunits/dsl/RuleUnitProviderForDSL.java | 13 +++++++-
.../org/drools/ruleunits/dsl/RuleUnitsTest.java | 27 ++++++++++++++++
.../ruleunits/dsl/attribute/CalendarsUnit.java | 19 ++++++------
.../dsl/attribute/RuleUnitsAttributesTest.java | 36 +++++++++++++++++-----
4 files changed, 77 insertions(+), 18 deletions(-)
diff --git
a/drools-ruleunits/drools-ruleunits-dsl/src/main/java/org/drools/ruleunits/dsl/RuleUnitProviderForDSL.java
b/drools-ruleunits/drools-ruleunits-dsl/src/main/java/org/drools/ruleunits/dsl/RuleUnitProviderForDSL.java
index 51c4ab83a39..6b8896244c8 100644
---
a/drools-ruleunits/drools-ruleunits-dsl/src/main/java/org/drools/ruleunits/dsl/RuleUnitProviderForDSL.java
+++
b/drools-ruleunits/drools-ruleunits-dsl/src/main/java/org/drools/ruleunits/dsl/RuleUnitProviderForDSL.java
@@ -18,8 +18,11 @@
*/
package org.drools.ruleunits.dsl;
+import org.drools.core.ClockType;
+import org.drools.core.SessionConfiguration;
import org.drools.core.common.ReteEvaluator;
import org.drools.core.impl.InternalRuleBase;
+import org.drools.core.impl.RuleBaseFactory;
import org.drools.core.reteoo.ReteDumper;
import org.drools.model.Model;
import org.drools.modelcompiler.KieBaseBuilder;
@@ -74,7 +77,15 @@ public class RuleUnitProviderForDSL extends
RuleUnitProviderImpl {
@Override
public RuleUnitInstance<T> internalCreateInstance(T data, RuleConfig
ruleConfig) {
- ReteEvaluator reteEvaluator = new RuleUnitExecutorImpl(ruleBase);
+ ReteEvaluator reteEvaluator;
+ org.drools.ruleunits.api.conf.ClockType clockType =
ruleConfig.getClockType();
+ if (clockType != null) {
+ SessionConfiguration sessionConfiguration =
RuleBaseFactory.newKnowledgeSessionConfiguration().as(SessionConfiguration.KEY);
+ sessionConfiguration.setClockType(clockType ==
org.drools.ruleunits.api.conf.ClockType.PSEUDO ? ClockType.PSEUDO_CLOCK :
ClockType.REALTIME_CLOCK);
+ reteEvaluator = new RuleUnitExecutorImpl(ruleBase,
sessionConfiguration);
+ } else {
+ reteEvaluator = new RuleUnitExecutorImpl(ruleBase);
+ }
return new DSLRuleUnitInstance<>(this, data, reteEvaluator,
unitGlobalsResolver, ruleConfig);
}
}
diff --git
a/drools-ruleunits/drools-ruleunits-dsl/src/test/java/org/drools/ruleunits/dsl/RuleUnitsTest.java
b/drools-ruleunits/drools-ruleunits-dsl/src/test/java/org/drools/ruleunits/dsl/RuleUnitsTest.java
index d3aaa3de9bb..6d3abbc082f 100644
---
a/drools-ruleunits/drools-ruleunits-dsl/src/test/java/org/drools/ruleunits/dsl/RuleUnitsTest.java
+++
b/drools-ruleunits/drools-ruleunits-dsl/src/test/java/org/drools/ruleunits/dsl/RuleUnitsTest.java
@@ -22,10 +22,12 @@ import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import org.drools.core.base.RuleNameStartsWithAgendaFilter;
+import org.drools.core.time.impl.JDKTimerService;
import org.drools.ruleunits.api.DataHandle;
import org.drools.ruleunits.api.DataProcessor;
import org.drools.ruleunits.api.RuleUnitInstance;
import org.drools.ruleunits.api.RuleUnitProvider;
+import org.drools.ruleunits.api.conf.ClockType;
import org.drools.ruleunits.api.conf.RuleConfig;
import org.drools.ruleunits.dsl.domain.Cheese;
import org.drools.ruleunits.dsl.domain.Person;
@@ -34,6 +36,8 @@ import
org.drools.ruleunits.impl.listener.TestRuleEventListener;
import org.drools.ruleunits.impl.listener.TestRuleRuntimeEventListener;
import org.junit.jupiter.api.Test;
import org.kie.api.runtime.rule.FactHandle;
+import org.kie.api.time.SessionClock;
+import org.kie.api.time.SessionPseudoClock;
import static org.assertj.core.api.Assertions.assertThat;
@@ -331,6 +335,29 @@ public class RuleUnitsTest {
}
}
+ @Test
+ public void pseudoClockDoesNotAffectSubsequentDefaultInstance() {
+ HelloWorldUnit unit1 = new HelloWorldUnit();
+ unit1.getStrings().add("Hello World");
+
+ RuleConfig pseudoConfig = RuleUnitProvider.get().newRuleConfig();
+ pseudoConfig.setClockType(ClockType.PSEUDO);
+
+ try (RuleUnitInstance<HelloWorldUnit> pseudoInstance =
RuleUnitProvider.get().createRuleUnitInstance(unit1, pseudoConfig)) {
+ SessionClock clock1 = pseudoInstance.getClock();
+ assertThat(clock1).isInstanceOf(SessionPseudoClock.class);
+ }
+
+ HelloWorldUnit unit2 = new HelloWorldUnit();
+ unit2.getStrings().add("Hello World");
+
+ try (RuleUnitInstance<HelloWorldUnit> defaultInstance =
RuleUnitProvider.get().createRuleUnitInstance(unit2)) {
+ SessionClock clock2 = defaultInstance.getClock();
+ assertThat(clock2).isNotInstanceOf(SessionPseudoClock.class);
+ assertThat(clock2).isInstanceOf(JDKTimerService.class);
+ }
+ }
+
@Test
public void fireWithAgendaFilter() {
RuleNameUnit unit = new RuleNameUnit();
diff --git
a/drools-ruleunits/drools-ruleunits-dsl/src/test/java/org/drools/ruleunits/dsl/attribute/CalendarsUnit.java
b/drools-ruleunits/drools-ruleunits-dsl/src/test/java/org/drools/ruleunits/dsl/attribute/CalendarsUnit.java
index 415685dffc6..66aebaea427 100644
---
a/drools-ruleunits/drools-ruleunits-dsl/src/test/java/org/drools/ruleunits/dsl/attribute/CalendarsUnit.java
+++
b/drools-ruleunits/drools-ruleunits-dsl/src/test/java/org/drools/ruleunits/dsl/attribute/CalendarsUnit.java
@@ -25,24 +25,25 @@ import org.drools.ruleunits.api.DataSource;
import org.drools.ruleunits.api.DataStore;
import org.drools.ruleunits.dsl.RuleUnitDefinition;
import org.drools.ruleunits.dsl.RulesFactory;
+import org.drools.ruleunits.dsl.domain.Person;
-import static org.drools.model.Index.ConstraintType.EQUAL;
+import static org.drools.model.Index.ConstraintType.GREATER_THAN;
public class CalendarsUnit implements RuleUnitDefinition {
- private final DataStore<String> strings;
+ private final DataStore<Person> persons;
private final List<String> results = new ArrayList<>();
public CalendarsUnit() {
this(DataSource.createStore());
}
- public CalendarsUnit(DataStore<String> strings) {
- this.strings = strings;
+ public CalendarsUnit(DataStore<Person> persons) {
+ this.persons = persons;
}
- public DataStore<String> getStrings() {
- return strings;
+ public DataStore<Person> getPersons() {
+ return persons;
}
public List<String> getResults() {
@@ -53,8 +54,8 @@ public class CalendarsUnit implements RuleUnitDefinition {
public void defineRules(RulesFactory rulesFactory) {
rulesFactory.rule("CalendarRule")
.calendars("myCalendar")
- .on(strings)
- .filter(EQUAL, "Hello World")
- .execute(results, r -> r.add("calendar fired"));
+ .on(persons)
+ .filter(Person::getAge, GREATER_THAN, 18)
+ .execute(results, (r, p) -> r.add("calendar fired: " +
p.getName()));
}
}
diff --git
a/drools-ruleunits/drools-ruleunits-dsl/src/test/java/org/drools/ruleunits/dsl/attribute/RuleUnitsAttributesTest.java
b/drools-ruleunits/drools-ruleunits-dsl/src/test/java/org/drools/ruleunits/dsl/attribute/RuleUnitsAttributesTest.java
index e2ffb14c0e0..32a7c447ced 100644
---
a/drools-ruleunits/drools-ruleunits-dsl/src/test/java/org/drools/ruleunits/dsl/attribute/RuleUnitsAttributesTest.java
+++
b/drools-ruleunits/drools-ruleunits-dsl/src/test/java/org/drools/ruleunits/dsl/attribute/RuleUnitsAttributesTest.java
@@ -18,12 +18,17 @@
*/
package org.drools.ruleunits.dsl.attribute;
+import java.util.concurrent.TimeUnit;
+
import org.drools.core.common.ReteEvaluator;
import org.drools.ruleunits.api.RuleUnitInstance;
import org.drools.ruleunits.api.RuleUnitProvider;
+import org.drools.ruleunits.api.conf.ClockType;
+import org.drools.ruleunits.api.conf.RuleConfig;
import org.drools.ruleunits.dsl.domain.Person;
import org.drools.ruleunits.impl.AbstractRuleUnitInstance;
import org.junit.jupiter.api.Test;
+import org.kie.api.time.SessionPseudoClock;
import static org.assertj.core.api.Assertions.assertThat;
@@ -31,30 +36,45 @@ public class RuleUnitsAttributesTest {
@Test
public void timer() {
- // incubator-kie#6911: RuleUnit DSL does not apply RuleConfig clock
type, so pseudo clock cannot be used here.
- // When fixed, use pseudo clock to advance time and verify the timer
rule fires after the delay.
TimerUnit unit = new TimerUnit();
unit.getStrings().add("Hello Timer");
- try (RuleUnitInstance<TimerUnit> unitInstance =
RuleUnitProvider.get().createRuleUnitInstance(unit)) {
+ RuleConfig ruleConfig = RuleUnitProvider.get().newRuleConfig();
+ ruleConfig.setClockType(ClockType.PSEUDO);
+
+ try (RuleUnitInstance<TimerUnit> unitInstance =
RuleUnitProvider.get().createRuleUnitInstance(unit, ruleConfig)) {
+ SessionPseudoClock pseudoClock = unitInstance.getClock();
+
assertThat(unitInstance.fire()).isZero();
assertThat(unit.getResults()).isEmpty();
+
+ pseudoClock.advanceTime(40L, TimeUnit.MINUTES);
+ assertThat(unitInstance.fire()).isEqualTo(1);
+ assertThat(unit.getResults()).containsExactly("timer fired");
}
}
@Test
public void calendars() {
- // incubator-kie#6911: RuleUnit DSL does not apply RuleConfig clock
type, so pseudo clock cannot be used here.
- // When fixed, use pseudo clock to also test calendar + timer
combination.
CalendarsUnit unit = new CalendarsUnit();
- try (RuleUnitInstance<CalendarsUnit> unitInstance =
RuleUnitProvider.get().createRuleUnitInstance(unit)) {
+ RuleConfig ruleConfig = RuleUnitProvider.get().newRuleConfig();
+ ruleConfig.setClockType(ClockType.PSEUDO);
+
+ try (RuleUnitInstance<CalendarsUnit> unitInstance =
RuleUnitProvider.get().createRuleUnitInstance(unit, ruleConfig)) {
+ SessionPseudoClock pseudoClock = unitInstance.getClock();
+ long cutoff = 60_000L;
ReteEvaluator evaluator = (ReteEvaluator)
((AbstractRuleUnitInstance) unitInstance).getEvaluator();
- evaluator.getCalendars().set("myCalendar", timestamp -> false);
+ evaluator.getCalendars().set("myCalendar", timestamp -> timestamp
>= cutoff);
- unit.getStrings().add("Hello World");
+ unit.getPersons().add(new Person("Mario", 40));
assertThat(unitInstance.fire()).isZero();
assertThat(unit.getResults()).isEmpty();
+
+ pseudoClock.advanceTime(1L, TimeUnit.MINUTES);
+ unit.getPersons().add(new Person("Toshiya", 50));
+ assertThat(unitInstance.fire()).isEqualTo(1);
+ assertThat(unit.getResults()).containsExactly("calendar fired:
Toshiya");
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]