This is an automated email from the ASF dual-hosted git repository.

mariofusco pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git


The following commit(s) were added to refs/heads/main by this push:
     new 07a7e81299 [KIE-1172] support rule units and oopath notation in rules 
yaml format (#5903)
07a7e81299 is described below

commit 07a7e812997beccf45301a402131fb35a392298e
Author: Mario Fusco <[email protected]>
AuthorDate: Wed May 8 08:24:45 2024 +0200

    [KIE-1172] support rule units and oopath notation in rules yaml format 
(#5903)
    
    * [KIE-1172] support rule units and oopath notation in rules yaml format
    
    * wip
---
 .../compiler/rule/builder/PatternBuilder.java      |  3 +-
 .../org/drools/drl/parser/lang}/XpathAnalysis.java |  2 +-
 .../src/test/resources/expected/test1.yml          |  1 -
 .../src/test/resources/expected/test2.drl.txt      |  1 -
 .../drools/drlonyaml/model/BaseDeserializer.java   | 14 ++--
 .../org/drools/drlonyaml/model/DrlPackage.java     | 39 +++++++---
 .../java/org/drools/drlonyaml/model/Pattern.java   | 84 ++++++++++++++--------
 .../main/java/org/drools/drlonyaml/model/Rule.java |  5 +-
 .../java/org/drools/drlonyaml/model/Utils.java     | 26 +++----
 .../src/main/resources/drlonyaml-schema.json       |  9 ++-
 .../java/org/drools/drlonyaml/model/SmokeTest.java | 36 +++++-----
 .../src/test/resources/smoketests/ruleunit.drl.txt | 15 ++++
 .../src/main/resources/drl.ftl                     |  3 +-
 .../org/drools/drlonyaml/todrl/YAMLtoDRLTest.java  | 27 ++++---
 .../src/test/resources/smoketests/ruleunit.yml     | 42 +++++++++++
 .../model/codegen/execmodel/util/PatternUtil.java  |  2 +-
 .../compiler/rule/builder/XpathAnalysisTest.java   |  2 +-
 17 files changed, 211 insertions(+), 100 deletions(-)

diff --git 
a/drools-compiler/src/main/java/org/drools/compiler/rule/builder/PatternBuilder.java
 
b/drools-compiler/src/main/java/org/drools/compiler/rule/builder/PatternBuilder.java
index fdd709abcd..b6735edc55 100644
--- 
a/drools-compiler/src/main/java/org/drools/compiler/rule/builder/PatternBuilder.java
+++ 
b/drools-compiler/src/main/java/org/drools/compiler/rule/builder/PatternBuilder.java
@@ -72,7 +72,8 @@ import org.drools.compiler.compiler.PackageRegistry;
 import org.drools.compiler.lang.DescrDumper;
 import org.drools.compiler.lang.DumperContext;
 import org.drools.compiler.rule.builder.EvaluatorDefinition.Target;
-import org.drools.compiler.rule.builder.XpathAnalysis.XpathPart;
+import org.drools.drl.parser.lang.XpathAnalysis;
+import org.drools.drl.parser.lang.XpathAnalysis.XpathPart;
 import org.drools.compiler.rule.builder.util.ConstraintUtil;
 import org.drools.core.base.FieldNameSupplier;
 import org.drools.core.rule.BehaviorRuntime;
diff --git 
a/drools-compiler/src/main/java/org/drools/compiler/rule/builder/XpathAnalysis.java
 
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/lang/XpathAnalysis.java
similarity index 99%
rename from 
drools-compiler/src/main/java/org/drools/compiler/rule/builder/XpathAnalysis.java
rename to 
drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/lang/XpathAnalysis.java
index bfe9712ffa..9cd7cd17d3 100644
--- 
a/drools-compiler/src/main/java/org/drools/compiler/rule/builder/XpathAnalysis.java
+++ 
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/lang/XpathAnalysis.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.drools.compiler.rule.builder;
+package org.drools.drl.parser.lang;
 
 import java.util.ArrayList;
 import java.util.Iterator;
diff --git 
a/drools-drlonyaml-parent/drools-drlonyaml-cli-tests/src/test/resources/expected/test1.yml
 
b/drools-drlonyaml-parent/drools-drlonyaml-cli-tests/src/test/resources/expected/test1.yml
index 0e652f88ff..6fbdcaf860 100644
--- 
a/drools-drlonyaml-parent/drools-drlonyaml-cli-tests/src/test/resources/expected/test1.yml
+++ 
b/drools-drlonyaml-parent/drools-drlonyaml-cli-tests/src/test/resources/expected/test1.yml
@@ -1,6 +1,5 @@
 ---
 name: mypkg
-dialect: java
 imports:
 - java.lang.Number
 - java.lang.Long
diff --git 
a/drools-drlonyaml-parent/drools-drlonyaml-cli-tests/src/test/resources/expected/test2.drl.txt
 
b/drools-drlonyaml-parent/drools-drlonyaml-cli-tests/src/test/resources/expected/test2.drl.txt
index 0694efdf5f..24d576d4ba 100644
--- 
a/drools-drlonyaml-parent/drools-drlonyaml-cli-tests/src/test/resources/expected/test2.drl.txt
+++ 
b/drools-drlonyaml-parent/drools-drlonyaml-cli-tests/src/test/resources/expected/test2.drl.txt
@@ -1,6 +1,5 @@
 // This file was automatically generated from a YAML representation.
 package mypkg;
-dialect "java";
 import java.lang.Number;
 import java.lang.Long;
 rule "R1"
diff --git 
a/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/BaseDeserializer.java
 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/BaseDeserializer.java
index c6e53100da..668fd2aaa1 100644
--- 
a/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/BaseDeserializer.java
+++ 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/BaseDeserializer.java
@@ -39,16 +39,18 @@ public class BaseDeserializer extends StdDeserializer<Base> 
{
     @Override
     public Base deserialize(JsonParser jp, DeserializationContext ctxt) throws 
IOException, JsonProcessingException {
         JsonNode node = jp.getCodec().readTree(jp);
-        if (node.get("given") != null) { // TODO maybe enforce XOR checks.
+        if (node.get("given") != null || node.get("datasource") != null) {
             return jp.getCodec().treeToValue(node, Pattern.class);
-        } else if (node.get("exists") != null) {
+        }
+        if (node.get("exists") != null) {
             return jp.getCodec().treeToValue(node, Exists.class);
-        } else if (node.get("all") != null) {
+        }
+        if (node.get("all") != null) {
             return jp.getCodec().treeToValue(node, All.class);
-        } else if (node.get("not") != null) {
+        }
+        if (node.get("not") != null) {
             return jp.getCodec().treeToValue(node, Not.class);
-        } else {
-            throw new UnsupportedOperationException();
         }
+        throw new UnsupportedOperationException();
     }
 }
diff --git 
a/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/DrlPackage.java
 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/DrlPackage.java
index 097dc884f2..c2cd806582 100644
--- 
a/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/DrlPackage.java
+++ 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/DrlPackage.java
@@ -33,38 +33,53 @@ import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonInclude.Include;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 
-@JsonPropertyOrder({"name", "dialect", "imports", "globals", "rules", 
"functions"})
+@JsonPropertyOrder({"name", "unit", "dialect", "imports", "globals", "rules", 
"functions"})
 public class DrlPackage {
+
     @JsonInclude(Include.NON_EMPTY)
     private String name = ""; // default empty, consistent with DRL parser.
+
     @JsonInclude(Include.NON_EMPTY)
-    private String dialect = "java";
+    private String unit = "";
+
+    @JsonInclude(Include.NON_EMPTY)
+    private String dialect = "";
+
     @JsonInclude(Include.NON_EMPTY)
     private List<Import> imports = new ArrayList<>();
+
     @JsonInclude(Include.NON_EMPTY)
     private List<Global> globals = new ArrayList<>();
+
     private List<Rule> rules = new ArrayList<>();
+
     @JsonInclude(Include.NON_EMPTY)
     private List<Function> functions = new ArrayList<>();
     
-    public static DrlPackage from(PackageDescr o) {
-        Objects.requireNonNull(o);
+    public static DrlPackage from(PackageDescr pkg) {
+        Objects.requireNonNull(pkg);
         DrlPackage result = new DrlPackage();
-        result.name = o.getName();
-        AttributeDescr dialectAttr = o.getAttribute("dialect");
+        result.name = pkg.getName();
+
+        if (pkg.getUnit() != null) {
+            result.unit = pkg.getUnit().getTarget();
+        }
+
+        AttributeDescr dialectAttr = pkg.getAttribute("dialect");
         if (dialectAttr != null) {
             result.dialect = dialectAttr.getValue();
         }
-        for (ImportDescr i : o.getImports()) {
+
+        for (ImportDescr i : pkg.getImports()) {
             result.imports.add(Import.from(i));
         }
-        for (GlobalDescr g : o.getGlobals()) {
+        for (GlobalDescr g : pkg.getGlobals()) {
             result.globals.add(Global.from(g));
         }
-        for (RuleDescr r : o.getRules()) {
+        for (RuleDescr r : pkg.getRules()) {
             result.rules.add(Rule.from(r));
         }
-        for (FunctionDescr f : o.getFunctions()) {
+        for (FunctionDescr f : pkg.getFunctions()) {
             result.functions.add(Function.from(f));
         }
         return result;
@@ -74,6 +89,10 @@ public class DrlPackage {
         return name;
     }
 
+    public String getUnit() {
+        return unit;
+    }
+
     public String getDialect() {
         return dialect;
     }
diff --git 
a/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/Pattern.java
 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/Pattern.java
index 2d141c490d..f111225387 100644
--- 
a/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/Pattern.java
+++ 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/Pattern.java
@@ -22,55 +22,79 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import org.drools.drl.ast.descr.BaseDescr;
 import org.drools.drl.ast.descr.ExprConstraintDescr;
 import org.drools.drl.ast.descr.FromDescr;
 import org.drools.drl.ast.descr.MVELExprDescr;
 import org.drools.drl.ast.descr.PatternDescr;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import org.drools.drl.parser.lang.XpathAnalysis;
 
 @JsonDeserialize(as = Pattern.class) // see 
https://stackoverflow.com/a/34128468/893991 TODO maybe enforce this check 
somehow
 public class Pattern implements Base {
-    @JsonProperty(required = true)
+
+    @JsonInclude(Include.NON_EMPTY)
     private String given;
+
+    @JsonInclude(Include.NON_EMPTY)
+    private String datasource;
+
     @JsonInclude(Include.NON_EMPTY)
     private String as;
+
     @JsonInclude(Include.NON_EMPTY)
     private List<String> having = new ArrayList<>();
+
     @JsonInclude(Include.NON_EMPTY)
     private String from;
-    
-    public static Pattern from(PatternDescr o) {
-        Objects.requireNonNull(o);
+
+    public static Pattern from(PatternDescr pattern) {
+        Objects.requireNonNull(pattern);
         Pattern result = new Pattern();
-        result.given = o.getObjectType();
-        if (o.getAllBoundIdentifiers().isEmpty()) {
-            // do nothing, as expected.
-        } else if (o.getAllBoundIdentifiers().size() == 1) {
-            result.as = o.getAllBoundIdentifiers().get(0);
+
+        if (pattern.getObjectType() != null) {
+            result.given = pattern.getObjectType();
+
+            for (BaseDescr c: pattern.getConstraint().getDescrs()) {
+                if (c instanceof MVELExprDescr) {
+                    result.having.add(((MVELExprDescr) c).getExpression());
+                } if (c instanceof ExprConstraintDescr) {
+                    result.having.add(((ExprConstraintDescr) 
c).getExpression());
+                } else {
+                    throw new UnsupportedOperationException();
+                }
+            }
+
+            if (pattern.getSource() != null) {
+                if (pattern.getSource() instanceof FromDescr) {
+                    result.from = ((FromDescr) 
pattern.getSource()).getDataSource().getText();
+                } else {
+                    throw new UnsupportedOperationException("unknown 
patternSourceDescr");
+                }
+            }
+
         } else {
-            result.as = o.getAllBoundIdentifiers().get(0); // TODO check the 
index=0 is always the pattern one
-        }
-        for (BaseDescr c: o.getConstraint().getDescrs()) {
-            if (c instanceof MVELExprDescr) {
-                result.having.add(((MVELExprDescr) c).getExpression());
-            } if (c instanceof ExprConstraintDescr) {
-                result.having.add(((ExprConstraintDescr) c).getExpression());
-            } else {
+
+            String oopathExpr = pattern.getDescrs().get(0).getText();
+            XpathAnalysis xpathAnalysis = XpathAnalysis.analyze(oopathExpr);
+            if (!xpathAnalysis.isSinglePart()) {
                 throw new UnsupportedOperationException();
             }
+            XpathAnalysis.XpathPart xpathPart = xpathAnalysis.getPart(0);
+            result.datasource = xpathPart.getField();
+            result.having.addAll( xpathPart.getConstraints() );
         }
-        if (o.getSource() != null) {
-            if (o.getSource() instanceof FromDescr) {                
-                result.from = ((FromDescr) 
o.getSource()).getDataSource().getText();
-            } else {
-                throw new UnsupportedOperationException("unknown 
patternSourceDescr");
-            }
+
+        if (pattern.getAllBoundIdentifiers().isEmpty()) {
+            // do nothing, as expected.
+        } else if (pattern.getAllBoundIdentifiers().size() == 1) {
+            result.as = pattern.getAllBoundIdentifiers().get(0);
+        } else {
+            result.as = pattern.getAllBoundIdentifiers().get(0); // TODO check 
the index=0 is always the pattern one
         }
+
         return result;
     }
 
@@ -89,4 +113,8 @@ public class Pattern implements Base {
     public String getFrom() {
         return from;
     }
+
+    public String getDatasource() {
+        return datasource;
+    }
 }
diff --git 
a/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/Rule.java
 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/Rule.java
index 4804591797..6e1482c81f 100644
--- 
a/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/Rule.java
+++ 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/Rule.java
@@ -30,10 +30,13 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 
 @JsonPropertyOrder({"name", "when", "then"})
 public class Rule {
+
     @JsonProperty(required = true)
     private String name;
+
     @JsonProperty(required = true)
     private List<Base> when = new ArrayList<>();
+
     @JsonProperty(required = true)
     private AbstractThen then;
 
@@ -42,7 +45,7 @@ public class Rule {
         Rule result = new Rule();
         result.name = r.getName();
         for (BaseDescr dd: r.getLhs().getDescrs()) {
-            result.when.add((Base) Utils.from(dd));
+            result.when.add(Utils.from(dd));
         }
         result.then = StringThen.from(r.getConsequence().toString());
         return result;
diff --git 
a/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/Utils.java
 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/Utils.java
index 7c5836be99..1267a6e2ff 100644
--- 
a/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/Utils.java
+++ 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/java/org/drools/drlonyaml/model/Utils.java
@@ -34,9 +34,7 @@ public class Utils {
     private static final ObjectMapper mapper;
 
     static {
-        YAMLFactory yamlFactory = YAMLFactory.builder()
-                .enable(YAMLGenerator.Feature.MINIMIZE_QUOTES)
-                .build();
+        YAMLFactory yamlFactory = 
YAMLFactory.builder().enable(YAMLGenerator.Feature.MINIMIZE_QUOTES).build();
         mapper = new ObjectMapper(yamlFactory);
     }
 
@@ -45,17 +43,19 @@ public class Utils {
     }
     
     public static Base from(BaseDescr o) {
-        if (o instanceof PatternDescr) {
-            return Pattern.from((PatternDescr) o);
-        } else if (o instanceof NotDescr) {
-            return Not.from((NotDescr) o);
-        } else if (o instanceof AndDescr) {
-            return All.from((AndDescr) o);
-        } else if (o instanceof ExistsDescr) {
-            return Exists.from((ExistsDescr) o);
-        } else {
-            throw new UnsupportedOperationException("TODO: "+o);
+        if (o instanceof PatternDescr patternDescr) {
+            return Pattern.from(patternDescr);
         }
+        if (o instanceof NotDescr notDescr) {
+            return Not.from(notDescr);
+        }
+        if (o instanceof AndDescr andDescr) {
+            return All.from(andDescr);
+        }
+        if (o instanceof ExistsDescr existsDescr) {
+            return Exists.from(existsDescr);
+        }
+        throw new UnsupportedOperationException("TODO: "+o);
     }
 
     public static List<Base> from(List<BaseDescr> descrs) {
diff --git 
a/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/resources/drlonyaml-schema.json
 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/resources/drlonyaml-schema.json
index 0e44db5a4d..2b67e32d9f 100644
--- 
a/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/resources/drlonyaml-schema.json
+++ 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/main/resources/drlonyaml-schema.json
@@ -113,6 +113,9 @@
         "as" : {
           "type" : "string"
         },
+        "datasource" : {
+          "type" : "string"
+        },
         "from" : {
           "type" : "string"
         },
@@ -125,8 +128,7 @@
             "type" : "string"
           }
         }
-      },
-      "required" : [ "given" ]
+      }
     },
     "Rule" : {
       "type" : "object",
@@ -163,6 +165,9 @@
     "name" : {
       "type" : "string"
     },
+    "unit" : {
+      "type" : "string"
+    },
     "dialect" : {
       "type" : "string"
     },
diff --git 
a/drools-drlonyaml-parent/drools-drlonyaml-model/src/test/java/org/drools/drlonyaml/model/SmokeTest.java
 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/test/java/org/drools/drlonyaml/model/SmokeTest.java
index 79ed3ccfd2..7834b23d94 100644
--- 
a/drools-drlonyaml-parent/drools-drlonyaml-model/src/test/java/org/drools/drlonyaml/model/SmokeTest.java
+++ 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/test/java/org/drools/drlonyaml/model/SmokeTest.java
@@ -18,13 +18,14 @@
  */
 package org.drools.drlonyaml.model;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature;
 import org.assertj.core.api.Assertions;
 import org.drools.drl.ast.descr.PackageDescr;
 import org.drools.drl.parser.DrlParser;
@@ -33,47 +34,38 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature;
+import static org.assertj.core.api.Assertions.assertThat;
 
 public class SmokeTest {
     private static final Logger LOG = LoggerFactory.getLogger(SmokeTest.class);
     private static final DrlParser drlParser = new DrlParser();
     private static final ObjectMapper mapper;
+
     static {
-        YAMLFactory yamlFactory = YAMLFactory.builder()
-                .enable(Feature.MINIMIZE_QUOTES)
-                .build();
+        YAMLFactory yamlFactory = 
YAMLFactory.builder().enable(Feature.MINIMIZE_QUOTES).build();
         mapper = new ObjectMapper(yamlFactory);
     }
 
     private void assertDrlToYamlAndBack(String filename) {
         try {
             String content = 
Files.readString(Paths.get(this.getClass().getResource(filename).toURI()));
-            assertThat(content).as("Failed to read test resource")
-                .isNotNull();
+            assertThat(content).as("Failed to read test resource").isNotNull();
             
             PackageDescr pkgDescr = drlParser.parse(new StringReader(content));
-            assertThat(pkgDescr).as("Failed to parse DRL as a PackageDescr")
-                .isNotNull();
+            assertThat(pkgDescr).as("Failed to parse DRL as a 
PackageDescr").isNotNull();
             
             DrlPackage model = DrlPackage.from(pkgDescr);
-            assertThat(model).as("Failed to generate from a PackageDescr a 
valid model")
-                .isNotNull();
+            assertThat(model).as("Failed to generate from a PackageDescr a 
valid model").isNotNull();
             
             StringWriter writer = new StringWriter();
             mapper.writeValue(writer, model);
             final String yaml = writer.toString();
             writer.close();            
             LOG.debug("{}", yaml);
-            assertThat(yaml).as("resulting YAML shall not be null nor empty")
-                .isNotNull()
-                .isNotEmpty();
+            assertThat(yaml).as("resulting YAML shall not be null nor 
empty").isNotNull().isNotEmpty();
             
             final DrlPackage deserPackage = mapper.readValue(yaml, 
DrlPackage.class);
-            assertThat(deserPackage).usingRecursiveComparison()
-                .isEqualTo(model);
+            
assertThat(deserPackage).usingRecursiveComparison().isEqualTo(model);
         } catch (Exception e) {
             Assertions.fail("Failed to roundtrip from DRL to YAML and back to 
YAML", e);
         }
@@ -153,4 +145,10 @@ public class SmokeTest {
         DrlPackage result = mapper.readValue(content, DrlPackage.class);
         LOG.debug("{}", result);
     }
+
+    @Test
+    public void smokeTestWithRuleUnit() {
+        String filename = "/smoketests/ruleunit.drl.txt";
+        assertDrlToYamlAndBack(filename);
+    }
 }
diff --git 
a/drools-drlonyaml-parent/drools-drlonyaml-model/src/test/resources/smoketests/ruleunit.drl.txt
 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/test/resources/smoketests/ruleunit.drl.txt
new file mode 100644
index 0000000000..f1b339c292
--- /dev/null
+++ 
b/drools-drlonyaml-parent/drools-drlonyaml-model/src/test/resources/smoketests/ruleunit.drl.txt
@@ -0,0 +1,15 @@
+// this is only syntactically valid DRL, so not ending with purely .drl
+package org.drools.unit;
+
+unit AlertingUnit;
+
+rule IncomingEvent
+  when
+    $e1 : /eventData [ type == "temperature", value >= 30 ]
+    $e2 : /eventData [ type == "temperature", value > $e1.value, this 
after[0s,5s] $e1 ]
+  then
+    String alertMessage = "Temperature increase: " + ($e2.getValue() - 
$e1.getValue());
+    System.out.println(alertMessage);
+    Alert alert = new Alert( "warning", alertMessage );
+    alertData.append( alert );
+end
diff --git 
a/drools-drlonyaml-parent/drools-drlonyaml-todrl/src/main/resources/drl.ftl 
b/drools-drlonyaml-parent/drools-drlonyaml-todrl/src/main/resources/drl.ftl
index 44b68a9592..c04411f768 100644
--- a/drools-drlonyaml-parent/drools-drlonyaml-todrl/src/main/resources/drl.ftl
+++ b/drools-drlonyaml-parent/drools-drlonyaml-todrl/src/main/resources/drl.ftl
@@ -1,5 +1,6 @@
 // This file was automatically generated from a YAML representation.
 <#if name?has_content>package ${name};</#if>
+<#if unit?has_content>unit ${unit};</#if>
 <#if dialect?has_content>dialect "${dialect}";</#if>
 <#--
 
@@ -54,7 +55,7 @@ end
 
 -->
 <#macro patternVisitor p>
-<#if p.as?has_content>${p.as} : </#if>${p.given}(${p.having?join(", ")})<#if 
p.getFrom()?has_content> from ${p.getFrom()}</#if>
+<#if p.as?has_content>${p.as} : </#if><#if 
p.given?has_content>${p.given}(${p.having?join(", ")})</#if><#if 
p.datasource?has_content>/${p.datasource}[${p.having?join(", ")}]</#if><#if 
p.getFrom()?has_content> from ${p.getFrom()}</#if>
 </#macro>
 <#--
 
diff --git 
a/drools-drlonyaml-parent/drools-drlonyaml-todrl/src/test/java/org/drools/drlonyaml/todrl/YAMLtoDRLTest.java
 
b/drools-drlonyaml-parent/drools-drlonyaml-todrl/src/test/java/org/drools/drlonyaml/todrl/YAMLtoDRLTest.java
index 9456f1af25..b412c07a3a 100644
--- 
a/drools-drlonyaml-parent/drools-drlonyaml-todrl/src/test/java/org/drools/drlonyaml/todrl/YAMLtoDRLTest.java
+++ 
b/drools-drlonyaml-parent/drools-drlonyaml-todrl/src/test/java/org/drools/drlonyaml/todrl/YAMLtoDRLTest.java
@@ -18,12 +18,13 @@
  */
 package org.drools.drlonyaml.todrl;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 import java.io.StringReader;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature;
 import org.assertj.core.api.Assertions;
 import org.drools.drl.ast.descr.PackageDescr;
 import org.drools.drl.parser.DrlParser;
@@ -32,9 +33,7 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature;
+import static org.assertj.core.api.Assertions.assertThat;
 
 public class YAMLtoDRLTest {
     private static final Logger LOG = 
LoggerFactory.getLogger(YAMLtoDRLTest.class);
@@ -50,22 +49,17 @@ public class YAMLtoDRLTest {
     private void assertDumpingYAMLtoDRLisValid(String filename) {
         try {
             final String yamlText = 
Files.readString(Paths.get(YAMLtoDRLTest.class.getResource(filename).toURI()));
-            assertThat(yamlText).as("Failed to read test resource")
-                .isNotNull();
+            assertThat(yamlText).as("Failed to read test 
resource").isNotNull();
             
             DrlPackage readValue = mapper.readValue(yamlText, 
DrlPackage.class);
-            assertThat(readValue).as("Failed to parse YAML as model")
-                .isNotNull();
+            assertThat(readValue).as("Failed to parse YAML as 
model").isNotNull();
             
             final String drlText = YAMLtoDrlDumper.dumpDRL(readValue);
             LOG.debug(drlText);
-            assertThat(drlText).as("result of DRL dumper shall not be null or 
empty")
-                .isNotNull()
-                .isNotEmpty();
+            assertThat(drlText).as("result of DRL dumper shall not be null or 
empty").isNotNull().isNotEmpty();
             
             PackageDescr parseResult = drlParser.parse(new 
StringReader(drlText));
-            assertThat(parseResult).as("The result of DRL dumper must be 
syntactically valid DRL")
-                .isNotNull();
+            assertThat(parseResult).as("The result of DRL dumper must be 
syntactically valid DRL").isNotNull();
         } catch (Exception e) {
             Assertions.fail("Failed to generate a valid DRL while processing 
YAML", e);
         }
@@ -120,4 +114,9 @@ public class YAMLtoDRLTest {
     public void smokeTestFromYAML11() {
         assertDumpingYAMLtoDRLisValid("/smoketests/yaml11.yml");
     }
+
+    @Test
+    public void smokeTestRuleUnit() {
+        assertDumpingYAMLtoDRLisValid("/smoketests/ruleunit.yml");
+    }
 }
diff --git 
a/drools-drlonyaml-parent/drools-drlonyaml-todrl/src/test/resources/smoketests/ruleunit.yml
 
b/drools-drlonyaml-parent/drools-drlonyaml-todrl/src/test/resources/smoketests/ruleunit.yml
new file mode 100644
index 0000000000..5dcfd077d2
--- /dev/null
+++ 
b/drools-drlonyaml-parent/drools-drlonyaml-todrl/src/test/resources/smoketests/ruleunit.yml
@@ -0,0 +1,42 @@
+#
+# 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.
+#
+
+# only syntactically valid yaml.
+name: org.drools.unit
+unit: AlertingUnit
+rules:
+  - name: IncomingEvent
+    when:
+      - datasource: eventData
+        as: $e1
+        having:
+          - type == "temperature"
+          - value >= 30
+      - datasource: eventData
+        as: $e2
+        having:
+          - type == "temperature"
+          - value > $e1.value
+          - "this after[0s,5s] $e1"
+    then: |
+      String alertMessage = "Temperature increase: " + ($e2.getValue() - 
$e1.getValue());
+          System.out.println(alertMessage);
+          Alert alert = new Alert( "warning", alertMessage );
+          alertData.append( alert );
+
diff --git 
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/util/PatternUtil.java
 
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/util/PatternUtil.java
index cc041675c3..d3094be848 100644
--- 
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/util/PatternUtil.java
+++ 
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/util/PatternUtil.java
@@ -24,7 +24,7 @@ import org.drools.drl.ast.descr.ExprConstraintDescr;
 import org.drools.drl.ast.descr.FromDescr;
 import org.drools.drl.ast.descr.MVELExprDescr;
 import org.drools.drl.ast.descr.PatternDescr;
-import org.drools.compiler.rule.builder.XpathAnalysis;
+import org.drools.drl.parser.lang.XpathAnalysis;
 import org.drools.model.codegen.execmodel.generator.QueryParameter;
 import org.drools.model.codegen.execmodel.generator.RuleContext;
 
diff --git 
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/compiler/rule/builder/XpathAnalysisTest.java
 
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/compiler/rule/builder/XpathAnalysisTest.java
index ff75cbeb23..506f36e3c6 100644
--- 
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/compiler/rule/builder/XpathAnalysisTest.java
+++ 
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/compiler/rule/builder/XpathAnalysisTest.java
@@ -23,7 +23,7 @@ import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 
-import org.drools.compiler.rule.builder.XpathAnalysis;
+import org.drools.drl.parser.lang.XpathAnalysis;
 import org.junit.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;


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

Reply via email to