This is an automated email from the ASF dual-hosted git repository.

mariofusco 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 d57c5da8b7 [incubator-kie-drools-5879] [new-parser] build failure on 
kie-dmn-val… (#5899)
d57c5da8b7 is described below

commit d57c5da8b785bca3f35e6a32297bc3ba7a69843b
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Wed May 8 16:20:38 2024 +0900

    [incubator-kie-drools-5879] [new-parser] build failure on kie-dmn-val… 
(#5899)
    
    * [incubator-kie-drools-5879] [new-parser] build failure on 
kie-dmn-validation
    - WIP
    - test case only
    
    * - nongreedy subrule
    
    * - Add tests
    - also fix andRestriction
---
 .../drl/parser/antlr4/DRLExprParserTest.java       | 108 ++++++++++++++++++++-
 .../drl/parser/antlr4/MiscDRLParserTest.java       |  56 +++++++++++
 .../drools/drl/parser/antlr4/DRL6Expressions.g4    |   4 +-
 .../model/codegen/execmodel/CompilerTest.java      |  58 +++++++++++
 4 files changed, 221 insertions(+), 5 deletions(-)

diff --git 
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/DRLExprParserTest.java
 
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/DRLExprParserTest.java
index 7a866ec284..2a6d4e96a6 100644
--- 
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/DRLExprParserTest.java
+++ 
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/DRLExprParserTest.java
@@ -18,9 +18,6 @@
  */
 package org.drools.drl.parser.antlr4;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assumptions.assumeFalse;
-
 import java.util.Arrays;
 import java.util.List;
 
@@ -43,6 +40,9 @@ import org.junit.jupiter.params.provider.EnumSource;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.kie.internal.builder.conf.LanguageLevelOption;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assumptions.assumeFalse;
+
 /**
  * DRLExprTreeTest
  */
@@ -462,4 +462,106 @@ public class DRLExprParserTest {
             assertThat(parser.hasErrors()).isFalse();
         }
     }
+
+    @Test
+    void orWithMethodCall() {
+        String source = "value == 10 || someMethod() == 4";
+        ConstraintConnectiveDescr result = parser.parse(source);
+        
assertThat(parser.hasErrors()).as(parser.getErrors().toString()).isFalse();
+
+        assertThat(result.getConnective()).isEqualTo(ConnectiveType.AND); // 
root is AND
+        assertThat(result.getDescrs().size()).isEqualTo(1);
+        ConstraintConnectiveDescr or = (ConstraintConnectiveDescr) 
result.getDescrs().get(0);
+        assertThat(or.getConnective()).isEqualTo(ConnectiveType.OR);
+        assertThat(or.getDescrs().size()).isEqualTo(2);
+
+        RelationalExprDescr expr = (RelationalExprDescr) or.getDescrs().get(0);
+        assertThat(expr.getOperator()).isEqualTo("==");
+        AtomicExprDescr left = (AtomicExprDescr) expr.getLeft();
+        AtomicExprDescr right = (AtomicExprDescr) expr.getRight();
+        assertThat(left.getExpression()).isEqualTo("value");
+        assertThat(right.getExpression()).isEqualTo("10");
+
+        expr = (RelationalExprDescr) or.getDescrs().get(1);
+        assertThat(expr.getOperator()).isEqualTo("==");
+        left = (AtomicExprDescr) expr.getLeft();
+        right = (AtomicExprDescr) expr.getRight();
+        assertThat(left.getExpression()).isEqualTo("someMethod()");
+        assertThat(right.getExpression()).isEqualTo("4");
+    }
+
+    @Test
+    void orWithMethodCallWithArg() {
+        String source = "value == 10 || someMethod(value) == 4";
+        ConstraintConnectiveDescr result = parser.parse(source);
+        
assertThat(parser.hasErrors()).as(parser.getErrors().toString()).isFalse();
+
+        assertThat(result.getConnective()).isEqualTo(ConnectiveType.AND); // 
root is AND
+        assertThat(result.getDescrs().size()).isEqualTo(1);
+        ConstraintConnectiveDescr or = (ConstraintConnectiveDescr) 
result.getDescrs().get(0);
+        assertThat(or.getConnective()).isEqualTo(ConnectiveType.OR);
+        assertThat(or.getDescrs().size()).isEqualTo(2);
+
+        RelationalExprDescr expr = (RelationalExprDescr) or.getDescrs().get(0);
+        assertThat(expr.getOperator()).isEqualTo("==");
+        AtomicExprDescr left = (AtomicExprDescr) expr.getLeft();
+        AtomicExprDescr right = (AtomicExprDescr) expr.getRight();
+        assertThat(left.getExpression()).isEqualTo("value");
+        assertThat(right.getExpression()).isEqualTo("10");
+
+        expr = (RelationalExprDescr) or.getDescrs().get(1);
+        assertThat(expr.getOperator()).isEqualTo("==");
+        left = (AtomicExprDescr) expr.getLeft();
+        right = (AtomicExprDescr) expr.getRight();
+        assertThat(left.getExpression()).isEqualTo("someMethod(value)");
+        assertThat(right.getExpression()).isEqualTo("4");
+    }
+
+    @Test
+    void andWithMethodCall() {
+        String source = "value == 10 && someMethod() == 4";
+        ConstraintConnectiveDescr result = parser.parse(source);
+        
assertThat(parser.hasErrors()).as(parser.getErrors().toString()).isFalse();
+
+        assertThat(result.getConnective()).isEqualTo(ConnectiveType.AND);
+        assertThat(result.getDescrs().size()).isEqualTo(2);
+
+        RelationalExprDescr expr = (RelationalExprDescr) 
result.getDescrs().get(0);
+        assertThat(expr.getOperator()).isEqualTo("==");
+        AtomicExprDescr left = (AtomicExprDescr) expr.getLeft();
+        AtomicExprDescr right = (AtomicExprDescr) expr.getRight();
+        assertThat(left.getExpression()).isEqualTo("value");
+        assertThat(right.getExpression()).isEqualTo("10");
+
+        expr = (RelationalExprDescr) result.getDescrs().get(1);
+        assertThat(expr.getOperator()).isEqualTo("==");
+        left = (AtomicExprDescr) expr.getLeft();
+        right = (AtomicExprDescr) expr.getRight();
+        assertThat(left.getExpression()).isEqualTo("someMethod()");
+        assertThat(right.getExpression()).isEqualTo("4");
+    }
+
+    @Test
+    void andWithMethodCallWithArg() {
+        String source = "value == 10 && someMethod(value) == 4";
+        ConstraintConnectiveDescr result = parser.parse(source);
+        
assertThat(parser.hasErrors()).as(parser.getErrors().toString()).isFalse();
+
+        assertThat(result.getConnective()).isEqualTo(ConnectiveType.AND);
+        assertThat(result.getDescrs().size()).isEqualTo(2);
+
+        RelationalExprDescr expr = (RelationalExprDescr) 
result.getDescrs().get(0);
+        assertThat(expr.getOperator()).isEqualTo("==");
+        AtomicExprDescr left = (AtomicExprDescr) expr.getLeft();
+        AtomicExprDescr right = (AtomicExprDescr) expr.getRight();
+        assertThat(left.getExpression()).isEqualTo("value");
+        assertThat(right.getExpression()).isEqualTo("10");
+
+        expr = (RelationalExprDescr) result.getDescrs().get(1);
+        assertThat(expr.getOperator()).isEqualTo("==");
+        left = (AtomicExprDescr) expr.getLeft();
+        right = (AtomicExprDescr) expr.getRight();
+        assertThat(left.getExpression()).isEqualTo("someMethod(value)");
+        assertThat(right.getExpression()).isEqualTo("4");
+    }
 }
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 376af150e5..94802923bb 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
@@ -136,6 +136,14 @@ class MiscDRLParserTest {
         return pkg.getRules().get(0);
     }
 
