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 4818e19641 [incubator-kie-drools-5936] [new-parser] || and && should 
be allowed as alternatives to infix or and and (#5966)
4818e19641 is described below

commit 4818e196414baaf64cf727baad3923845c213647
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Thu May 23 11:27:42 2024 +0900

    [incubator-kie-drools-5936] [new-parser] || and && should be allowed as 
alternatives to infix or and and (#5966)
---
 .../drl/parser/antlr4/MiscDRLParserTest.java       | 78 +++++++++++++++++++++-
 .../org/drools/drl/parser/antlr4/DRLParser.g4      | 10 +--
 .../drl/parser/antlr4/Antlr4ParserStringUtils.java |  6 ++
 .../drools/drl/parser/antlr4/DRLVisitorImpl.java   |  2 +-
 4 files changed, 88 insertions(+), 8 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 ca565a8320..e81bfb21f0 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
@@ -5135,11 +5135,85 @@ class MiscDRLParserTest {
                 "end";
         RuleDescr rule = parseAndGetFirstRuleDescr(text);
 
-        final PatternDescr outPattern = (PatternDescr) 
rule.getLhs().getDescrs().get( 0 );
+        final PatternDescr outPattern = (PatternDescr) 
rule.getLhs().getDescrs().get(0);
         final AccumulateDescr accumulateDescr = (AccumulateDescr) 
outPattern.getSource();
         assertThat(accumulateDescr.getInitCode()).isEmpty();
         assertThat(accumulateDescr.getActionCode()).isEmpty();
         assertThat(accumulateDescr.getReverseCode()).isNull();
-        assertThat(accumulateDescr.getResultCode()).isEqualTo( "null");
+        assertThat(accumulateDescr.getResultCode()).isEqualTo("null");
+    }
+
+    @Test
+    void doublePipeInfixOr() {
+        final String text =
+                "rule R\n" +
+                        "when\n" +
+                        "    Person()\n" +
+                        "      ||\n" +
+                        "    Address()\n" +
+                        "then\n" +
+                        "end";
+        RuleDescr rule = parseAndGetFirstRuleDescr(text);
+        
assertThat(rule.getLhs().getDescrs().get(0)).isInstanceOfSatisfying(OrDescr.class,
 orDescr -> {
+            
assertThat(orDescr.getDescrs().get(0)).isInstanceOfSatisfying(PatternDescr.class,
 patternDescr -> {
+                assertThat(patternDescr.getObjectType()).isEqualTo("Person");
+            });
+            
assertThat(orDescr.getDescrs().get(1)).isInstanceOfSatisfying(PatternDescr.class,
 patternDescr -> {
+                assertThat(patternDescr.getObjectType()).isEqualTo("Address");
+            });
+        });
+    }
+
+    @Test
+    void doubleAmpersandInfixAnd() {
+        final String text =
+                "rule R\n" +
+                        "when\n" +
+                        "    Person()\n" +
+                        "      &&\n" +
+                        "    Address()\n" +
+                        "then\n" +
+                        "end";
+        RuleDescr rule = parseAndGetFirstRuleDescr(text);
+        
assertThat(rule.getLhs().getDescrs().get(0)).isInstanceOfSatisfying(PatternDescr.class,
 patternDescr -> {
+            assertThat(patternDescr.getObjectType()).isEqualTo("Person");
+        });
+        
assertThat(rule.getLhs().getDescrs().get(1)).isInstanceOfSatisfying(PatternDescr.class,
 patternDescr -> {
+            assertThat(patternDescr.getObjectType()).isEqualTo("Address");
+        });
+    }
+
+    @Test
+    void doubleAmpersandInfixAndInAccumulate() {
+        final String text =
+                "rule R\n" +
+                        "when\n" +
+                        "    accumulate( FactA($a : value) && FactB($b : 
value);\n" +
+                        "      $avg : average($a + $b))\n" +
+                        "then\n" +
+                        "end";
+        RuleDescr rule = parseAndGetFirstRuleDescr(text);
+        final PatternDescr outPattern = (PatternDescr) 
rule.getLhs().getDescrs().get(0);
+        AccumulateDescr accumulateDescr = (AccumulateDescr) 
outPattern.getSource();
+        
assertThat(accumulateDescr.getInput()).isInstanceOfSatisfying(AndDescr.class, 
andDescr -> {
+            assertThat(andDescr.getDescrs()).hasSize(2);
+            
assertThat(andDescr.getDescrs().get(0)).isInstanceOfSatisfying(PatternDescr.class,
 patternDescr -> {
+                assertThat(patternDescr.getObjectType()).isEqualTo("FactA");
+                
assertThat(patternDescr.getConstraint().getDescrs().get(0)).isInstanceOfSatisfying(ExprConstraintDescr.class,
 exprConstraintDescr -> {
+                    
assertThat(exprConstraintDescr.getExpression()).isEqualTo("$a : value");
+                });
+            });
+            
assertThat(andDescr.getDescrs().get(1)).isInstanceOfSatisfying(PatternDescr.class,
 patternDescr -> {
+                assertThat(patternDescr.getObjectType()).isEqualTo("FactB");
+                
assertThat(patternDescr.getConstraint().getDescrs().get(0)).isInstanceOfSatisfying(ExprConstraintDescr.class,
 exprConstraintDescr -> {
+                    
assertThat(exprConstraintDescr.getExpression()).isEqualTo("$b : value");
+                });
+            });
+        });
+
+        AccumulateDescr.AccumulateFunctionCallDescr accumulateFunction = 
accumulateDescr.getFunctions().get(0);
+        assertThat(accumulateFunction.getBind()).isEqualTo("$avg");
+        assertThat(accumulateFunction.getFunction()).isEqualTo("average");
+        assertThat(accumulateFunction.getParams()).containsExactly("$a + $b");
     }
 }
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 e96aa729ae..251f73f250 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
@@ -104,16 +104,16 @@ lhs : DRL_WHEN lhsExpression* ;
 queryLhs : lhsExpression* ;
 
 lhsExpression : LPAREN lhsExpression RPAREN                             
