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]

Reply via email to