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 a29e35be28 [incubator-kie-drools#5711] Broken OOPath expressions 
(#5805)
a29e35be28 is described below

commit a29e35be28a803bd70402b43d111602ced5eaae8
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Wed Mar 27 17:30:21 2024 +0900

    [incubator-kie-drools#5711] Broken OOPath expressions (#5805)
    
    * [incubator-kie-drools#5711] Broken OOPath expressions
    
    * accept mixing OOPath and standard constraint
---
 .../drl/parser/antlr4/MiscDRLParserTest.java       | 94 ++++++++++++++++++----
 .../org/drools/drl/parser/antlr4/DRLParser.g4      | 13 +++
 2 files changed, 92 insertions(+), 15 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 53eda685ad..a65fafec28 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
@@ -3635,9 +3635,7 @@ class MiscDRLParserTest {
                 "then\n" +
                 "end\n";
         PackageDescr packageDescr = parser.parse(text);
-        RuleDescr ruleDescr = packageDescr.getRules().get(0);
-        PatternDescr patternDescr = (PatternDescr) 
ruleDescr.getLhs().getDescrs().get(0);
-        ExprConstraintDescr constraintDescr = (ExprConstraintDescr) 
patternDescr.getConstraint().getDescrs().get(0);
+        ExprConstraintDescr constraintDescr = 
getFirstExprConstraintDescr(packageDescr);
         
assertThat(constraintDescr.toString()).isEqualToIgnoringWhitespace("address!.city
 == $city");
     }
 
@@ -3650,9 +3648,7 @@ class MiscDRLParserTest {
                 "then\n" +
                 "end\n";
         PackageDescr packageDescr = parser.parse(text);
-        RuleDescr ruleDescr = packageDescr.getRules().get(0);
-        PatternDescr patternDescr = (PatternDescr) 
ruleDescr.getLhs().getDescrs().get(0);
-        ExprConstraintDescr constraintDescr = (ExprConstraintDescr) 
patternDescr.getConstraint().getDescrs().get(0);
+        ExprConstraintDescr constraintDescr = 
getFirstExprConstraintDescr(packageDescr);
         
assertThat(constraintDescr.toString()).isEqualToIgnoringWhitespace("address!.city!.startsWith(\"M\")");
     }
 
@@ -3665,9 +3661,7 @@ class MiscDRLParserTest {
                 "then\n" +
                 "end\n";
         PackageDescr packageDescr = parser.parse(text);
-        RuleDescr ruleDescr = packageDescr.getRules().get(0);
-        PatternDescr patternDescr = (PatternDescr) 
ruleDescr.getLhs().getDescrs().get(0);
-        ExprConstraintDescr constraintDescr = (ExprConstraintDescr) 
patternDescr.getConstraint().getDescrs().get(0);
+        ExprConstraintDescr constraintDescr = 
getFirstExprConstraintDescr(packageDescr);
         
assertThat(constraintDescr.toString()).isEqualToIgnoringWhitespace("$containsL 
: address!.city.contains(\"L\")");
     }
 
@@ -3680,9 +3674,7 @@ class MiscDRLParserTest {
                 "then\n" +
                 "end\n";
         PackageDescr packageDescr = parser.parse(text);
-        RuleDescr ruleDescr = packageDescr.getRules().get(0);
-        PatternDescr patternDescr = (PatternDescr) 
ruleDescr.getLhs().getDescrs().get(0);
-        ExprConstraintDescr constraintDescr = (ExprConstraintDescr) 
patternDescr.getConstraint().getDescrs().get(0);
+        ExprConstraintDescr constraintDescr = 
getFirstExprConstraintDescr(packageDescr);
         assertThat(constraintDescr.toString())
                 .as("prefix should be appended to each element")
                 .isEqualToIgnoringWhitespace("address.city.startsWith(\"I\") 
&& address.city.length() == 5");
@@ -3697,9 +3689,7 @@ class MiscDRLParserTest {
                 "then\n" +
                 "end\n";
         PackageDescr packageDescr = parser.parse(text);
-        RuleDescr ruleDescr = packageDescr.getRules().get(0);
-        PatternDescr patternDescr = (PatternDescr) 
ruleDescr.getLhs().getDescrs().get(0);
-        ExprConstraintDescr constraintDescr = (ExprConstraintDescr) 
patternDescr.getConstraint().getDescrs().get(0);
+        ExprConstraintDescr constraintDescr = 
getFirstExprConstraintDescr(packageDescr);
         assertThat(constraintDescr.toString())
                 .as("prefix should be appended to each element")
                 .isEqualToIgnoringWhitespace("address!.city!.startsWith(\"I\") 
&& address!.city!.length() == 5");
@@ -3806,4 +3796,78 @@ class MiscDRLParserTest {
         assertThat(annotationDescr.getValueAsString("value")).isEqualTo("2s");
         
assertThat(annotationDescr.getValueAsString("policy")).isEqualTo("TIME_SOFT");
     }
+
+    @Test
+    void ooPath() {
+        final String text = "package org.drools\n" +
+                "rule R when\n" +
+                " $man: Man( /wife/children[age > 10] )\n" +
+                "then\n" +
+                "end\n";
+        PackageDescr packageDescr = parser.parse(text);
+        ExprConstraintDescr constraintDescr = 
getFirstExprConstraintDescr(packageDescr);
+        assertThat(constraintDescr.toString())
+                .isEqualToIgnoringWhitespace("/wife/children[age > 10]");
+    }
+
+    private static ExprConstraintDescr 
getFirstExprConstraintDescr(PackageDescr packageDescr) {
+        RuleDescr ruleDescr = packageDescr.getRules().get(0);
+        PatternDescr patternDescr = (PatternDescr) 
ruleDescr.getLhs().getDescrs().get(0);
+        ExprConstraintDescr constraintDescr = (ExprConstraintDescr) 
patternDescr.getConstraint().getDescrs().get(0);
+        return constraintDescr;
+    }
+
+    @Test
+    void ooPathWithBindingInBrackets() {
+        final String text = "package org.drools\n" +
+                "rule R when\n" +
+                " Man( /wife[$age : age] )\n" +
+                "then\n" +
+                "end\n";
+        PackageDescr packageDescr = parser.parse(text);
+        ExprConstraintDescr constraintDescr = 
getFirstExprConstraintDescr(packageDescr);
+        assertThat(constraintDescr.toString())
+                .isEqualToIgnoringWhitespace("/wife[$age : age]");
+    }
+
+    @Test
+    void ooPathWithBindingInParentheses() {
+        final String text = "package org.drools\n" +
+                "rule R when\n" +
+                " Man( $toy: /wife/children[age > 10]/toys )\n" +
+                "then\n" +
+                "end\n";
+        PackageDescr packageDescr = parser.parse(text);
+        ExprConstraintDescr constraintDescr = 
getFirstExprConstraintDescr(packageDescr);
+        assertThat(constraintDescr.toString())
+                .isEqualToIgnoringWhitespace("$toy: /wife/children[age > 
10]/toys");
+    }
+
+    @Test
+    void ooPathWithBackReference() {
+        final String text = "package org.drools\n" +
+                "rule R when\n" +
+                "  Man( $toy: /wife/children/toys[ name.length == 
../name.length ] )\n" +
+                "then\n" +
+                "end\n";
+
+        PackageDescr packageDescr = parser.parse(text);
+        ExprConstraintDescr constraintDescr = 
getFirstExprConstraintDescr(packageDescr);
+        assertThat(constraintDescr.toString())
+                .isEqualToIgnoringWhitespace("$toy: /wife/children/toys[ 
name.length == ../name.length ]");
+    }
+
+    @Test
+    void ooPathMixedWithStandardConstraint() {
+        final String text = "package org.drools\n" +
+                "rule R when\n" +
+                "  Man( /wife[$age : age] && age > $age )\n" +
+                "then\n" +
+                "end\n";
+
+        PackageDescr packageDescr = parser.parse(text);
+        ExprConstraintDescr constraintDescr = 
getFirstExprConstraintDescr(packageDescr);
+        assertThat(constraintDescr.toString())
+                .isEqualToIgnoringWhitespace("/wife[$age : age] && age > 
$age");
+    }
 }
diff --git 
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
 
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
index 34ebacd4da..5891d6eaa9 100644
--- 
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
+++ 
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
@@ -144,6 +144,12 @@ orRestriction : left=andRestriction (OR 
right=andRestriction)* ;
 andRestriction : left=singleRestriction (AND right=singleRestriction)* ;
 singleRestriction : op=relationalOperator drlExpression ;
 
+// OOPath
+xpathSeparator : DIV | QUESTION_DIV ;
+xpathPrimary : label? xpathChunk+ ;
+xpathChunk : xpathSeparator drlIdentifier (DOT drlIdentifier)* (HASH 
drlIdentifier)? (LBRACK xpathExpressionList RBRACK)? ;
+xpathExpressionList : label? drlExpression (COMMA label? drlExpression)* ;
+
 relationalOperator
     : EQUAL
     | NOTEQUAL
@@ -284,8 +290,15 @@ drlExpression
     | drlExpression COLONCOLON typeArguments? drlIdentifier
     | typeType COLONCOLON (typeArguments? drlIdentifier | NEW)
     | classType COLONCOLON typeArguments? NEW
+
+    // OOPath
+    | xpathPrimary
+    | backReferenceExpression
     ;
 
+backReferenceExpression : (DOT DOT DIV)+  drlExpression ;
+
+
 /* extending JavaParser methodCall in order to accept drl keywords as method 
name */
 drlMethodCall
     : drlIdentifier LPAREN expressionList? RPAREN


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

Reply via email to