#lhsExpressionEnclosed
-              | lhsUnary                                                
#lhsUnarySingle
-              | DRL_AND drlAnnotation* lhsExpression+                          
        #lhsAnd
-              | lhsExpression (DRL_AND drlAnnotation* lhsExpression)+          
        #lhsAnd
               | DRL_OR drlAnnotation* lhsExpression+                           
        #lhsOr
-              | lhsExpression (DRL_OR drlAnnotation* lhsExpression)+           
        #lhsOr
+              | lhsExpression ((DRL_OR|OR) drlAnnotation* lhsExpression)+      
        #lhsOr
+              | DRL_AND drlAnnotation* lhsExpression+                          
        #lhsAnd
+              | lhsExpression ((DRL_AND|AND) drlAnnotation* lhsExpression)+    
        #lhsAnd
+              | lhsUnary                                                       
        #lhsUnarySingle
               ;
 
 // lhsAnd is used as a label in lhsExpression rule. But some other rules 
explicitly use the def, so lhsAndDef is declared.
 lhsAndDef : LPAREN lhsAndDef RPAREN
-          | lhsUnary (DRL_AND lhsUnary)*
+          | lhsUnary ((DRL_AND|AND) lhsUnary)*
           | LPAREN DRL_AND lhsUnary+ RPAREN
           ;
 
diff --git 
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/Antlr4ParserStringUtils.java
 
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/Antlr4ParserStringUtils.java
index a0f09fb471..74fb54c2c4 100644
--- 
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/Antlr4ParserStringUtils.java
+++ 
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/Antlr4ParserStringUtils.java
@@ -56,6 +56,9 @@ public class Antlr4ParserStringUtils {
      * Get text from List of ParserRuleContext's CharStream without trimming 
whitespace
      */
     public static String getTextPreservingWhitespace(List<? extends 
ParserRuleContext> ctx) {
+        if (ctx == null) {
+            return "";
+        }
         return 
ctx.stream().map(Antlr4ParserStringUtils::getTextPreservingWhitespace).collect(Collectors.joining());
     }
 
@@ -65,6 +68,9 @@ public class Antlr4ParserStringUtils {
      * Unlike getTextPreservingWhitespace, this method reflects Lexer 
normalizeString
      */
     public static String getTokenTextPreservingWhitespace(ParserRuleContext 
ctx, TokenStream tokenStream) {
+        if (ctx == null) {
+            return "";
+        }
         return tokenStream.getText(ctx.start, ctx.stop);
     }
 
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 ddb3d370fa..4e6192ecad 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
@@ -819,7 +819,7 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
         }
 
         String[] params = 
ctx.conditionalExpressions().conditionalExpression().stream()
-                .map(RuleContext::getText)
+                .map(Antlr4ParserStringUtils::getTextPreservingWhitespace)
                 .toArray(String[]::new);
         return new AccumulateDescr.AccumulateFunctionCallDescr(function, bind, 
unify, params);
     }


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

Reply via email to