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]

Reply via email to