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]