+    private ExprConstraintDescr parseAndGetFirstConstraintDescr(String drl) {
+        RuleDescr rule = parseAndGetFirstRuleDescr(drl);
+        
assertThat(rule.getLhs().getDescrs().get(0)).isInstanceOf(PatternDescr.class);
+        PatternDescr patternDescr = (PatternDescr) 
rule.getLhs().getDescrs().get(0);
+        
assertThat(patternDescr.getConstraint().getDescrs().get(0)).isInstanceOf(ExprConstraintDescr.class);
+        return (ExprConstraintDescr) 
patternDescr.getConstraint().getDescrs().get(0);
+    }
+
     private PackageDescr parseAndGetPackageDescrFromFile(String filename) {
         return parseAndGetPackageDescr(readResource(filename));
     }
@@ -4695,4 +4703,52 @@ class MiscDRLParserTest {
                 .map(RuleDescr::getName)
                 .containsExactly("X", "Y", "Z");
     }
+
+    @Test
+    void orWithMethodCall() {
+        final String text =
+                "rule R1\n" +
+                        "when\n" +
+                        "  MyFact( value == 10 || someMethod() == 4 )\n" +
+                        "then\n" +
+                        "end";
+        ExprConstraintDescr exprConstraintDescr = 
parseAndGetFirstConstraintDescr(text);
+        assertThat(exprConstraintDescr.getExpression()).isEqualTo("value == 10 
|| someMethod() == 4");
+    }
+
+    @Test
+    void orWithMethodCallWithArg() {
+        final String text =
+                "rule R1\n" +
+                        "when\n" +
+                        "  MyFact( value == 10 || someMethod(value) == 4 )\n" +
+                        "then\n" +
+                        "end";
+        ExprConstraintDescr exprConstraintDescr = 
parseAndGetFirstConstraintDescr(text);
+        assertThat(exprConstraintDescr.getExpression()).isEqualTo("value == 10 
|| someMethod(value) == 4");
+    }
+
+    @Test
+    void andWithMethodCall() {
+        final String text =
+                "rule R1\n" +
+                        "when\n" +
+                        "  MyFact( value == 10 && someMethod() == 4 )\n" +
+                        "then\n" +
+                        "end";
+        ExprConstraintDescr exprConstraintDescr = 
parseAndGetFirstConstraintDescr(text);
+        assertThat(exprConstraintDescr.getExpression()).isEqualTo("value == 10 
&& someMethod() == 4");
+    }
+
+    @Test
+    void andWithMethodCallWithArg() {
+        final String text =
+                "rule R1\n" +
+                        "when\n" +
+                        "  MyFact( value == 10 && someMethod(value) == 4 )\n" +
+                        "then\n" +
+                        "end";
+        ExprConstraintDescr exprConstraintDescr = 
parseAndGetFirstConstraintDescr(text);
+        assertThat(exprConstraintDescr.getExpression()).isEqualTo("value == 10 
&& someMethod(value) == 4");
+    }
 }
diff --git 
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRL6Expressions.g4
 
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRL6Expressions.g4
index 02c20088f4..27734251f1 100644
--- 
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRL6Expressions.g4
+++ 
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRL6Expressions.g4
@@ -519,7 +519,7 @@ orRestriction returns [BaseDescr result]
                $result = descr;
            }
          }
-   )* EOF?
+   )*? EOF?
   ;
 
 andRestriction returns [BaseDescr result]
