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 160b24ae12 [new-parser] Allow OOPath as a LHS pattern (#5884)
160b24ae12 is described below

commit 160b24ae120afc7a01c36a9bd0bcf4542c3c5f97
Author: Jiří Locker <[email protected]>
AuthorDate: Tue May 7 04:41:39 2024 +0200

    [new-parser] Allow OOPath as a LHS pattern (#5884)
    
    * Add OOPath support to lhsPattern
    
    * Set namespace and unit properties to PackageDescr children
---
 .../drl/parser/antlr4/MiscDRLParserTest.java       | 61 ++++++++++++++++++++++
 .../drools/drl/parser/antlr4/package_children.drl  | 53 +++++++++++++++++++
 .../org/drools/drl/parser/antlr4/DRLParser.g4      |  5 +-
 .../drools/drl/parser/antlr4/DRLVisitorImpl.java   | 21 ++++++++
 4 files changed, 139 insertions(+), 1 deletion(-)

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 9f1d67035b..4964f77457 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
@@ -26,6 +26,7 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -4090,6 +4091,28 @@ class MiscDRLParserTest {
                 .isEqualToIgnoringWhitespace("/wife[$age : age] && age > 
$age");
     }
 
+    @Test
+    void ooPathLhsPattern() {
+        final String text = "package org.drools\n"
+                + "rule PlainNot when\n"
+                + "    not( /strings [ this == \"It Does Work\" ] )\n"
+                + "then\n"
+                + "end\n";
+        PackageDescr packageDescr = parseAndGetPackageDescr(text);
+        RuleDescr ruleDescr = packageDescr.getRules().get(0);
+        
assertThat(ruleDescr.getLhs().getDescrs().get(0)).isInstanceOfSatisfying(NotDescr.class,
 notDescr -> {
+            assertThat(notDescr.getDescrs()).hasSize(1);
+            
assertThat(notDescr.getDescrs().get(0)).isInstanceOfSatisfying(PatternDescr.class,
 patternDescr -> {
+               assertThat(patternDescr.getConstraint().getDescrs()).hasSize(1);
+               
assertThat(patternDescr.getConstraint().getDescrs().get(0)).isInstanceOfSatisfying(ExprConstraintDescr.class,
 exprConstraintDescr -> {
+                   
assertThat(exprConstraintDescr.getExpression()).isEqualTo("/strings [ this == 
\"It Does Work\" ]");
+                   
assertThat(exprConstraintDescr.getType()).isEqualTo(ExprConstraintDescr.Type.NAMED);
+                   assertThat(exprConstraintDescr.getPosition()).isEqualTo(0);
+               });
+            });
+        });
+    }
+
     @Test
     void inlineCast() {
         final String text = "package org.drools\n" +
@@ -4605,4 +4628,42 @@ class MiscDRLParserTest {
         TypeFieldDescr romanStr = 
enumDeclarationDescr.getFields().get("romanStr");
         assertThat(romanStr.getPattern().getObjectType()).isEqualTo("String");
     }
+
+    @Test
+    void packageChildrenNamespaceAndUnitProperties() {
+        String namespace = "org.drools.compiler.test";
+        String source = readResource("package_children.drl");
+        PackageDescr pkg = parseAndGetPackageDescr(source);
+
+        // Package and Rule Unit's namespace.
+        assertThat(pkg.getName()).isEqualTo(namespace);
+        assertThat(pkg.getUnit().getNamespace()).isEqualTo(namespace);
+
+        // Children that are expected to have the package name as their 
namespace.
+        assertNamespace(pkg.getImports(), namespace);
+        assertNamespace(pkg.getFunctionImports(), namespace);
+        assertNamespace(pkg.getAccumulateImports(), namespace);
+        assertNamespace(pkg.getGlobals(), namespace);
+        assertNamespace(pkg.getFunctions(), namespace);
+        assertNamespace(pkg.getRules(), namespace);
+        assertNamespace(pkg.getAttributes(), namespace);
+
+        // Children that are expected to have no namespace.
+        assertNamespace(pkg.getTypeDeclarations(), "");
+        assertNamespace(pkg.getEnumDeclarations(), "");
+        assertNamespace(pkg.getEntryPointDeclarations(), "");
+        assertNamespace(pkg.getWindowDeclarations(), "");
+
+        assertThat(pkg.getRules())
+                .allSatisfy(ruleDescr -> 
assertThat(ruleDescr.getUnit()).isNotNull())
+                .allSatisfy(ruleDescr -> 
assertThat(ruleDescr.getUnit().getTarget()).isEqualTo("TestUnit"));
+
+        
assertThat(pkg.getRules().get(0).getUnitQualifiedName()).isEqualTo("TestUnit.MyQuery");
+        
assertThat(pkg.getRules().get(1).getUnitQualifiedName()).isEqualTo("TestUnit.My 
Rule");
+    }
+
+    static void assertNamespace(Collection<? extends BaseDescr> children, 
String namespace) {
+        assertThat(children).isNotEmpty(); // Make sure that every child type 
is represented.
+        assertThat(children).allSatisfy(baseDescr -> 
assertThat(baseDescr.getNamespace()).isEqualTo(namespace));
+    }
 }
diff --git 
a/drools-drl/drools-drl-parser-tests/src/test/resources/org/drools/drl/parser/antlr4/package_children.drl
 
b/drools-drl/drools-drl-parser-tests/src/test/resources/org/drools/drl/parser/antlr4/package_children.drl
new file mode 100644
index 0000000000..f419879de3
--- /dev/null
+++ 
b/drools-drl/drools-drl-parser-tests/src/test/resources/org/drools/drl/parser/antlr4/package_children.drl
@@ -0,0 +1,53 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
See the License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.drools.compiler.test
+
+unit TestUnit
+
+import org.drools.compiler.Cheese
+
+import function abc.def.x
+
+import accumulate foo.Bar2 baz2
+
+global List result
+
+declare Person end
+
+declare enum Color WHITE; end
+
+declare entry-point EntryPoint end
+
+declare window Window
+  Double() over window:length( 10 )
+end
+
+query MyQuery
+  Cheese()
+end
+
+function String doSomething() {}
+
+enabled true;
+
+dialect "java"
+
+rule "My Rule"
+when
+then
+end
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 a58b38e0b4..f0eba169bf 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
@@ -147,7 +147,10 @@ lhsPattern : xpathPrimary (OVER patternFilter)? |
              ( QUESTION? qualifiedIdentifier LPAREN positionalConstraints? 
constraints? RPAREN (OVER patternFilter)? (FROM patternSource)? ) ;
 */
 
-lhsPattern : QUESTION? objectType=drlQualifiedName LPAREN 
positionalConstraints? constraints? RPAREN drlAnnotation* (DRL_OVER 
patternFilter)? (DRL_FROM patternSource)? ;
+lhsPattern
+  : xpathPrimary (DRL_OVER patternFilter)?
+  | QUESTION? objectType=drlQualifiedName LPAREN positionalConstraints? 
constraints? RPAREN drlAnnotation* (DRL_OVER patternFilter)? (DRL_FROM 
patternSource)?
+  ;
 positionalConstraints : constraint (COMMA constraint)* SEMI ;
 constraints : constraint (COMMA constraint)* ;
 constraint : ( nestedConstraint | conditionalOrExpression ) ;
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 db5e0c2dd8..143e0a2da8 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
@@ -111,14 +111,19 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
         // This bunch of if-blocks will be refactored by DROOLS-7564
         descrList.forEach(descr -> {
             if (descr instanceof UnitDescr) {
+                descr.setNamespace(packageDescr.getNamespace());
                 packageDescr.setUnit((UnitDescr) descr);
             } else if (descr instanceof GlobalDescr) {
+                descr.setNamespace(packageDescr.getNamespace());
                 packageDescr.addGlobal((GlobalDescr) descr);
             } else if (descr instanceof FunctionImportDescr) {
+                descr.setNamespace(packageDescr.getNamespace());
                 packageDescr.addFunctionImport((FunctionImportDescr) descr);
             } else if (descr instanceof AccumulateImportDescr) {
+                descr.setNamespace(packageDescr.getNamespace());
                 packageDescr.addAccumulateImport((AccumulateImportDescr) 
descr);
             } else if (descr instanceof ImportDescr) {
+                descr.setNamespace(packageDescr.getNamespace());
                 packageDescr.addImport((ImportDescr) descr);
             } else if (descr instanceof FunctionDescr) {
                 FunctionDescr functionDescr = (FunctionDescr) descr;
@@ -137,12 +142,14 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
             } else if (descr instanceof EnumDeclarationDescr) {
                 packageDescr.addEnumDeclaration((EnumDeclarationDescr) descr);
             } else if (descr instanceof AttributeDescr) {
+                descr.setNamespace(packageDescr.getNamespace());
                 packageDescr.addAttribute((AttributeDescr) descr);
             } else if (descr instanceof RuleDescr) { // QueryDescr extends 
RuleDescr
                 RuleDescr ruleDescr = (RuleDescr) descr;
                 packageDescr.addRule(ruleDescr);
                 packageDescr.afterRuleAdded(ruleDescr);
                 ruleDescr.setNamespace(packageDescr.getNamespace());
+                ruleDescr.setUnit(packageDescr.getUnit());
             }
         });
     }
@@ -579,6 +586,20 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
      */
     @Override
     public PatternDescr visitLhsPattern(DRLParser.LhsPatternContext ctx) {
+        if (ctx.xpathPrimary() != null) {
+            String constraint = visitConstraintChildren(ctx);
+            ExprConstraintDescr constraintDescr = BaseDescrFactory.builder(new 
ExprConstraintDescr(constraint))
+                    .withParserRuleContext(ctx)
+                    .build();
+            constraintDescr.setType(ExprConstraintDescr.Type.NAMED);
+            constraintDescr.setPosition(0);
+            PatternDescr patternDescr = BaseDescrFactory.builder(new 
PatternDescr())
+                    .withParserRuleContext(ctx)
+                    .build();
+            patternDescr.addConstraint(constraintDescr);
+            return patternDescr;
+        }
+
         PatternDescr patternDescr = BaseDescrFactory.builder(new 
PatternDescr(ctx.objectType.getText()))
                 .withParserRuleContext(ctx)
                 .build();


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

Reply via email to