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-drools.git


The following commit(s) were added to refs/heads/main by this push:
     new 43c20fedb6 [incubator-kie-drools-6529] executable-model misses to flag 
passive for a pattern with FromNode (#6530)
43c20fedb6 is described below

commit 43c20fedb651f8c000b6cffe101984fae58d28ee
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Thu Nov 27 13:50:43 2025 +0900

    [incubator-kie-drools-6529] executable-model misses to flag passive for a 
pattern with FromNode (#6530)
    
    * [incubator-kie-drools-6529] executable-model misses to flag passive for a 
pattern with FromNode
    - Traditional DRL test
    - RuleUnit test
    - Fix on ClassPatternDSL
    
    * minor fix
---
 .../codegen/execmodel/generator/RuleContext.java   |  6 ++-
 .../generator/visitor/pattern/ClassPatternDSL.java |  8 +++
 .../model/codegen/execmodel/util/PatternUtil.java  |  2 +-
 .../model/codegen/execmodel/ExisistentialTest.java | 28 ++++++++++
 .../ruleunits/impl/JoinFromExistsNotUnit.java      | 60 ++++++++++++++++++++++
 .../ruleunits/impl/TraditionalSyntaxTest.java      | 48 +++++++++++++++++
 .../impl/domain/{Person.java => Address.java}      | 46 ++++++++++++-----
 .../org/drools/ruleunits/impl/domain/Person.java   | 13 +++++
 .../drools/ruleunits/impl/JoinFromExistsNot.drl}   | 45 ++++++----------
 9 files changed, 210 insertions(+), 46 deletions(-)

diff --git 
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/RuleContext.java
 
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/RuleContext.java
index 16022f5f72..ff69bd90a8 100644
--- 
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/RuleContext.java
+++ 
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/RuleContext.java
@@ -363,7 +363,11 @@ public class RuleContext {
     }
 
     public Class<?> getRuleUnitVarType(String name) {
-        Class<?> varType = ruleUnitVars.get( name );
+        return ruleUnitVars.get( name );
+    }
+
+    public Class<?> getTypeFromRuleUnitVarsAndScopedDeclarations(String name) {
+        Class<?> varType = getRuleUnitVarType( name );
         if (varType != null) {
             return varType;
         }
diff --git 
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/pattern/ClassPatternDSL.java
 
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/pattern/ClassPatternDSL.java
index 03363c1fed..28dd6612c0 100644
--- 
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/pattern/ClassPatternDSL.java
+++ 
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/pattern/ClassPatternDSL.java
@@ -33,6 +33,7 @@ import com.github.javaparser.ast.expr.StringLiteralExpr;
 import org.drools.base.util.PropertyReactivityUtil;
 import org.drools.compiler.compiler.DescrBuildError;
 import org.drools.drl.ast.descr.BaseDescr;
+import org.drools.drl.ast.descr.FromDescr;
 import org.drools.drl.ast.descr.PatternDescr;
 import org.drools.drl.ast.descr.PatternSourceDescr;
 import org.drools.model.codegen.execmodel.PackageModel;
@@ -123,6 +124,13 @@ public class ClassPatternDSL extends PatternDSL {
 
         if (pattern.isQuery()) {
             patternExpression = new MethodCallExpr( patternExpression, 
PASSIVE_CALL );
+        } else if (pattern.getSource() instanceof FromDescr fromDescr) {
+            String dataSourceText = fromDescr.getDataSource().getText();
+            boolean isEntryPoint = context.hasEntryPoint(dataSourceText);
+            boolean isRuleUnitVar = context.getRuleUnitVarType(dataSourceText) 
!= null;
+            if (!isEntryPoint && !isRuleUnitVar) {
+                patternExpression = new MethodCallExpr( patternExpression, 
PASSIVE_CALL );
+            }
         }
 
         context.addExpression( addWatchToPattern( patternExpression ) );
diff --git 
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/util/PatternUtil.java
 
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/util/PatternUtil.java
index 7e960088db..1bc57f8e6c 100644
--- 
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/util/PatternUtil.java
+++ 
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/util/PatternUtil.java
@@ -70,7 +70,7 @@ public class PatternUtil {
             return queryParameter.get().getType().getCanonicalName();
         }
 
-        Class<?> ruleUnitVarType = 
context.getRuleUnitVarType(firstPart.getField());
+        Class<?> ruleUnitVarType = 
context.getTypeFromRuleUnitVarsAndScopedDeclarations(firstPart.getField());
         if (ruleUnitVarType == null) {
             throw new IllegalArgumentException("Unknown declaration: " + 
firstPart.getField());
         }
diff --git 
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/ExisistentialTest.java
 
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/ExisistentialTest.java
index c09c248c41..0faae46036 100644
--- 
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/ExisistentialTest.java
+++ 
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/ExisistentialTest.java
@@ -23,6 +23,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.commons.math3.util.Pair;
 import org.assertj.core.api.Assertions;
+import org.drools.model.codegen.execmodel.domain.Address;
 import org.drools.model.codegen.execmodel.domain.Person;
 import org.drools.model.codegen.execmodel.domain.Result;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -398,4 +399,31 @@ public class ExisistentialTest extends BaseModelTest {
         Assertions.assertThat(matchCount).hasValue(0);
         // Yet only one was removed.
     }
+
+    @ParameterizedTest
+    @MethodSource("parameters")
+    void joinFromExistsNot(RUN_TYPE runType) {
+        final String drl =
+                "import " + Person.class.getCanonicalName() + ";\n" +
+                        "import " + Address.class.getCanonicalName() + ";\n" +
+                        """
+                                rule R1
+                                when
+                                    String()
+                                    $person: Person()
+                                    exists Address(number > 18) from 
$person.addresses
+                                    not Integer()
+                                then
+                                end
+                                """;
+
+        KieSession ksession = getKieSession(runType, drl);
+
+        ksession.insert("test");
+        Person person = new Person();
+        Address address = new Address("ABC st.", 20, "London");
+        person.getAddresses().add(address);
+        ksession.insert(person);
+        assertThat(ksession.fireAllRules()).isEqualTo(1);
+    }
 }
diff --git 
a/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/JoinFromExistsNotUnit.java
 
b/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/JoinFromExistsNotUnit.java
new file mode 100644
index 0000000000..57ee51edf3
--- /dev/null
+++ 
b/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/JoinFromExistsNotUnit.java
@@ -0,0 +1,60 @@
+/*
+ * 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;
+import org.drools.ruleunits.impl.domain.Person;
+
+public class JoinFromExistsNotUnit implements RuleUnitData {
+    private final List<String> results = new ArrayList<>();
+    private final DataStore<Person> persons;
+    private final DataStore<String> strings;
+    private final DataStore<Integer> integers;
+
+    public JoinFromExistsNotUnit() {
+        this(DataSource.createStore(), DataSource.createStore(), 
DataSource.createStore());
+    }
+
+    public JoinFromExistsNotUnit(DataStore<Person> persons, DataStore<String> 
strings, DataStore<Integer> integers) {
+        this.persons = persons;
+        this.strings = strings;
+        this.integers = integers;
+    }
+
+    public DataStore<Person> getPersons() {
+        return persons;
+    }
+
+    public DataStore<String> getStrings() {
+        return strings;
+    }
+
+    public DataStore<Integer> getIntegers() {
+        return integers;
+    }
+
+    public List<String> getResults() {
+        return results;
+    }
+}
diff --git 
a/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/TraditionalSyntaxTest.java
 
b/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/TraditionalSyntaxTest.java
new file mode 100644
index 0000000000..4fab8719d0
--- /dev/null
+++ 
b/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/TraditionalSyntaxTest.java
@@ -0,0 +1,48 @@
+/*
+ * 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 org.drools.ruleunits.api.RuleUnitInstance;
+import org.drools.ruleunits.api.RuleUnitProvider;
+import org.drools.ruleunits.impl.domain.Address;
+import org.drools.ruleunits.impl.domain.Person;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * This test uses RuleUnit with the traditional DRL syntax.
+ */
+class TraditionalSyntaxTest {
+
+    @Test
+    void joinFromExistsNot() {
+        JoinFromExistsNotUnit unit = new JoinFromExistsNotUnit();
+        unit.getStrings().add("test");
+
+        Person person = new Person("John", 30);
+        Address address = new Address("ABC st.", 20, "London");
+        person.getAddresses().add(address);
+        unit.getPersons().add(person);
+
+        try ( RuleUnitInstance<JoinFromExistsNotUnit> unitInstance = 
RuleUnitProvider.get().createRuleUnitInstance(unit) ) {
+            assertThat(unitInstance.fire()).isEqualTo(1);
+        }
+    }
+}
diff --git 
a/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/domain/Person.java
 
b/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/domain/Address.java
similarity index 52%
copy from 
drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/domain/Person.java
copy to 
drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/domain/Address.java
index 1a2accf36f..b1fa99305f 100644
--- 
a/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/domain/Person.java
+++ 
b/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/domain/Address.java
@@ -18,30 +18,48 @@
  */
 package org.drools.ruleunits.impl.domain;
 
-public class Person {
+public class Address {
 
-    private String name;
+    private String street;
+    private int number;
+    private String city;
 
-    private int age;
+    public Address() {
+        this("", 0, "");
+    }
+
+    public Address(String city) {
+        this("", 0, city);
+    }
+
+    public Address(final String street, final int number, final String city) {
+        super();
+        this.street = street;
+        this.number = number;
+        this.city = city;
+    }
+
+    public String getStreet() {
+        return street;
+    }
 
-    public Person(String name, int age) {
-        this.name = name;
-        this.age = age;
+    public void setStreet(final String street) {
+        this.street = street;
     }
 
-    public String getName() {
-        return name;
+    public int getNumber() {
+        return number;
     }
 
-    public void setName(String name) {
-        this.name = name;
+    public void setNumber(final int number) {
+        this.number = number;
     }
 
-    public int getAge() {
-        return age;
+    public String getCity() {
+        return city;
     }
 
-    public void setAge(int age) {
-        this.age = age;
+    public void setCity(final String city) {
+        this.city = city;
     }
 }
diff --git 
a/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/domain/Person.java
 
b/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/domain/Person.java
index 1a2accf36f..1f3c7cb5ec 100644
--- 
a/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/domain/Person.java
+++ 
b/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/domain/Person.java
@@ -18,12 +18,17 @@
  */
 package org.drools.ruleunits.impl.domain;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class Person {
 
     private String name;
 
     private int age;
 
+    private List<Address> addresses = new ArrayList<>();
+
     public Person(String name, int age) {
         this.name = name;
         this.age = age;
@@ -44,4 +49,12 @@ public class Person {
     public void setAge(int age) {
         this.age = age;
     }
+
+    public List<Address> getAddresses() {
+        return addresses;
+    }
+
+    public void setAddresses(List<Address> addresses) {
+        this.addresses = addresses;
+    }
 }
diff --git 
a/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/domain/Person.java
 
b/drools-ruleunits/drools-ruleunits-impl/src/test/resources/org/drools/ruleunits/impl/JoinFromExistsNot.drl
similarity index 63%
copy from 
drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/domain/Person.java
copy to 
drools-ruleunits/drools-ruleunits-impl/src/test/resources/org/drools/ruleunits/impl/JoinFromExistsNot.drl
index 1a2accf36f..6a2954d960 100644
--- 
a/drools-ruleunits/drools-ruleunits-impl/src/test/java/org/drools/ruleunits/impl/domain/Person.java
+++ 
b/drools-ruleunits/drools-ruleunits-impl/src/test/resources/org/drools/ruleunits/impl/JoinFromExistsNot.drl
@@ -1,4 +1,4 @@
-/*
+/**
  * 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
@@ -16,32 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.drools.ruleunits.impl.domain;
-
-public class Person {
-
-    private String name;
-
-    private int age;
-
-    public Person(String name, int age) {
-        this.name = name;
-        this.age = age;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public int getAge() {
-        return age;
-    }
-
-    public void setAge(int age) {
-        this.age = age;
-    }
-}
+package org.drools.ruleunits.impl;
+unit JoinFromExistsNotUnit;
+
+import org.drools.ruleunits.impl.domain.Person;
+import org.drools.ruleunits.impl.domain.Address;
+
+rule R1
+when
+    String() from entry-point strings
+    $person: Person() from entry-point persons
+    exists Address(number > 18) from $person.addresses
+    not Integer() from entry-point integers
+then
+end
\ No newline at end of file


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

Reply via email to