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 514b7d8744 [incubator-kie-drools-5906] [new-parser] unification in 
accumulate (#5907)
514b7d8744 is described below

commit 514b7d874443cabb250b28e95baa9298dcbc405b
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Thu May 9 10:15:35 2024 +0900

    [incubator-kie-drools-5906] [new-parser] unification in accumulate (#5907)
---
 .../drl/parser/antlr4/MiscDRLParserTest.java       | 27 ++++++++++++++++++++++
 .../org/drools/drl/parser/antlr4/DRLParser.g4      |  2 +-
 .../drools/drl/parser/antlr4/DRLVisitorImpl.java   | 11 +++++++--
 3 files changed, 37 insertions(+), 3 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 94802923bb..899d7902d3 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
@@ -4751,4 +4751,31 @@ class MiscDRLParserTest {
         ExprConstraintDescr exprConstraintDescr = 
parseAndGetFirstConstraintDescr(text);
         assertThat(exprConstraintDescr.getExpression()).isEqualTo("value == 10 
&& someMethod(value) == 4");
     }
+
+    @Test
+    void unificationInAccumulateRule() {
+        final String text =
+                "rule R\n" +
+                        "when\n" +
+                        "    MyFact($i : currentValue)\n" +
+                        "    accumulate( $p : Person( name == \"John\" ),\n" +
+                        "                $i := min( $p.getAge() ) )\n" +
+                        "then\n" +
+                        "end";
+        RuleDescr rule = parseAndGetFirstRuleDescr(text);
+        assertThat(rule.getLhs().getDescrs().size()).isEqualTo(2);
+
+        final PatternDescr outPattern = (PatternDescr) 
rule.getLhs().getDescrs().get(1);
+        AccumulateDescr accumulateDescr = (AccumulateDescr) 
outPattern.getSource();
+        
assertThat(accumulateDescr.getInputPattern()).isInstanceOfSatisfying(PatternDescr.class,
 patternDescr -> {
+            assertThat(patternDescr.getIdentifier()).isEqualTo("$p");
+            assertThat(patternDescr.getObjectType()).isEqualTo("Person");
+        });
+
+        AccumulateDescr.AccumulateFunctionCallDescr accumulateFunction = 
accumulateDescr.getFunctions().get(0);
+        assertThat(accumulateFunction.getBind()).isEqualTo("$i");
+        assertThat(accumulateFunction.isUnification()).isTrue();
+        assertThat(accumulateFunction.getFunction()).isEqualTo("min");
+        
assertThat(accumulateFunction.getParams()).containsExactly("$p.getAge()");
+    }
 }
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 6c37402f10..2416b09cfb 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
@@ -351,7 +351,7 @@ blockStatements : drlBlockStatement* ;
 /*
 accumulateFunction := label? ID parameters
 */
-accumulateFunction : label? drlIdentifier conditionalExpressions ;
+accumulateFunction : (label|unif)? drlIdentifier conditionalExpressions ;
 
 // parameters := LEFT_PAREN (conditionalExpression (COMMA 
conditionalExpression)* )? RIGHT_PAREN
 conditionalExpressions : LPAREN (conditionalExpression (COMMA 
conditionalExpression)* )? RPAREN ;
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 1faa36574e..8212a7f64c 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
@@ -803,12 +803,19 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
     @Override
     public AccumulateDescr.AccumulateFunctionCallDescr 
visitAccumulateFunction(DRLParser.AccumulateFunctionContext ctx) {
         String function = ctx.drlIdentifier().getText();
-        String bind = ctx.label() == null ? null : 
ctx.label().drlIdentifier().getText();
+        String bind = null;
+        boolean unify = false;
+        if (ctx.label() != null) {
+            bind = ctx.label().drlIdentifier().getText();
+        } else if (ctx.unif() != null) {
+            bind = ctx.unif().drlIdentifier().getText();
+            unify = true;
+        }
 
         String[] params = 
ctx.conditionalExpressions().conditionalExpression().stream()
                 .map(RuleContext::getText)
                 .toArray(String[]::new);
-        return new AccumulateDescr.AccumulateFunctionCallDescr(function, bind, 
false, params);
+        return new AccumulateDescr.AccumulateFunctionCallDescr(function, bind, 
unify, params);
     }
 
     @Override


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

Reply via email to