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]

Reply via email to