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 d1c2a17d2e [incubator-kie-drools-5712] Queries with arguments cannot
be parsed (#5811)
d1c2a17d2e is described below
commit d1c2a17d2eff64be0e7c543d5806858ce6f44104
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Tue Apr 2 15:25:12 2024 +0900
[incubator-kie-drools-5712] Queries with arguments cannot be parsed (#5811)
---
.../drl/parser/antlr4/MiscDRLParserTest.java | 70 ++++++++++++++++++++++
.../org/drools/drl/parser/antlr4/DRLParser.g4 | 8 ++-
.../drools/drl/parser/antlr4/DRLVisitorImpl.java | 15 +++--
3 files changed, 84 insertions(+), 9 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 0029602df5..86beaa4e13 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
@@ -3909,4 +3909,74 @@ class MiscDRLParserTest {
ExprConstraintDescr constraintDescr =
getFirstExprConstraintDescr(packageDescr);
assertThat(constraintDescr.toString()).isEqualToIgnoringWhitespace("this#Person.name
== \"Mark\"");
}
+
+ @Test
+ public void queryArgumentWithoutType() throws Exception {
+ final String text = "package org.drools\n" +
+ "query olderThan( $age )\n" +
+ " $p : Person(age > (Integer)$age)\n" +
+ "end ";
+ final QueryDescr query = parseAndGetFirstQueryDescr(text);
+
+ assertThat(query).isNotNull();
+ assertThat(query.getName()).isEqualTo("olderThan");
+ assertThat(query.getParameterTypes()).containsExactly("Object");
+ assertThat(query.getParameters()).containsExactly("$age");
+ }
+
+ @Test
+ public void queryMultipleArguments() throws Exception {
+ final String text = "package org.drools\n" +
+ "query olderThan( String $name, int $age )\n" +
+ " $p : Person(age > $age)\n" +
+ "end ";
+ final QueryDescr query = parseAndGetFirstQueryDescr(text);
+
+ assertThat(query).isNotNull();
+ assertThat(query.getName()).isEqualTo("olderThan");
+ assertThat(query.getParameterTypes()).containsExactly("String", "int");
+ assertThat(query.getParameters()).containsExactly("$name", "$age");
+ }
+
+ @Test
+ public void queryArrayArgument() throws Exception {
+ final String text = "package org.drools\n" +
+ "query olderThan( int[] $ages )\n" +
+ " $p : Person(age > $ages[0])\n" +
+ "end ";
+ final QueryDescr query = parseAndGetFirstQueryDescr(text);
+
+ assertThat(query).isNotNull();
+ assertThat(query.getName()).isEqualTo("olderThan");
+ assertThat(query.getParameterTypes()).containsExactly("int[]");
+ assertThat(query.getParameters()).containsExactly("$ages");
+ }
+
+ @Test
+ public void queryZeroArgument() throws Exception {
+ final String text = "package org.drools\n" +
+ "query olderThan()\n" +
+ " $p : Person()\n" +
+ "end ";
+ final QueryDescr query = parseAndGetFirstQueryDescr(text);
+
+ assertThat(query).isNotNull();
+ assertThat(query.getName()).isEqualTo("olderThan");
+ assertThat(query.getParameterTypes()).isEmpty();
+ assertThat(query.getParameters()).isEmpty();
+ }
+
+ @Test
+ public void queryNoArgument() throws Exception {
+ final String text = "package org.drools\n" +
+ "query olderThan\n" +
+ " $p : Person()\n" +
+ "end ";
+ final QueryDescr query = parseAndGetFirstQueryDescr(text);
+
+ assertThat(query).isNotNull();
+ assertThat(query.getName()).isEqualTo("olderThan");
+ assertThat(query.getParameterTypes()).isEmpty();
+ assertThat(query.getParameters()).isEmpty();
+ }
}
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 7eb20980cd..8c48c7def4 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
@@ -79,7 +79,13 @@ ruledef : DRL_RULE name=stringId (EXTENDS
parentName=stringId)? drlAnnotation* a
// query := QUERY stringId parameters? annotation* lhsExpression END
-querydef : DRL_QUERY name=stringId formalParameters? drlAnnotation*
lhsExpression+ DRL_END SEMI?;
+querydef : DRL_QUERY name=stringId parameters? drlAnnotation* lhsExpression+
DRL_END SEMI?;
+
+// parameters := LEFT_PAREN ( parameter ( COMMA parameter )* )? RIGHT_PAREN
+parameters : LPAREN ( parameter ( COMMA parameter )* )? RPAREN ;
+
+// parameter := ({requiresType}?=>type)? ID (LEFT_SQUARE RIGHT_SQUARE)*
+parameter : type? drlIdentifier ; // type is optional. Removed (LEFT_SQUARE
RIGHT_SQUARE)* as it doesn't make sense in the grammar
lhs : DRL_WHEN lhsExpression* ;
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 8fa0be743d..292b366e81 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
@@ -304,14 +304,13 @@ public class DRLVisitorImpl extends
DRLParserBaseVisitor<Object> {
public QueryDescr visitQuerydef(DRLParser.QuerydefContext ctx) {
QueryDescr queryDescr = new
QueryDescr(safeStripStringDelimiters(ctx.name.getText()));
- DRLParser.FormalParametersContext formalParametersContext =
ctx.formalParameters();
- if (formalParametersContext != null) {
- DRLParser.FormalParameterListContext formalParameterListContext =
formalParametersContext.formalParameterList();
- List<DRLParser.FormalParameterContext> formalParameterContexts =
formalParameterListContext.formalParameter();
- formalParameterContexts.forEach(formalParameterContext -> {
- DRLParser.TypeTypeContext typeTypeContext =
formalParameterContext.typeType();
- DRLParser.VariableDeclaratorIdContext
variableDeclaratorIdContext = formalParameterContext.variableDeclaratorId();
- queryDescr.addParameter(typeTypeContext.getText(),
variableDeclaratorIdContext.getText());
+ DRLParser.ParametersContext parametersContext = ctx.parameters();
+ if (parametersContext != null) {
+ List<DRLParser.ParameterContext> parameterContexts =
parametersContext.parameter();
+ parameterContexts.forEach(parameterContext -> {
+ String type = parameterContext.type() != null ?
parameterContext.type().getText() : "Object"; // default type is Object
+ String name = parameterContext.drlIdentifier().getText();
+ queryDescr.addParameter(type, name);
});
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]