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]

Reply via email to