This is an automated email from the ASF dual-hosted git repository.

mariofusco pushed a commit to branch dev-new-parser
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git

commit 94f8b4adadfe3fda91efe27f1d56c35cf76c2af0
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Wed Oct 18 15:42:50 2023 +0900

    [DROOLS-7295] Implement from collect (#39)
---
 .../src/main/antlr4/org/drools/parser/DRLLexer.g4       |  1 +
 .../src/main/antlr4/org/drools/parser/DRLParser.g4      | 17 +++++++++++------
 .../src/main/java/org/drools/parser/DRLVisitorImpl.java | 14 +++++++++++---
 .../test/java/org/drools/parser/MiscDRLParserTest.java  |  4 ----
 4 files changed, 23 insertions(+), 13 deletions(-)

diff --git 
a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLLexer.g4 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLLexer.g4
index 2bb35093aa..35bfe12f99 100644
--- 
a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLLexer.g4
+++ 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLLexer.g4
@@ -44,6 +44,7 @@ DRL_EXISTS : 'exists';
 DRL_NOT : 'not';
 DRL_IN : 'in';
 DRL_FROM : 'from';
+DRL_COLLECT : 'collect';
 DRL_MATCHES : 'matches';
 DRL_MEMBEROF : 'memberOf';
 DRL_ACCUMULATE : 'accumulate' | 'acc';
diff --git 
a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4
index d418d82da9..6069196f7c 100644
--- 
a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4
+++ 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4
@@ -53,10 +53,10 @@ lhsExpression : LPAREN lhsExpression RPAREN             
#lhsExpressionEnclosed
               | lhsExpression (DRL_OR lhsExpression)+   #lhsOr
               ;
 
-// and is accepted for accumulate
-lhsAndForAccumulate : lhsUnary (DRL_AND lhsUnary)*
-                    | LPAREN DRL_AND lhsUnary+ RPAREN
-                    ;
+// lhsAnd is used as a label in lhsExpression rule. But some other rules also 
use it.
+lhsAndDef : lhsUnary (DRL_AND lhsUnary)*
+          | LPAREN DRL_AND lhsUnary+ RPAREN
+          ;
 
 /*
 lhsUnary : ( lhsExists namedConsequence?
@@ -298,6 +298,7 @@ patternFilter : label IDENTIFIER LPAREN expressionList 
RPAREN ;
                 | fromExpression )
 */
 patternSource : fromAccumulate
+              | fromCollect
               | fromEntryPoint
               | fromExpression
               ;
@@ -312,7 +313,7 @@ fromAccumulate := ACCUMULATE LEFT_PAREN lhsAnd 
(COMMA|SEMICOLON)
                         | accumulateFunction
                         ) RIGHT_PAREN
 */
-fromAccumulate : DRL_ACCUMULATE LPAREN lhsAndForAccumulate (COMMA|SEMI)
+fromAccumulate : DRL_ACCUMULATE LPAREN lhsAndDef (COMMA|SEMI)
                    ( DRL_INIT LPAREN initBlockStatements=blockStatements 
RPAREN COMMA DRL_ACTION LPAREN actionBlockStatements=blockStatements RPAREN 
COMMA ( DRL_REVERSE LPAREN reverseBlockStatements=blockStatements RPAREN 
COMMA)? DRL_RESULT LPAREN expression RPAREN
                    | accumulateFunction
                    )
@@ -326,6 +327,10 @@ accumulateFunction := label? ID parameters
 */
 accumulateFunction : label? IDENTIFIER LPAREN drlExpression RPAREN;
 
+// fromCollect := COLLECT LEFT_PAREN lhsPatternBind RIGHT_PAREN
+
+fromCollect : DRL_COLLECT LPAREN lhsPatternBind RPAREN ;
+
 fromEntryPoint : DRL_ENTRY_POINT stringId ;
 
 /*
@@ -363,7 +368,7 @@ lhsForall : DRL_FORALL LPAREN lhsPatternBind+ RPAREN ;
  *                  RIGHT_PAREN SEMICOLON?
  */
 
-lhsAccumulate : DRL_ACCUMULATE LPAREN lhsAndForAccumulate (COMMA|SEMI)
+lhsAccumulate : DRL_ACCUMULATE LPAREN lhsAndDef (COMMA|SEMI)
                    accumulateFunction (COMMA accumulateFunction)*
                    (SEMI constraints)?
                  RPAREN (SEMI)?
