This is an automated email from the ASF dual-hosted git repository.
gitgabrio 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 79a2119574 [incubator-kie-issues#1095] Verify constraints on
complextypes hierarchy (#5851)
79a2119574 is described below
commit 79a21195741c75da2270693c0a933c8d4d31b2b8
Author: Gabriele Cardosi <[email protected]>
AuthorDate: Mon May 6 10:38:20 2024 +0200
[incubator-kie-issues#1095] Verify constraints on complextypes hierarchy
(#5851)
* [incubator-kie-issues#1095] Implemented constraints on complex types.
Implemented tests
* [incubator-kie-issues#1095] Removed wrong test
* [incubator-kie-issues#1095] Fix model
---------
Co-authored-by: Gabriele-Cardosi <[email protected]>
---
.../org/kie/dmn/core/compiler/DMNCompilerImpl.java | 6 ++
.../java/org/kie/dmn/core/DMNCompilerTest.java | 51 +++++++++++++++-
.../test/java/org/kie/dmn/core/DMNTypeTest.java | 71 ++++++++++++++++++++--
.../valid_models/DMNv1_5/InheritedConstraints.dmn | 53 ++++++++++++++++
4 files changed, 173 insertions(+), 8 deletions(-)
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java
index 640a5c002a..8cc1eb40c2 100644
---
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java
+++
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java
@@ -641,6 +641,12 @@ public class DMNCompilerImpl implements DMNCompiler {
if (type instanceof CompositeTypeImpl) {
CompositeTypeImpl compositeTypeImpl =
(CompositeTypeImpl) type;
type = new CompositeTypeImpl(namespace, name, id,
isCollection, compositeTypeImpl.getFields(), baseType, baseFEELType);
+ if (allowedValues != null && !allowedValues.isEmpty())
{
+ type.setAllowedValues(allowedValues);
+ }
+ if (typeConstraint != null &&
!typeConstraint.isEmpty()) {
+ type.setTypeConstraint(typeConstraint);
+ }
} else if (type instanceof SimpleTypeImpl) {
type = new SimpleTypeImpl(namespace, name, id,
isCollection, allowedValues, typeConstraint,
baseType, baseFEELType);
diff --git
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNCompilerTest.java
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNCompilerTest.java
index 55ef34f927..a6b8480ddd 100644
--- a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNCompilerTest.java
+++ b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNCompilerTest.java
@@ -18,9 +18,6 @@
*/
package org.kie.dmn.core;
-import java.util.Arrays;
-import java.util.Map;
-
import org.junit.Test;
import org.kie.dmn.api.core.DMNContext;
import org.kie.dmn.api.core.DMNMessage;
@@ -32,6 +29,7 @@ import org.kie.dmn.api.core.FEELPropertyAccessible;
import org.kie.dmn.api.core.ast.ItemDefNode;
import org.kie.dmn.core.api.DMNFactory;
import org.kie.dmn.core.compiler.DMNTypeRegistry;
+import org.kie.dmn.core.impl.BaseDMNTypeImpl;
import org.kie.dmn.core.impl.CompositeTypeImpl;
import org.kie.dmn.core.impl.DMNContextFPAImpl;
import org.kie.dmn.core.impl.DMNModelImpl;
@@ -45,10 +43,14 @@ import org.kie.dmn.feel.util.ClassLoaderUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.Arrays;
+import java.util.Map;
+
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import static org.kie.dmn.core.util.DynamicTypeUtils.entry;
import static org.kie.dmn.core.util.DynamicTypeUtils.mapOf;
+import static org.kie.dmn.core.util.DynamicTypeUtils.prototype;
public class DMNCompilerTest extends BaseVariantTest {
@@ -345,6 +347,49 @@ public class DMNCompilerTest extends BaseVariantTest {
.count()).as(DMNRuntimeUtil.formatMessages(dmnModel.getMessages())).isEqualTo(4L);
}
+ @Test
+ public void testAllowedValuesForSimpleTypeInherited() {
+ String nameSpace =
"http://www.trisotech.com/definitions/_238bd96d-47cd-4746-831b-504f3e77b442";
+ final DMNRuntime runtime =
DMNRuntimeUtil.createRuntime("valid_models/DMNv1_5/InheritedConstraints.dmn",
this.getClass());
+ final DMNModel dmnModel = runtime.getModel(
+ nameSpace,
+ "InheritedConstraints");
+ assertThat(dmnModel).isNotNull();
+
assertThat(dmnModel.hasErrors()).as(DMNRuntimeUtil.formatMessages(dmnModel.getMessages())).isFalse();
+ final DMNType aStringType = ((DMNModelImpl)
dmnModel).getTypeRegistry().getTypes().get(nameSpace).get("AString");
+ assertThat(aStringType.isAssignableValue("Bob")).isTrue();
+ assertThat(aStringType.isAssignableValue("Joe")).isTrue();
+ final DMNType aConstrainedStringType = ((DMNModelImpl)
dmnModel).getTypeRegistry().getTypes().get(nameSpace).get("AConstrainedString");
+ assertThat(aConstrainedStringType.isAssignableValue("Bob")).isTrue();
+ assertThat(aConstrainedStringType.isAssignableValue("Joe")).isFalse();
+ }
+
+ @Test
+ public void testAllowedValuesForComplexTypeInherited() {
+ String nameSpace =
"http://www.trisotech.com/definitions/_238bd96d-47cd-4746-831b-504f3e77b442";
+ final DMNRuntime runtime =
DMNRuntimeUtil.createRuntime("valid_models/DMNv1_5/InheritedConstraints.dmn",
this.getClass());
+ final DMNModel dmnModel = runtime.getModel(
+ nameSpace,
+ "InheritedConstraints");
+ assertThat(dmnModel).isNotNull();
+
assertThat(dmnModel.hasErrors()).as(DMNRuntimeUtil.formatMessages(dmnModel.getMessages())).isFalse();
+ final BaseDMNTypeImpl dmnAdultPerson = (BaseDMNTypeImpl)
((DMNModelImpl)
dmnModel).getTypeRegistry().getTypes().get(nameSpace).get("AdultPerson");
+ final Map<String, Object> instanceAdultBob = prototype(entry("name",
"Bob"), entry("age", 42));
+
assertThat(dmnAdultPerson.isAssignableValue(instanceAdultBob)).isTrue();
+ final Map<String, Object> instanceYoungBob = prototype(entry("name",
"Bob"), entry("age", 12));
+
assertThat(dmnAdultPerson.isAssignableValue(instanceYoungBob)).isFalse();
+
+ final BaseDMNTypeImpl dmnAdultBobPerson = (BaseDMNTypeImpl)
((DMNModelImpl)
dmnModel).getTypeRegistry().getTypes().get(nameSpace).get("AdultBob");
+
assertThat(dmnAdultBobPerson.isAssignableValue(instanceAdultBob)).isTrue();
+ // UnaryTests are AND - based for constraints defined on
different/inherited types
+
assertThat(dmnAdultBobPerson.isAssignableValue(instanceYoungBob)).isFalse();
+ final Map<String, Object> instanceAdultJoe = prototype(entry("name",
"Joe"), entry("age", 42));
+ // UnaryTests are AND - based for constraints defined on
different/inherited types
+
assertThat(dmnAdultBobPerson.isAssignableValue(instanceAdultJoe)).isFalse();
+ final Map<String, Object> instanceYoungJoe = prototype(entry("name",
"Joe"), entry("age", 12));
+
assertThat(dmnAdultBobPerson.isAssignableValue(instanceYoungJoe)).isFalse();
+ }
+
private void commonValidateUnnamedImport(String importingModelRef, String
importedModelRef) {
final DMNRuntime runtime =
createRuntimeWithAdditionalResources(importingModelRef,
this.getClass(),
diff --git
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNTypeTest.java
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNTypeTest.java
index 96e8e2a7ed..47d0c68b0f 100644
--- a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNTypeTest.java
+++ b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNTypeTest.java
@@ -18,21 +18,22 @@
*/
package org.kie.dmn.core;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
import org.junit.Test;
import org.kie.dmn.api.core.DMNType;
import org.kie.dmn.core.compiler.DMNTypeRegistry;
import org.kie.dmn.core.compiler.DMNTypeRegistryV15;
+import org.kie.dmn.core.impl.BaseDMNTypeImpl;
import org.kie.dmn.core.impl.CompositeTypeImpl;
import org.kie.dmn.core.impl.SimpleTypeImpl;
import org.kie.dmn.feel.FEEL;
import org.kie.dmn.feel.lang.types.BuiltInType;
import org.kie.dmn.model.v1_5.KieDMNModelInstrumentedBase;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
import static org.assertj.core.api.Assertions.assertThat;
import static org.kie.dmn.core.util.DynamicTypeUtils.entry;
import static org.kie.dmn.core.util.DynamicTypeUtils.prototype;
@@ -121,5 +122,65 @@ public class DMNTypeTest {
assertThat(tDecision1.isAssignableValue(Arrays.asList("sda", "de",
"z"))).isTrue();
}
+ @Test
+ public void testAllowedValuesForSimpleTypeInherited() {
+ final String testNS = "testAllowedValuesForSimpleTypeInherited";
+
+ final FEEL feel = FEEL.newInstance();
+ final DMNType aStringSimpleType = typeRegistry.registerType(new
SimpleTypeImpl(testNS, "AString", null, false, feel.evaluateUnaryTests("string
length( ? ) = 3"), null, FEEL_STRING, BuiltInType.STRING));
+ assertThat(aStringSimpleType.isAssignableValue("abc")).isTrue();
+ assertThat(aStringSimpleType.isAssignableValue("ab")).isFalse();
+ assertThat(aStringSimpleType.isAssignableValue("c")).isFalse();
+ final DMNType aConstrainedStringSimpleType =
typeRegistry.registerType(new SimpleTypeImpl(testNS, "AConstrainedString",
+ null, false, feel.evaluateUnaryTests("\"Bob\""), null,
aStringSimpleType, BuiltInType.STRING));
+
assertThat(aConstrainedStringSimpleType.isAssignableValue("Bob")).isTrue();
+
assertThat(aConstrainedStringSimpleType.isAssignableValue("abc")).isFalse();
+ }
+
+ @Test
+ public void testAllowedValuesForComplexType() {
+ final String testNS = "testAllowedValuesForComplexType";
+ final FEEL feel = FEEL.newInstance();
+ final Map<String, DMNType> personPrototype = prototype(entry("name",
FEEL_STRING), entry("age", FEEL_NUMBER));
+ final BaseDMNTypeImpl dmnPerson = (BaseDMNTypeImpl)
typeRegistry.registerType(new CompositeTypeImpl(testNS, "Person", null, false,
personPrototype, null, null));
+ dmnPerson.setAllowedValues(feel.evaluateUnaryTests("?.name = \"Bob\",
?.age >= 30"));
+ final Map<String, Object> instanceAdultBob = prototype(entry("name",
"Bob"), entry("age", 42));
+ assertThat(dmnPerson.isAssignableValue(instanceAdultBob)).isTrue();
+ final Map<String, Object> instanceYoungBob = prototype(entry("name",
"Bob"), entry("age", 12));
+ // UnaryTests are OR - based for constraints defined on the same type
+ assertThat(dmnPerson.isAssignableValue(instanceYoungBob)).isTrue();
+ final Map<String, Object> instanceAdultJoe = prototype(entry("name",
"Joe"), entry("age", 42));
+ // UnaryTests are OR - based for constraints defined on the same type
+ assertThat(dmnPerson.isAssignableValue(instanceAdultJoe)).isTrue();
+ final Map<String, Object> instanceYoungJoe = prototype(entry("name",
"Joe"), entry("age", 12));
+ assertThat(dmnPerson.isAssignableValue(instanceYoungJoe)).isFalse();
+ }
+
+ @Test
+ public void testAllowedValuesForComplexTypeInherited() {
+ final String testNS = "testAllowedValuesForComplexType";
+ final FEEL feel = FEEL.newInstance();
+ final Map<String, DMNType> personPrototype = prototype(entry("name",
FEEL_STRING), entry("age", FEEL_NUMBER));
+ final BaseDMNTypeImpl dmnAdultPerson = (BaseDMNTypeImpl)
typeRegistry.registerType(new CompositeTypeImpl(testNS, "AdultPerson", null,
false, personPrototype, null, null));
+ dmnAdultPerson.setAllowedValues(feel.evaluateUnaryTests("?.age >=
30"));
+ final Map<String, Object> instanceAdultBob = prototype(entry("name",
"Bob"), entry("age", 42));
+
assertThat(dmnAdultPerson.isAssignableValue(instanceAdultBob)).isTrue();
+ final Map<String, Object> instanceYoungBob = prototype(entry("name",
"Bob"), entry("age", 12));
+
assertThat(dmnAdultPerson.isAssignableValue(instanceYoungBob)).isFalse();
+
+ final BaseDMNTypeImpl dmnAdultBobPerson = (BaseDMNTypeImpl)
typeRegistry.registerType(new CompositeTypeImpl(testNS, "AdultBobPerson", null,
false, personPrototype, dmnAdultPerson, null));
+ dmnAdultBobPerson.setAllowedValues(feel.evaluateUnaryTests("?.name =
\"Bob\""));
+
assertThat(dmnAdultBobPerson.isAssignableValue(instanceAdultBob)).isTrue();
+ // UnaryTests are AND - based for constraints defined on
different/inherited types
+
assertThat(dmnAdultBobPerson.isAssignableValue(instanceYoungBob)).isFalse();
+ final Map<String, Object> instanceAdultJoe = prototype(entry("name",
"Joe"), entry("age", 42));
+ // UnaryTests are AND - based for constraints defined on
different/inherited types
+
assertThat(dmnAdultBobPerson.isAssignableValue(instanceAdultJoe)).isFalse();
+ final Map<String, Object> instanceYoungJoe = prototype(entry("name",
"Joe"), entry("age", 12));
+
assertThat(dmnAdultBobPerson.isAssignableValue(instanceYoungJoe)).isFalse();
+ }
+
+
+
}
diff --git
a/kie-dmn/kie-dmn-test-resources/src/test/resources/valid_models/DMNv1_5/InheritedConstraints.dmn
b/kie-dmn/kie-dmn-test-resources/src/test/resources/valid_models/DMNv1_5/InheritedConstraints.dmn
new file mode 100644
index 0000000000..923060d92b
--- /dev/null
+++
b/kie-dmn/kie-dmn-test-resources/src/test/resources/valid_models/DMNv1_5/InheritedConstraints.dmn
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<dmn:definitions
xmlns="http://www.trisotech.com/definitions/_238bd96d-47cd-4746-831b-504f3e77b442"
+ xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/"
+ xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/"
+
xmlns:dmndi="https://www.omg.org/spec/DMN/20230324/DMNDI/"
+ xmlns:feel="https://www.omg.org/spec/DMN/20230324/FEEL/"
+ xmlns:dmn="https://www.omg.org/spec/DMN/20230324/MODEL/"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ exporter="DMN Modeler"
+ exporterVersion="5.1.10.201705011622"
+ id="_238bd96d-47cd-4746-831b-504f3e77b442"
+ name="InheritedConstraints"
+
namespace="http://www.trisotech.com/definitions/_238bd96d-47cd-4746-831b-504f3e77b442">
+ <!-- simple type -->
+ <dmn:itemDefinition isCollection="false" label="A String" name="AString">
+ <dmn:typeRef>string</dmn:typeRef>
+ <dmn:allowedValues>
+ <dmn:text>string length( ? ) = 3</dmn:text>
+ </dmn:allowedValues>
+ </dmn:itemDefinition>
+ <dmn:itemDefinition isCollection="false" label="A Constrained String"
name="AConstrainedString">
+ <dmn:typeRef>AString</dmn:typeRef>
+ <dmn:allowedValues>
+ <dmn:text>"Bob"</dmn:text>
+ </dmn:allowedValues>
+ </dmn:itemDefinition>
+
+ <!-- complex type -->
+ <dmn:itemDefinition isCollection="false" label="Person" name="Person">
+ <dmn:itemComponent id="_7939ee65-737d-4ea9-b912-448dd5fb2cf1"
+ isCollection="false"
+ name="name">
+ <dmn:typeRef>string</dmn:typeRef>
+ </dmn:itemComponent>
+ <dmn:itemComponent id="_7939ee65-737d-4ea9-b912-448dd5fb2cf2"
+ isCollection="false"
+ name="age">
+ <dmn:typeRef>number</dmn:typeRef>
+ </dmn:itemComponent>
+ </dmn:itemDefinition>
+ <dmn:itemDefinition isCollection="false" label="Adult Person"
name="AdultPerson">
+ <dmn:typeRef>Person</dmn:typeRef>
+ <dmn:allowedValues>
+ <dmn:text>?.age >= 30</dmn:text>
+ </dmn:allowedValues>
+ </dmn:itemDefinition>
+ <dmn:itemDefinition isCollection="false" label="Adult Bob" name="AdultBob">
+ <dmn:typeRef>AdultPerson</dmn:typeRef>
+ <dmn:allowedValues>
+ <dmn:text>?.name = "Bob"</dmn:text>
+ </dmn:allowedValues>
+ </dmn:itemDefinition>
+</dmn:definitions>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]