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]