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]