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
The following commit(s) were added to refs/heads/dev-new-parser by this push:
new 32c2bda395 [incubator-kie-drools-5948] [new-parser] Broken
testIncompatibleListOnAccumulateFunction (#5975)
32c2bda395 is described below
commit 32c2bda3953d224ab36ed269b1d3efbbbf682292
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Mon Jun 3 16:20:54 2024 +0900
[incubator-kie-drools-5948] [new-parser] Broken
testIncompatibleListOnAccumulateFunction (#5975)
---
.../drl/parser/antlr4/MiscDRLParserTest.java | 82 ++++++++++++++++++++--
.../antlr4/{accumulate.drl => from_accumulate.drl} | 0
.../org/drools/drl/parser/antlr4/DRLParser.g4 | 3 +-
.../drools/drl/parser/antlr4/DRLVisitorImpl.java | 18 ++++-
4 files changed, 95 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 ab2f707060..875315157d 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
@@ -2174,12 +2174,44 @@ class MiscDRLParserTest {
}
@Test
- public void parse_Accumulate() throws Exception {
- final PackageDescr pkg = parseAndGetPackageDescrFromFile(
-
"accumulate.drl" );
+ void accumulate() {
+ final String drl = "rule R\n" +
+ "when\n" +
+ " accumulate( Person( $age : age );\n" +
+ " $avg : average( $age ) );\n" +
+ "then\n" +
+ "end";
+ RuleDescr rule = parseAndGetFirstRuleDescr(drl);
+
+ PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ assertThat(out.getObjectType()).isEqualTo("Object");
+ AccumulateDescr accum = (AccumulateDescr) out.getSource();
+ assertThat(accum.isExternalFunction()).isTrue();
+
+ List<AccumulateDescr.AccumulateFunctionCallDescr> functions =
accum.getFunctions();
+ assertThat(functions.size()).isEqualTo(1);
+ assertThat(functions.get(0).getFunction()).isEqualTo("average");
+ assertThat(functions.get(0).getBind()).isEqualTo("$avg");
+ assertThat(functions.get(0).getParams()[0]).isEqualTo("$age");
+
+ final PatternDescr pattern = accum.getInputPattern();
+ assertThat(pattern.getObjectType()).isEqualTo("Person");
+
+ // accum.getInput() is always AndDescr
+ assertThat(accum.getInput()).isInstanceOfSatisfying(AndDescr.class,
and -> {
+ assertThat(and.getDescrs()).hasSize(1);
+
assertThat(and.getDescrs().get(0)).isInstanceOfSatisfying(PatternDescr.class,
patternDescr -> {
+ assertThat(patternDescr.getObjectType()).isEqualTo("Person");
+ });
+ });
+ }
+
+ @Test
+ void fromAccumulate() {
+ final PackageDescr pkg =
parseAndGetPackageDescrFromFile("from_accumulate.drl" );
assertThat(pkg.getRules().size()).isEqualTo(1);
- final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+ final RuleDescr rule = pkg.getRules().get( 0 );
assertThat(rule.getLhs().getDescrs().size()).isEqualTo(1);
final PatternDescr outPattern = (PatternDescr)
rule.getLhs().getDescrs().get( 0 );
@@ -2191,8 +2223,16 @@ class MiscDRLParserTest {
assertThat(accum.isExternalFunction()).isFalse();
- final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
+ final PatternDescr pattern = accum.getInputPattern();
assertThat(pattern.getObjectType()).isEqualTo("Person");
+
+ // accum.getInput() is always AndDescr
+ assertThat(accum.getInput()).isInstanceOfSatisfying(AndDescr.class,
and -> {
+ assertThat(and.getDescrs()).hasSize(1);
+
assertThat(and.getDescrs().get(0)).isInstanceOfSatisfying(PatternDescr.class,
patternDescr -> {
+ assertThat(patternDescr.getObjectType()).isEqualTo("Person");
+ });
+ });
}
@Test
@@ -5232,4 +5272,36 @@ class MiscDRLParserTest {
// At the moment, the parser accepts any input and let the compile
phase validate it.
assertThat(rule.getAttributes().get("duration").getValue()).isEqualTo("wrong
input");
}
+
+ @Test
+ void accumulateWithEmptyActionAndReverse() {
+ final String drl = "rule R when\n" +
+ " Number() from accumulate( Number(),\n" +
+ " init( double total = 0; ),\n" +
+ " action( ),\n" +
+ " reverse( ),\n" +
+ " result( new Double( total ) )\n" +
+ " )\n" +
+ "then end";
+ RuleDescr rule = parseAndGetFirstRuleDescr(drl);
+
+ final PatternDescr outPattern = (PatternDescr)
rule.getLhs().getDescrs().get( 0 );
+ final AccumulateDescr accum = (AccumulateDescr) outPattern.getSource();
+ assertThat(accum.getInitCode()).isEqualTo( "double total = 0;");
+ assertThat(accum.getActionCode()).isEmpty();
+ assertThat(accum.getReverseCode()).isEmpty();
+ assertThat(accum.getResultCode()).isEqualTo( "new Double( total )");
+
+ assertThat(accum.isExternalFunction()).isFalse();
+
+ final PatternDescr pattern = accum.getInputPattern();
+ assertThat(pattern.getObjectType()).isEqualTo("Number");
+
+ assertThat(accum.getInput()).isInstanceOfSatisfying(AndDescr.class,
and -> {
+ assertThat(and.getDescrs()).hasSize(1);
+
assertThat(and.getDescrs().get(0)).isInstanceOfSatisfying(PatternDescr.class,
patternDescr -> {
+ assertThat(patternDescr.getObjectType()).isEqualTo("Number");
+ });
+ });
+ }
}
diff --git
a/drools-drl/drools-drl-parser-tests/src/test/resources/org/drools/drl/parser/antlr4/accumulate.drl
b/drools-drl/drools-drl-parser-tests/src/test/resources/org/drools/drl/parser/antlr4/from_accumulate.drl
similarity index 100%
rename from
drools-drl/drools-drl-parser-tests/src/test/resources/org/drools/drl/parser/antlr4/accumulate.drl
rename to
drools-drl/drools-drl-parser-tests/src/test/resources/org/drools/drl/parser/antlr4/from_accumulate.drl
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 cf1afb9786..cabdaaa1f3 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
@@ -340,7 +340,8 @@ fromAccumulate := ACCUMULATE LEFT_PAREN lhsAnd
(COMMA|SEMICOLON)
) RIGHT_PAREN
*/
fromAccumulate : (DRL_ACCUMULATE|DRL_ACC) LPAREN lhsAndDef (COMMA|SEMI)
- ( DRL_INIT LPAREN initBlockStatements=chunk? RPAREN COMMA?
DRL_ACTION LPAREN actionBlockStatements=chunk? RPAREN COMMA? ( DRL_REVERSE
LPAREN reverseBlockStatements=chunk? RPAREN COMMA?)? DRL_RESULT LPAREN
resultBlockStatements=chunk RPAREN
+ ( DRL_INIT LPAREN initBlockStatements=chunk? RPAREN COMMA?
DRL_ACTION LPAREN actionBlockStatements=chunk? RPAREN COMMA? DRL_REVERSE LPAREN
reverseBlockStatements=chunk? RPAREN COMMA? DRL_RESULT LPAREN
resultBlockStatements=chunk RPAREN
+ | DRL_INIT LPAREN initBlockStatements=chunk? RPAREN COMMA?
DRL_ACTION LPAREN actionBlockStatements=chunk? RPAREN COMMA? DRL_RESULT LPAREN
resultBlockStatements=chunk RPAREN
| accumulateFunction
)
RPAREN (SEMI)?
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 39aa5e930e..d67450e919 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
@@ -699,7 +699,8 @@ public class DRLVisitorImpl extends
DRLParserBaseVisitor<Object> {
AccumulateDescr accumulateDescr = BaseDescrFactory.builder(new
AccumulateDescr())
.withParserRuleContext(ctx)
.build();
- accumulateDescr.setInput(visitLhsAndDef(ctx.lhsAndDef()));
+ // accumulateDescr.input is always AndDescr
+
accumulateDescr.setInput(wrapWithAndDescr(visitLhsAndDef(ctx.lhsAndDef()),
ctx.lhsAndDef()));
// accumulate function
for (DRLParser.AccumulateFunctionContext accumulateFunctionContext :
ctx.accumulateFunction()) {
@@ -714,6 +715,18 @@ public class DRLVisitorImpl extends
DRLParserBaseVisitor<Object> {
return patternDescr;
}
+ private AndDescr wrapWithAndDescr(BaseDescr baseDescr, ParserRuleContext
ctx) {
+ if (baseDescr instanceof AndDescr andDescr) {
+ return andDescr;
+ } else {
+ AndDescr andDescr = BaseDescrFactory.builder(new AndDescr())
+ .withParserRuleContext(ctx)
+ .build();
+ andDescr.addDescr(baseDescr);
+ return andDescr;
+ }
+ }
+
@Override
public Object visitLhsGroupBy(DRLParser.LhsGroupByContext ctx) {
GroupByDescr groupByDescr = BaseDescrFactory.builder(new
GroupByDescr())
@@ -775,7 +788,8 @@ public class DRLVisitorImpl extends
DRLParserBaseVisitor<Object> {
AccumulateDescr accumulateDescr = BaseDescrFactory.builder(new
AccumulateDescr())
.withParserRuleContext(ctx)
.build();
- accumulateDescr.setInput(visitLhsAndDef(ctx.lhsAndDef()));
+ // accumulateDescr.input is always AndDescr
+
accumulateDescr.setInput(wrapWithAndDescr(visitLhsAndDef(ctx.lhsAndDef()),
ctx.lhsAndDef()));
if (ctx.DRL_INIT() != null) {
// inline custom accumulate
accumulateDescr.setInitCode(getTextPreservingWhitespace(ctx.initBlockStatements));
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]