diff --git 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
index 1d33e45975..783be414b4 100644
--- 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
+++ 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
@@ -16,6 +16,7 @@ import org.drools.drl.ast.descr.AnnotationDescr;
 import org.drools.drl.ast.descr.AttributeDescr;
 import org.drools.drl.ast.descr.BaseDescr;
 import org.drools.drl.ast.descr.BehaviorDescr;
+import org.drools.drl.ast.descr.CollectDescr;
 import org.drools.drl.ast.descr.EntryPointDescr;
 import org.drools.drl.ast.descr.EvalDescr;
 import org.drools.drl.ast.descr.ExistsDescr;
@@ -314,7 +315,7 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
     @Override
     public PatternDescr visitLhsAccumulate(DRLParser.LhsAccumulateContext ctx) 
{
         AccumulateDescr accumulateDescr = new AccumulateDescr();
-        
accumulateDescr.setInput(visitLhsAndForAccumulate(ctx.lhsAndForAccumulate()));
+        accumulateDescr.setInput(visitLhsAndDef(ctx.lhsAndDef()));
 
         // accumulate function
         for (DRLParser.AccumulateFunctionContext accumulateFunctionContext : 
ctx.accumulateFunction()) {
@@ -346,10 +347,17 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
         return fromDescr;
     }
 
+    @Override
+    public CollectDescr visitFromCollect(DRLParser.FromCollectContext ctx) {
+        CollectDescr collectDescr = new CollectDescr();
+        collectDescr.setInputPattern((PatternDescr) 
visitLhsPatternBind(ctx.lhsPatternBind()));
+        return collectDescr;
+    }
+
     @Override
     public AccumulateDescr visitFromAccumulate(DRLParser.FromAccumulateContext 
ctx) {
         AccumulateDescr accumulateDescr = new AccumulateDescr();
-        
accumulateDescr.setInput(visitLhsAndForAccumulate(ctx.lhsAndForAccumulate()));
+        accumulateDescr.setInput(visitLhsAndDef(ctx.lhsAndDef()));
         if (ctx.DRL_INIT() != null) {
             // inline custom accumulate
             
accumulateDescr.setInitCode(getTextPreservingWhitespace(ctx.initBlockStatements));
@@ -469,7 +477,7 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
     }
 
     @Override
-    public BaseDescr 
visitLhsAndForAccumulate(DRLParser.LhsAndForAccumulateContext ctx) {
+    public BaseDescr visitLhsAndDef(DRLParser.LhsAndDefContext ctx) {
         return createAndDescr(visitDescrChildren(ctx));
     }
 
diff --git 
a/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java
 
b/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java
index c25bb3274f..93a98ed9eb 100644
--- 
a/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java
+++ 
b/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java
@@ -2047,7 +2047,6 @@ class MiscDRLParserTest {
         assertThat(pattern.getObjectType()).isEqualTo("Person");
     }
 
-    @Disabled("Priority : High | Implement from collect")
     @Test
     public void parse_Collect() throws Exception {
         final PackageDescr pkg = parseAndGetPackageDescrFromFile(
@@ -2310,7 +2309,6 @@ class MiscDRLParserTest {
         assertThat(fieldConstr.getExpression()).isEqualTo("bar > 1 || == 1");
     }
 
-    @Disabled("Priority : High | Implement semicolon delimiter | Implement 
from collect")
     @Test
     public void parse_Semicolon() throws Exception {
         final PackageDescr pkg = parseAndGetPackageDescrFromFile(
@@ -2390,7 +2388,6 @@ class MiscDRLParserTest {
         assertThat(pattern.getObjectType()).isEqualTo("Person");
     }
 
-    @Disabled("Priority : High | Implement from collect")
     @Test
     public void parse_CollectWithNestedFrom() throws Exception {
         final PackageDescr pkg = parseAndGetPackageDescrFromFile(
@@ -2412,7 +2409,6 @@ class MiscDRLParserTest {
         assertThat(people.getObjectType()).isEqualTo("People");
     }
 
-    @Disabled("Priority : High | Implement accumulate and Implement from 
collect")
     @Test
     public void parse_AccumulateWithNestedFrom() throws Exception {
         final PackageDescr pkg = parseAndGetPackageDescrFromFile(


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

Reply via email to