This is an automated email from the ASF dual-hosted git repository.
tkobayas pushed a commit to branch dev-new-parser
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git
The following commit(s) were added to refs/heads/dev-new-parser by this push:
new dce66dee42 [incubator-kie-drools-5945] [new-parser] Broken named
consequences inside OR (#5950)
dce66dee42 is described below
commit dce66dee4293c02b724675667163fa9da8ea4ba8
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Wed May 15 18:07:58 2024 +0900
[incubator-kie-drools-5945] [new-parser] Broken named consequences inside
OR (#5950)
* Tests for incubator-kie-drools-5945
* [incubator-kie-drools-5945] [new-parser] Broken named consequences inside
OR
---------
Co-authored-by: Jiří Locker <[email protected]>
---
.../drl/parser/antlr4/MiscDRLParserTest.java | 92 ++++++++++++++++++++++
.../drools/drl/parser/antlr4/DRLVisitorImpl.java | 15 +++-
2 files changed, 105 insertions(+), 2 deletions(-)
diff --git
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
index 8075c89aed..bf553765e2 100644
---
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
+++
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
@@ -4657,6 +4657,98 @@ class MiscDRLParserTest {
assertThat(namedConsequenceDescr.getName()).isEqualTo("FoundMarkOrMario");
}
+ @Test
+ void testNamedConsequencesInsideOR1() {
+ final String text =
+ "import org.drools.mvel.compiler.Cheese;\n " +
+ "global java.util.List results;\n" +
+ "\n" +
+ "rule R1 when\n" +
+ " ( $a: Cheese ( type == \"stilton\" ) do[t1]\n" +
+ " or\n" +
+ " $b: Cheese ( type == \"gorgonzola\" ) )\n" +
+ " $c: Cheese ( type == \"cheddar\" )\n" +
+ "then\n" +
+ " results.add( $c.getType() );\n" +
+ "then[t1]\n" +
+ " results.add( $a.getType() );\n" +
+ "end\n";
+ PackageDescr packageDescr = parseAndGetPackageDescr(text);
+ RuleDescr ruleDescr = packageDescr.getRules().get(0);
+
+ assertThat(ruleDescr.getLhs().getDescrs()).hasSize(2);
+
assertThat(ruleDescr.getLhs().getDescrs()).first().isInstanceOfSatisfying(OrDescr.class,
stiltonOrGorgonzola -> {
+ assertThat(stiltonOrGorgonzola.getDescrs()).hasSize(2);
+
assertThat(stiltonOrGorgonzola.getDescrs()).first().isInstanceOfSatisfying(AndDescr.class,
andDescr -> {
+ assertThat(andDescr.getDescrs()).hasSize(2);
+
assertThat(andDescr.getDescrs()).first().isInstanceOfSatisfying(PatternDescr.class,
stilton -> {
+ assertThat(stilton.getIdentifier()).isEqualTo("$a");
+ assertThat(stilton.getObjectType()).isEqualTo("Cheese");
+
assertThat(stilton.getConstraint().toString()).contains("stilton");
+ });
+
assertThat(andDescr.getDescrs()).last().isInstanceOfSatisfying(NamedConsequenceDescr.class,
namedConsequenceDescr -> {
+
assertThat(namedConsequenceDescr.getName()).isEqualTo("t1");
+ });
+ });
+
assertThat(stiltonOrGorgonzola.getDescrs()).last().isInstanceOfSatisfying(PatternDescr.class,
gorgonzola -> {
+ assertThat(gorgonzola.getIdentifier()).isEqualTo("$b");
+ assertThat(gorgonzola.getObjectType()).isEqualTo("Cheese");
+
assertThat(gorgonzola.getConstraint().toString()).contains("gorgonzola");
+ });
+ });
+
assertThat(ruleDescr.getLhs().getDescrs()).last().isInstanceOfSatisfying(PatternDescr.class,
cheddar -> {
+ assertThat(cheddar.getIdentifier()).isEqualTo("$c");
+ assertThat(cheddar.getObjectType()).isEqualTo("Cheese");
+ assertThat(cheddar.getConstraint().toString()).contains("cheddar");
+ });
+ }
+
+ @Test
+ void testNamedConsequencesInsideOR2() {
+ final String text =
+ "import org.drools.mvel.compiler.Cheese;\n " +
+ "global java.util.List results;\n" +
+ "\n" +
+ "rule R1 when\n" +
+ " ( $a: Cheese ( type == \"stilton\" )\n" +
+ " or\n" +
+ " $b: Cheese ( type == \"gorgonzola\" ) do[t1] )\n"
+
+ " $c: Cheese ( type == \"cheddar\" )\n" +
+ "then\n" +
+ " results.add( $c.getType() );\n" +
+ "then[t1]\n" +
+ " results.add( $b.getType() );\n" +
+ "end\n";
+ PackageDescr packageDescr = parseAndGetPackageDescr(text);
+ RuleDescr ruleDescr = packageDescr.getRules().get(0);
+
+ assertThat(ruleDescr.getLhs().getDescrs()).hasSize(2);
+
assertThat(ruleDescr.getLhs().getDescrs()).first().isInstanceOfSatisfying(OrDescr.class,
stiltonOrGorgonzola -> {
+ assertThat(stiltonOrGorgonzola.getDescrs()).hasSize(2);
+
assertThat(stiltonOrGorgonzola.getDescrs()).first().isInstanceOfSatisfying(PatternDescr.class,
stilton -> {
+ assertThat(stilton.getIdentifier()).isEqualTo("$a");
+ assertThat(stilton.getObjectType()).isEqualTo("Cheese");
+
assertThat(stilton.getConstraint().toString()).contains("stilton");
+ });
+
assertThat(stiltonOrGorgonzola.getDescrs()).last().isInstanceOfSatisfying(AndDescr.class,
andDescr -> {
+ assertThat(andDescr.getDescrs()).hasSize(2);
+
assertThat(andDescr.getDescrs()).first().isInstanceOfSatisfying(PatternDescr.class,
gorgonzola -> {
+ assertThat(gorgonzola.getIdentifier()).isEqualTo("$b");
+ assertThat(gorgonzola.getObjectType()).isEqualTo("Cheese");
+
assertThat(gorgonzola.getConstraint().toString()).contains("gorgonzola");
+ });
+
assertThat(andDescr.getDescrs()).last().isInstanceOfSatisfying(NamedConsequenceDescr.class,
namedConsequenceDescr -> {
+
assertThat(namedConsequenceDescr.getName()).isEqualTo("t1");
+ });
+ });
+ });
+
assertThat(ruleDescr.getLhs().getDescrs()).last().isInstanceOfSatisfying(PatternDescr.class,
cheddar -> {
+ assertThat(cheddar.getIdentifier()).isEqualTo("$c");
+ assertThat(cheddar.getObjectType()).isEqualTo("Cheese");
+ assertThat(cheddar.getConstraint().toString()).contains("cheddar");
+ });
+ }
+
@Test
public void queryComplexLhs() {
final String text = "query isContainedIn(String x, String y)\n" +
diff --git
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
index 49a527612a..7001beed64 100644
---
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
+++
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
@@ -1078,8 +1078,19 @@ public class DRLVisitorImpl extends
DRLParserBaseVisitor<Object> {
}
@Override
- public List<BaseDescr> visitLhsUnary(DRLParser.LhsUnaryContext ctx) {
- return visitDescrChildren(ctx); // lhsUnary may have
consequenceInvocation, so not always a single child
+ public BaseDescr visitLhsUnary(DRLParser.LhsUnaryContext ctx) {
+ List<BaseDescr> children = visitDescrChildren(ctx);
+ if (children.size() > 1) {
+ // lhsUnary may have multiple children e.g. consequenceInvocation,
connect with AND
+ AndDescr andDescr = BaseDescrFactory.builder(new AndDescr())
+ .withParserRuleContext(ctx)
+ .build();
+ children.forEach(andDescr::addDescr);
+ return andDescr;
+ } else {
+ // size == 1. children never be empty
+ return children.get(0);
+ }
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]