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 9dc78129f4 [incubator-kie-drools-5724] [new-parser] Broken
ExisistentialTest#tes… (#5871)
9dc78129f4 is described below
commit 9dc78129f4af059d774e34d3702499a9499d8926
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Tue Apr 30 17:13:21 2024 +0900
[incubator-kie-drools-5724] [new-parser] Broken ExisistentialTest#tes…
(#5871)
* [incubator-kie-drools-5724] [new-parser] Broken
ExisistentialTest#test2NotsWithAnd
* - Addtional test for LPAREN lhsExpression RPAREN
namedConsequenceInvocation?
---
.../drl/parser/antlr4/MiscDRLParserTest.java | 92 ++++++++++++++++++++++
.../org/drools/drl/parser/antlr4/DRLParser.g4 | 17 ++--
2 files changed, 97 insertions(+), 12 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 d400c7b00f..f44b6b5abd 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
@@ -4387,6 +4387,34 @@ class MiscDRLParserTest {
assertThat(namedConsequenceDescr.getName()).isEqualTo("FoundMarkOrMario");
}
+ @Test
+ void namedConsequenceOrWithBindVariables() {
+ final String text =
+ "rule R when\n" +
+ " $r : Result()\n" +
+ " ( $p1 : Person(name == \"Mark\") or $p1 :
Person(name == \"Mario\") )\n" +
+ " do[FoundMarkOrMario]\n" +
+ " $p2 : Person(name != \"Mark\", age > $p1.age)\n" +
+ "then\n" +
+ " $r.addValue($p2.getName() + \" is older than \" +
$p1.getName());\n" +
+ "then[FoundMark]\n" +
+ " $r.addValue(\"Found \" + $p1.getName());\n" +
+ "end";
+ PackageDescr packageDescr = parseAndGetPackageDescr(text);
+ RuleDescr ruleDescr = packageDescr.getRules().get(0);
+
+ OrDescr orDescr = (OrDescr) ruleDescr.getLhs().getDescrs().get(1);
+ PatternDescr patternDescr1 = (PatternDescr) orDescr.getDescrs().get(0);
+ assertThat(patternDescr1.getIdentifier()).isEqualTo("$p1");
+
assertThat(((ExprConstraintDescr)patternDescr1.getConstraint().getDescrs().get(0)).getExpression()).isEqualTo("name
== \"Mark\"");
+ PatternDescr patternDescr2 = (PatternDescr) orDescr.getDescrs().get(1);
+ assertThat(patternDescr2.getIdentifier()).isEqualTo("$p1");
+
assertThat(((ExprConstraintDescr)patternDescr2.getConstraint().getDescrs().get(0)).getExpression()).isEqualTo("name
== \"Mario\"");
+
+ NamedConsequenceDescr namedConsequenceDescr = (NamedConsequenceDescr)
ruleDescr.getLhs().getDescrs().get(2);
+
assertThat(namedConsequenceDescr.getName()).isEqualTo("FoundMarkOrMario");
+ }
+
@Test
public void queryComplexLhs() {
final String text = "query isContainedIn(String x, String y)\n" +
@@ -4463,6 +4491,70 @@ class MiscDRLParserTest {
});
}
+ @Test
+ void notWithPrefixAnd() {
+ final String text =
+ "package org.drools.compiler\n" +
+ "rule R when\n" +
+ " (not (and Integer( $i : intValue )\n" +
+ " String( length > $i ) \n" +
+ " )\n" +
+ " )\n" +
+ "then\n" +
+ "end";
+ PackageDescr packageDescr = parseAndGetPackageDescr(text);
+ RuleDescr ruleDescr = packageDescr.getRules().get(0);
+
assertThat(ruleDescr.getLhs().getDescrs().get(0)).isInstanceOfSatisfying(NotDescr.class,
notDescr -> {
+
assertThat(notDescr.getDescrs().get(0)).isInstanceOfSatisfying(AndDescr.class,
andDescr -> {
+ assertThat(andDescr.getDescrs()).hasSize(2);
+
assertThat(andDescr.getDescrs().get(0)).isInstanceOfSatisfying(PatternDescr.class,
patternDescr -> {
+
assertThat(patternDescr.getObjectType()).isEqualTo("Integer");
+
assertThat(patternDescr.getConstraint().getDescrs().get(0)).isInstanceOfSatisfying(ExprConstraintDescr.class,
exprConstraintDescr -> {
+
assertThat(exprConstraintDescr.getExpression()).isEqualTo("$i : intValue");
+ });
+ });
+
assertThat(andDescr.getDescrs().get(1)).isInstanceOfSatisfying(PatternDescr.class,
patternDescr -> {
+
assertThat(patternDescr.getObjectType()).isEqualTo("String");
+
assertThat(patternDescr.getConstraint().getDescrs().get(0)).isInstanceOfSatisfying(ExprConstraintDescr.class,
exprConstraintDescr -> {
+
assertThat(exprConstraintDescr.getExpression()).isEqualTo("length > $i");
+ });
+ });
+ });
+ });
+ }
+
+ @Test
+ void existsWithPrefixAnd() {
+ final String text =
+ "package org.drools.compiler\n" +
+ "rule R when\n" +
+ " (exists (and Integer( $i : intValue )\n" +
+ " String( length > $i ) \n" +
+ " )\n" +
+ " )\n" +
+ "then\n" +
+ "end";
+ PackageDescr packageDescr = parseAndGetPackageDescr(text);
+ RuleDescr ruleDescr = packageDescr.getRules().get(0);
+
assertThat(ruleDescr.getLhs().getDescrs().get(0)).isInstanceOfSatisfying(ExistsDescr.class,
existsDescr -> {
+
assertThat(existsDescr.getDescrs().get(0)).isInstanceOfSatisfying(AndDescr.class,
andDescr -> {
+ assertThat(andDescr.getDescrs()).hasSize(2);
+
assertThat(andDescr.getDescrs().get(0)).isInstanceOfSatisfying(PatternDescr.class,
patternDescr -> {
+
assertThat(patternDescr.getObjectType()).isEqualTo("Integer");
+
assertThat(patternDescr.getConstraint().getDescrs().get(0)).isInstanceOfSatisfying(ExprConstraintDescr.class,
exprConstraintDescr -> {
+
assertThat(exprConstraintDescr.getExpression()).isEqualTo("$i : intValue");
+ });
+ });
+
assertThat(andDescr.getDescrs().get(1)).isInstanceOfSatisfying(PatternDescr.class,
patternDescr -> {
+
assertThat(patternDescr.getObjectType()).isEqualTo("String");
+
assertThat(patternDescr.getConstraint().getDescrs().get(0)).isInstanceOfSatisfying(ExprConstraintDescr.class,
exprConstraintDescr -> {
+
assertThat(exprConstraintDescr.getExpression()).isEqualTo("length > $i");
+ });
+ });
+ });
+ });
+ }
+
@Test
public void enumDeclaration() {
final String text =
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 b173157c93..03d6b20ced 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
@@ -103,7 +103,7 @@ lhs : DRL_WHEN lhsExpression* ;
queryLhs : lhsExpression+ ;
-lhsExpression : LPAREN lhsExpression RPAREN namedConsequenceInvocation?
#lhsExpressionEnclosed
+lhsExpression : LPAREN lhsExpression RPAREN
#lhsExpressionEnclosed
| lhsUnary
#lhsUnarySingle
| LPAREN DRL_AND lhsExpression+ RPAREN #lhsAnd
| lhsExpression (DRL_AND lhsExpression)+ #lhsAnd
@@ -123,7 +123,7 @@ lhsUnary : ( lhsExists namedConsequence?
| lhsEval consequenceInvocation*
| lhsForall
| lhsAccumulate
- | LPAREN lhsOr RPAREN namedConsequence? // this part is handled by
#lhsExpressionEnclosed
+ | LPAREN lhsOr RPAREN namedConsequence?
| lhsPatternBind consequenceInvocation*
) SEMI? ;
*/
@@ -135,6 +135,7 @@ lhsUnary : (
| lhsForall
| lhsAccumulate
| lhsGroupBy
+ | LPAREN lhsExpression RPAREN namedConsequenceInvocation?
| conditionalBranch // not in the above old parser definition, but
actually implemented in the old parser
| lhsPatternBind consequenceInvocation*
) SEMI? ;
@@ -369,11 +370,7 @@ fromWindow : DRL_WINDOW IDENTIFIER ;
)
*/
// Use lhsExpression instead of lhsOr because lhsExpression has good enough
structure
-lhsExists : DRL_EXISTS
- ( LPAREN lhsExpression RPAREN
- | lhsPatternBind
- )
- ;
+lhsExists : DRL_EXISTS ( lhsPatternBind | lhsExpression ) ;
/*
lhsNot := NOT
@@ -383,11 +380,7 @@ lhsExists : DRL_EXISTS
)
*/
// Use lhsExpression instead of lhsOr because lhsExpression has good enough
structure
-lhsNot : DRL_NOT
- ( LPAREN lhsExpression RPAREN
- | lhsPatternBind
- )
- ;
+lhsNot : DRL_NOT ( lhsPatternBind | lhsExpression ) ;
/**
* lhsEval := EVAL LEFT_PAREN conditionalExpression RIGHT_PAREN
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]