diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersection.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersection.java index 71caf97701c9eccae1e2f6ce55a92ab6e88ee551..2cbe4f9f21c27cfa5c17f3ec1cac6f30e42e3ce2 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersection.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersection.java @@ -32,11 +32,16 @@ public class BiCreaterStringIntersection extends AbstractBoundaryBiCreater<Strin if (b1.checkWith(IS_NOT_IN_CONTACT, b2)) { return Optional.empty(); } - if (b1.matchesAny() && b2.matchesAny() - || b1.matchesAny() && !b2.matchesNoneOfValues() - || b2.matchesAny() && !b1.matchesNoneOfValues()) { + if (b1.matchesAny() && b2.matchesAny()) { return Optional.of(StringBoundary.getBuilder().matchesAny(true).build()); } + if (b1.matchesAny() && !b2.matchesNoneOfValues() + || b2.matchesAny() && !b1.matchesNoneOfValues()) { + return Optional.of( + StringBoundary.getBuilder() + .addValues(b1.matchesAny() ? b2.getValues() : b1.getValues()) + .build()); + } if (b1.matchesAny() && b2.matchesNoneOfValues()) { return Optional.of( StringBoundary.getBuilder().matchesNoneOfValues(true).addValues(b2.getValues()).build()); @@ -76,15 +81,11 @@ public class BiCreaterStringIntersection extends AbstractBoundaryBiCreater<Strin } if (b1.matchesNoneOfValues()) { return Optional.of( - StringBoundary.getBuilder() - .addValues(getIntersectionStrings(b2, b1)) - .build()); + StringBoundary.getBuilder().addValues(getIntersectionStrings(b2, b1)).build()); } if (b2.matchesNoneOfValues()) { return Optional.of( - StringBoundary.getBuilder() - .addValues(getIntersectionStrings(b1, b2)) - .build()); + StringBoundary.getBuilder().addValues(getIntersectionStrings(b1, b2)).build()); } return Optional.empty(); } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringLowerBounds.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringLowerBounds.java index e789e31a0529a62b671db46e0858bed3e82e9a07..6cab93a7e80749fc6dc4fe8bf9b5ee56c3cdb2f5 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringLowerBounds.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringLowerBounds.java @@ -1,7 +1,13 @@ package de.unikoblenz.fgbks.base.utils.boundary.bicreater; +import static de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType.IS_EQUAL; +import static de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType.IS_NOT_IN_CONTACT; + import de.unikoblenz.fgbks.base.utils.boundary.impl.StringBoundary; +import java.util.Arrays; +import java.util.HashSet; import java.util.Optional; +import java.util.Set; public class BiCreaterStringLowerBounds extends AbstractBoundaryBiCreater<StringBoundary> { @@ -22,8 +28,19 @@ public class BiCreaterStringLowerBounds extends AbstractBoundaryBiCreater<String @Override public Optional<StringBoundary> create(StringBoundary b1, StringBoundary b2) { - // Not supported for String Boundary - // Check BiCreaterStringBetween. - return Optional.empty(); + if (b1.checkWith(IS_NOT_IN_CONTACT, b2) || b1.checkWith(IS_EQUAL, b2)) { + return Optional.empty(); + } + if (b1.matchesAny() || b1.matchesNoneOfValues()) { + return Optional.of( + StringBoundary.getBuilder() + .addValues(b1.getValues()) + .addValues(b2.getValues()) + .matchesNoneOfValues(!b2.matchesNoneOfValues()) + .build()); + } + Set<String> values = new HashSet<>(Arrays.asList(b1.getValues())); + values.removeAll(Arrays.asList(b2.getValues())); + return Optional.of(StringBoundary.getBuilder().addValues(values).build()); } } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckStringInContact.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckStringInContact.java index 45a7d7ed08f23c4875a8ba55907a4d363d8b9022..f4f1b1725a35d51f80cb7b53ff958e12588d03f2 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckStringInContact.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckStringInContact.java @@ -44,13 +44,29 @@ public class CheckStringInContact extends AbstractBoundaryCheck<StringBoundary> return false; } // one is matching non values "not("a")" - if (b1h.length != b2h.length) { - return true; + if (b1.matchesNoneOfValues()) { + outer: + for (int i : b2h) { + for (int u : b1h) { + if (i == u) { + continue outer; + } + } + return true; + } + return false; } - for (int i = 0; i < b1h.length; i++) { - if (b1h[i] != b2h[i]) { + if (b2.matchesNoneOfValues()) { + outer: + for (int i : b1h) { + for (int u : b2h) { + if (i == u) { + continue outer; + } + } return true; } + return false; } return false; } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingRuleVerifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingRuleVerifier.java index e2cfb1077eaa0c31a66062dd9f406c05f72478b9..c1aca047ac6b70b84548e017fde99596a5b41f00 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingRuleVerifier.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingRuleVerifier.java @@ -100,12 +100,19 @@ public class MissingRuleVerifier extends AbstractVerifier { List<VDmnRuleChangeableImpl> missingRules) { // search the missing rules, which are in contact with the current rule List<VDmnRuleChangeableImpl> inContactRules = new LinkedList<>(); + List<VDmnRuleChangeableImpl> inEqualRules = new LinkedList<>(); for (VDmnRuleChangeableImpl missingRule : missingRules) { if (isInContact(missingRule, currentRule)) { - inContactRules.add(missingRule); + // dont add equal rules + if (isEqualRule(missingRule, currentRule)) { + inEqualRules.add(missingRule); + } else { + inContactRules.add(missingRule); + } } } // remove found rules from current missingRules + missingRules.removeAll(inEqualRules); missingRules.removeAll(inContactRules); // Build new missing rules from in contact rules List<VDmnRuleChangeableImpl> newMissingRules = new LinkedList<>(); @@ -114,7 +121,21 @@ public class MissingRuleVerifier extends AbstractVerifier { } // mergeRules(newMissingRules); missingRules.addAll(newMissingRules); - mergeRules(missingRules); + // mergeRules(missingRules); + } + + private boolean isEqualRule(VDmnRule missingRule, VDmnRule currentRule) { + List<VDmnInputValue> inValsMissingRule = missingRule.getDmnInputValues(); + List<VDmnInputValue> inValsCurrentRule = currentRule.getDmnInputValues(); + for (int i = 0; i < inValsMissingRule.size(); i++) { + if (!inValsMissingRule + .get(i) + .getBoundary() + .checkWith(BoundaryCheckType.IS_EQUAL, inValsCurrentRule.get(i).getBoundary())) { + return false; + } + } + return true; } private List<VDmnRuleChangeableImpl> constructNewMissingRules( diff --git a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersectionTest.java b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersectionTest.java index b458a4870fc638aba27b1be71561c04dc78a4bbb..4c942d81ee1dbfd6ec205574c59b7abc1217340f 100644 --- a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersectionTest.java +++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersectionTest.java @@ -39,16 +39,16 @@ class BiCreaterStringIntersectionTest { sb1 = StringBoundary.getBuilder().matchesAny(true).build(); sb2 = StringBoundary.getBuilder().addValue("a").build(); sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get(); - assertArrayEquals(new String[]{}, sbR.getValues()); + assertArrayEquals(new String[]{"a"}, sbR.getValues()); assertFalse(sbR.matchesNoneOfValues()); - assertTrue(sbR.matchesAny()); + assertFalse(sbR.matchesAny()); sb1 = StringBoundary.getBuilder().addValue("a").build(); sb2 = StringBoundary.getBuilder().matchesAny(true).build(); sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get(); - assertArrayEquals(new String[]{}, sbR.getValues()); + assertArrayEquals(new String[]{"a"}, sbR.getValues()); assertFalse(sbR.matchesNoneOfValues()); - assertTrue(sbR.matchesAny()); + assertFalse(sbR.matchesAny()); sb1 = StringBoundary.getBuilder().matchesAny(true).build(); sb2 = StringBoundary.getBuilder().matchesNoneOfValues(true).addValue("a").build();