@@ -535,7 +535,7 @@ andRestriction returns [BaseDescr result]
                $result = descr;
            }
          }
-  )*
+  )*?
   ;
 
 singleRestriction returns [BaseDescr result]
diff --git 
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/CompilerTest.java
 
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/CompilerTest.java
index 8badee9ade..702020fb7e 100644
--- 
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/CompilerTest.java
+++ 
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/CompilerTest.java
@@ -3161,4 +3161,62 @@ public class CompilerTest extends BaseModelTest {
         assertThat(list.size()).isEqualTo(1);
         assertThat(list.get(0)).isEqualTo("r1");
     }
+
+    @Test
+    public void orWithMethodCall() {
+        final String str =
+                "package org.example\n" +
+                        "import " + MyFact.class.getCanonicalName() + ";" +
+                        "rule r1 when\n" +
+                        "    MyFact( value == 10 || someMethod() == 4 )\n" +
+                        "then\n" +
+                        "end\n";
+
+        KieSession ksession = getKieSession( str );
+
+        ksession.insert(new MyFact(5));
+        int fired = ksession.fireAllRules();
+        assertThat(fired).isEqualTo(1);
+    }
+
+    @Test
+    public void orWithMethodCallWithArg() {
+        final String str =
+                "package org.example\n" +
+                        "import " + MyFact.class.getCanonicalName() + ";" +
+                        "rule r1 when\n" +
+                        "    MyFact( value == 10 || someMethod(2) == 4 )\n" +
+                        "then\n" +
+                        "end\n";
+
+        KieSession ksession = getKieSession( str );
+
+        ksession.insert(new MyFact(5));
+        int fired = ksession.fireAllRules();
+        assertThat(fired).isEqualTo(1);
+    }
+
+    public static class MyFact {
+        private int value;
+
+        public MyFact(int value) {
+            this.value = value;
+        }
+
+        public int getValue() {
+            return value;
+        }
+
+        public void setValue(int value) {
+            this.value = value;
+        }
+
+        public int someMethod(int input) {
+            return input * 2;
+        }
+
+        public int someMethod() {
+            return 4;
+        }
+    }
 }


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

Reply via email to