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]

Reply via email to