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 e01cf83626 [incubator-kie-drools-5714] Broken
QueryTest#testRecursiveQueryWithBa… (#5866)
e01cf83626 is described below
commit e01cf83626b6c4ad83693446abd332f043b9cb76
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Thu Apr 25 13:33:00 2024 +0900
[incubator-kie-drools-5714] Broken QueryTest#testRecursiveQueryWithBa…
(#5866)
* [incubator-kie-drools-5714] Broken
QueryTest#testRecursiveQueryWithBatchCommand
* removed redandunt slimdown and toString
---
.../drl/parser/antlr4/MiscDRLParserTest.java | 76 ++++++++++++++++++++++
.../org/drools/drl/parser/antlr4/DRLParser.g4 | 4 +-
.../drools/drl/parser/antlr4/DRLVisitorImpl.java | 41 +++++-------
3 files changed, 96 insertions(+), 25 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 d561ca0b67..c30164d0f4 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
@@ -4284,4 +4284,80 @@ class MiscDRLParserTest {
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" +
+ " Location (x, y;)\n" +
+ " or\n" +
+ " ( Location (z, y;) and ?isContainedIn(x, z;))\n" +
+ "end\n";
+ final QueryDescr query = parseAndGetFirstQueryDescr(text);
+
+ assertThat(query).isNotNull();
+ AndDescr lhs = query.getLhs();
+ assertThat(lhs.getDescrs()).hasSize(1);
+
+ assertThat(lhs.getDescrs().get(0))
+ .as("Top level node is OR")
+ .isInstanceOfSatisfying(OrDescr.class, orDescr -> {
+ assertThat(orDescr.getDescrs()).hasSize(2);
+ assertThat(orDescr.getDescrs().get(0))
+ .as("Left node of OR is Pattern")
+ .isInstanceOfSatisfying(PatternDescr.class,
patternDescr -> {
+
assertThat(patternDescr.getObjectType()).isEqualTo("Location");
+
assertThat(patternDescr.getConstraint().getDescrs().get(0))
+
.isInstanceOfSatisfying(ExprConstraintDescr.class, constraint -> {
+
assertThat(constraint.getExpression()).isEqualTo("x");
+
assertThat(constraint.getType()).isEqualTo(ExprConstraintDescr.Type.POSITIONAL);
+
assertThat(constraint.getPosition()).isEqualTo(0);
+ });
+
assertThat(patternDescr.getConstraint().getDescrs().get(1))
+
.isInstanceOfSatisfying(ExprConstraintDescr.class, constraint -> {
+
assertThat(constraint.getExpression()).isEqualTo("y");
+
assertThat(constraint.getType()).isEqualTo(ExprConstraintDescr.Type.POSITIONAL);
+
assertThat(constraint.getPosition()).isEqualTo(1);
+ });
+ });
+ assertThat(orDescr.getDescrs().get(1))
+ .as("Right node of OR is AND")
+ .isInstanceOfSatisfying(AndDescr.class, andDescr
-> {
+ assertThat(andDescr.getDescrs().get(0))
+ .as("Left node of AND is Pattern")
+
.isInstanceOfSatisfying(PatternDescr.class, patternDescr -> {
+
assertThat(patternDescr.getObjectType()).isEqualTo("Location");
+
assertThat(patternDescr.getConstraint().getDescrs().get(0))
+
.isInstanceOfSatisfying(ExprConstraintDescr.class, constraint -> {
+
assertThat(constraint.getExpression()).isEqualTo("z");
+
assertThat(constraint.getType()).isEqualTo(ExprConstraintDescr.Type.POSITIONAL);
+
assertThat(constraint.getPosition()).isEqualTo(0);
+ });
+
assertThat(patternDescr.getConstraint().getDescrs().get(1))
+
.isInstanceOfSatisfying(ExprConstraintDescr.class, constraint -> {
+
assertThat(constraint.getExpression()).isEqualTo("y");
+
assertThat(constraint.getType()).isEqualTo(ExprConstraintDescr.Type.POSITIONAL);
+
assertThat(constraint.getPosition()).isEqualTo(1);
+ });
+ });
+ assertThat(andDescr.getDescrs().get(1))
+ .as("Right node of AND is Query
Pattern")
+
.isInstanceOfSatisfying(PatternDescr.class, patternDescr -> {
+
assertThat(patternDescr.isQuery()).isTrue();
+
assertThat(patternDescr.getObjectType()).isEqualTo("isContainedIn");
+
assertThat(patternDescr.getConstraint().getDescrs().get(0))
+
.isInstanceOfSatisfying(ExprConstraintDescr.class, constraint -> {
+
assertThat(constraint.getExpression()).isEqualTo("x");
+
assertThat(constraint.getType()).isEqualTo(ExprConstraintDescr.Type.POSITIONAL);
+
assertThat(constraint.getPosition()).isEqualTo(0);
+ });
+
assertThat(patternDescr.getConstraint().getDescrs().get(1))
+
.isInstanceOfSatisfying(ExprConstraintDescr.class, constraint -> {
+
assertThat(constraint.getExpression()).isEqualTo("z");
+
assertThat(constraint.getType()).isEqualTo(ExprConstraintDescr.Type.POSITIONAL);
+
assertThat(constraint.getPosition()).isEqualTo(1);
+ });
+ });
+ });
+ });
+ }
}
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 093c213322..071a3202e3 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
@@ -80,7 +80,7 @@ ruledef : DRL_RULE name=stringId (EXTENDS
parentName=stringId)? drlAnnotation* a
// query := QUERY stringId parameters? annotation* lhsExpression END
-querydef : DRL_QUERY name=stringId parameters? drlAnnotation* lhsExpression+
DRL_END ;
+querydef : DRL_QUERY name=stringId parameters? drlAnnotation* queryLhs DRL_END
;
// parameters := LEFT_PAREN ( parameter ( COMMA parameter )* )? RIGHT_PAREN
parameters : LPAREN ( parameter ( COMMA parameter )* )? RPAREN ;
@@ -90,6 +90,8 @@ parameter : type? drlIdentifier ; // type is optional.
Removed (LEFT_SQUARE RIGH
lhs : DRL_WHEN lhsExpression* ;
+queryLhs : lhsExpression+ ;
+
lhsExpression : LPAREN lhsExpression RPAREN namedConsequenceInvocation?
#lhsExpressionEnclosed
| lhsUnary
#lhsUnarySingle
| LPAREN DRL_AND lhsExpression+ RPAREN #lhsAnd
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 2febb2f08d..03b9621787 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
@@ -293,8 +293,19 @@ public class DRLVisitorImpl extends
DRLParserBaseVisitor<Object> {
if (ctx.lhs() != null) {
final AndDescr rootDescr = ruleDescr.getLhs();
List<BaseDescr> lhsDescrList = visitLhs(ctx.lhs());
- lhsDescrList.forEach(descr -> rootDescr.addDescr(descr));
- slimLhsRootDescr(rootDescr);
+ // Root Descr is always AndDescr.
+ // For example, if there are nested AndDescr like
+ // AndDescr
+ // /\
+ // P AndDescr
+ // /\
+ // P P
+ // is slimmed down to
+ // AndDescr
+ // / | \
+ // P P P
+ // by addOrMerge() method.
+ lhsDescrList.forEach(rootDescr::addOrMerge);
DescrHelper.populateCommonProperties(rootDescr,
ctx.lhs().lhsExpression());
} else {
ruleDescr.setLhs(new AndDescr());
@@ -317,23 +328,6 @@ public class DRLVisitorImpl extends
DRLParserBaseVisitor<Object> {
return ruleDescr;
}
- private void slimLhsRootDescr(AndDescr root) {
- // Root Descr is always AndDescr.
- // For example, if there are nested AndDescr like
- // AndDescr
- // /\
- // P AndDescr
- // /\
- // P P
- // is slimmed down to
- // AndDescr
- // / | \
- // P P P
- List<BaseDescr> descrList = new ArrayList<>(root.getDescrs());
- root.getDescrs().clear();
- descrList.forEach(root::addOrMerge);
- }
-
@Override
public QueryDescr visitQuerydef(DRLParser.QuerydefContext ctx) {
QueryDescr queryDescr = BaseDescrFactory.builder(new
QueryDescr(safeStripStringDelimiters(ctx.name.getText())))
@@ -352,11 +346,10 @@ public class DRLVisitorImpl extends
DRLParserBaseVisitor<Object> {
ctx.drlAnnotation().stream().map(this::visitDrlAnnotation).forEach(queryDescr::addAnnotation);
- ctx.lhsExpression().stream()
- .flatMap(lhsExpressionContext ->
visitDescrChildren(lhsExpressionContext).stream())
- .forEach(descr ->
queryDescr.getLhs().addDescr(descr));
-
- slimLhsRootDescr(queryDescr.getLhs());
+ final AndDescr rootDescr = queryDescr.getLhs();
+ List<BaseDescr> lhsDescrList = visitDescrChildren(ctx.queryLhs()); //
queryLhs never be null
+ lhsDescrList.forEach(rootDescr::addOrMerge);
+ DescrHelper.populateCommonProperties(rootDescr, ctx.queryLhs());
return queryDescr;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]