From 425c77f012aa223be0f618f72206171074e829d1 Mon Sep 17 00:00:00 2001 From: Toshiya Kobayashi Date: Wed, 23 Dec 2020 17:53:55 +0900 Subject: [PATCH] [DROOLS-5916] Wrong BetaIndex with Or in executable-model (#3300) --- .../constraints/LambdaConstraint.java | 4 ++- .../java/org/drools/modelcompiler/OrTest.java | 27 ++++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/constraints/LambdaConstraint.java b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/constraints/LambdaConstraint.java index a5fa6f84e31..fe6225db757 100644 --- a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/constraints/LambdaConstraint.java +++ b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/constraints/LambdaConstraint.java @@ -90,7 +90,9 @@ public Declaration[] getRequiredDeclarations() { @Override public void replaceDeclaration(Declaration oldDecl, Declaration newDecl) { evaluator.replaceDeclaration( oldDecl, newDecl ); - this.indexingDeclaration = newDecl; + if (indexingDeclaration == oldDecl) { + this.indexingDeclaration = newDecl; + } } @Override diff --git a/drools-model/drools-model-compiler/src/test/java/org/drools/modelcompiler/OrTest.java b/drools-model/drools-model-compiler/src/test/java/org/drools/modelcompiler/OrTest.java index 822698ccb04..af97a1ee186 100644 --- a/drools-model/drools-model-compiler/src/test/java/org/drools/modelcompiler/OrTest.java +++ b/drools-model/drools-model-compiler/src/test/java/org/drools/modelcompiler/OrTest.java @@ -24,8 +24,6 @@ import org.drools.modelcompiler.domain.Employee; import org.drools.modelcompiler.domain.Person; import org.junit.Test; -import org.kie.api.builder.KieBuilder; -import org.kie.api.builder.Message; import org.kie.api.builder.Results; import org.kie.api.runtime.KieSession; @@ -60,7 +58,30 @@ public void testOr() { ksession.insert( new Person( "Mark", 37 ) ); ksession.insert( new Person( "Edson", 35 ) ); ksession.insert( new Person( "Mario", 40 ) ); - ksession.fireAllRules(); + assertEquals(1, ksession.fireAllRules()); + } + + @Test + public void testOrWithBetaIndex() { + String str = + "import " + Person.class.getCanonicalName() + ";" + + "rule R when\n" + + " $p : Person(name == \"Mark\") or\n" + + " ( $mark : Person(name == \"Mark\")\n" + + " and\n" + + " $p : Person(age == $mark.age) )\n" + + " $s: String(this == $p.name)\n" + + "then\n" + + " System.out.println(\"Found: \" + $s);\n" + + "end"; + + KieSession ksession = getKieSession(str); + + ksession.insert("Mario"); + ksession.insert(new Person("Mark", 37)); + ksession.insert(new Person("Edson", 35)); + ksession.insert(new Person("Mario", 37)); + assertEquals(1, ksession.fireAllRules()); } @Test