diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractGrowingBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractGrowingBoundary.java index 768e7ab5240aca8122b2b733cdd41c836479e114..17107d44c28d037ebc242652cac60dac396093a5 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractGrowingBoundary.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractGrowingBoundary.java @@ -5,6 +5,11 @@ import static de.unikoblenz.fgbks.base.utils.boundary.BoundType.INCLUSIVE; import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheck; import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType; import de.unikoblenz.fgbks.base.utils.boundary.checker.CheckEqual; +import de.unikoblenz.fgbks.base.utils.boundary.checker.CheckInContact; +import de.unikoblenz.fgbks.base.utils.boundary.checker.CheckIsSubsumes; +import de.unikoblenz.fgbks.base.utils.boundary.checker.CheckNotInContact; +import de.unikoblenz.fgbks.base.utils.boundary.checker.CheckOverlap; +import de.unikoblenz.fgbks.base.utils.boundary.checker.CheckSubsumes; import java.util.HashMap; import java.util.Objects; import org.apache.commons.lang3.Validate; @@ -64,6 +69,11 @@ public abstract class AbstractGrowingBoundary<T extends Comparable<? super T>> protected HashMap<BoundaryCheckType, BoundaryCheck> getChecker() { HashMap<BoundaryCheckType, BoundaryCheck> map = new HashMap<>(); map.put(BoundaryCheckType.IS_EQUAL, CheckEqual.getInstance()); + map.put(BoundaryCheckType.IS_IN_CONTACT, CheckInContact.getInstance()); + map.put(BoundaryCheckType.IS_NOT_IN_CONTACT, CheckNotInContact.getInstance()); + map.put(BoundaryCheckType.IS_OVERLAPPING, CheckOverlap.getInstance()); + map.put(BoundaryCheckType.IS_SUBSUMPTION, CheckIsSubsumes.getInstance()); + map.put(BoundaryCheckType.SUBSUMES, CheckSubsumes.getInstance()); return map; } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckEqual.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckEqual.java index a0ce4f868c06dea827c575d41458234e8356efef..1da5446244f82b28ac850ca21f831037bfafa18f 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckEqual.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckEqual.java @@ -21,6 +21,10 @@ public class CheckEqual extends AbstractBoundaryCheck<AbstractGrowingBoundary> { @Override public boolean check(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) { + return checkEqual(b1, b2); + } + + public static boolean checkEqual(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) { if (b1 == b2) { return true; } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContact.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContact.java index 61de90e701ee200c0f8693f84788f46576f93cd5..c2a3fa790cc8f62951c961c803185bf65c4bbf0b 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContact.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContact.java @@ -23,10 +23,10 @@ public class CheckInContact extends AbstractBoundaryCheck<AbstractGrowingBoundar @Override public boolean check(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) { - return checkBounds(b1, b2); + return checkInContact(b1, b2); } - public static boolean checkBounds(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) { + public static boolean checkInContact(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) { // TODO: check raw types if (b1.getLowerBound().compareTo(b2.getLowerBound()) <= 0) { return checkOrdered(b1, b2); diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckIsSubsumes.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckIsSubsumes.java new file mode 100644 index 0000000000000000000000000000000000000000..f554327e0fd56eb2720cfef1e472bd042e9fd017 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckIsSubsumes.java @@ -0,0 +1,30 @@ +package de.unikoblenz.fgbks.base.utils.boundary.checker; + +import de.unikoblenz.fgbks.base.utils.boundary.AbstractGrowingBoundary; + +public class CheckIsSubsumes extends AbstractBoundaryCheck<AbstractGrowingBoundary> { + + private static final CheckIsSubsumes instance = new CheckIsSubsumes(); + + private CheckIsSubsumes() { + super(); + } + + public static CheckIsSubsumes getInstance() { + return instance; + } + + @Override + public BoundaryCheckType getType() { + return BoundaryCheckType.IS_SUBSUMPTION; + } + + @Override + public boolean check(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) { + return checkIsSubsumption(b1, b2); + } + + public static boolean checkIsSubsumption(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) { + return CheckSubsumes.checkSubsumes(b1, b2) || CheckSubsumes.checkSubsumes(b2, b1); + } +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContact.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContact.java index a29476f1ad5bed118a487765dc81fb8f49784f2f..21033ba96fef360a1848cb8c1aedda73eac5a754 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContact.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContact.java @@ -21,6 +21,6 @@ public class CheckNotInContact extends AbstractBoundaryCheck<AbstractGrowingBoun @Override public boolean check(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) { - return !CheckInContact.checkBounds(b1, b2); + return !CheckInContact.checkInContact(b1, b2); } } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckOverlap.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckOverlap.java new file mode 100644 index 0000000000000000000000000000000000000000..a98c6810e828e8e462c2bd1274c4c27d95d709c0 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckOverlap.java @@ -0,0 +1,32 @@ +package de.unikoblenz.fgbks.base.utils.boundary.checker; + +import de.unikoblenz.fgbks.base.utils.boundary.AbstractGrowingBoundary; + +public class CheckOverlap extends AbstractBoundaryCheck<AbstractGrowingBoundary> { + + private static final CheckOverlap instance = new CheckOverlap(); + + private CheckOverlap() { + super(); + } + + public static CheckOverlap getInstance() { + return instance; + } + + @Override + public BoundaryCheckType getType() { + return BoundaryCheckType.IS_OVERLAPPING; + } + + @Override + public boolean check(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) { + return checkOverlapping(b1, b2); + } + + public static boolean checkOverlapping(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) { + return CheckInContact.checkInContact(b1, b2) + && !CheckEqual.checkEqual(b1, b2) + && !CheckIsSubsumes.checkIsSubsumption(b1, b2); + } +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckSubsumes.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckSubsumes.java new file mode 100644 index 0000000000000000000000000000000000000000..4ee2b429bc6b19c3b0684060735f42fb421069e7 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckSubsumes.java @@ -0,0 +1,56 @@ +package de.unikoblenz.fgbks.base.utils.boundary.checker; + +import static de.unikoblenz.fgbks.base.utils.boundary.BoundType.EXCLUSIVE; +import static de.unikoblenz.fgbks.base.utils.boundary.BoundType.INCLUSIVE; + +import de.unikoblenz.fgbks.base.utils.boundary.AbstractGrowingBoundary; + +public class CheckSubsumes extends AbstractBoundaryCheck<AbstractGrowingBoundary> { + + private static final CheckSubsumes instance = new CheckSubsumes(); + + private CheckSubsumes() { + super(); + } + + public static CheckSubsumes getInstance() { + return instance; + } + + @Override + public BoundaryCheckType getType() { + return BoundaryCheckType.SUBSUMES; + } + + @Override + public boolean check(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) { + return checkSubsumes(b1, b2); + } + + public static boolean checkSubsumes(AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) { + // TODO: check raw types + int compLo = b1.getLowerBound().compareTo(b2.getLowerBound()); + int compUp = b1.getUpperBound().compareTo(b2.getUpperBound()); + if (compLo < 0 && compUp > 0) { + return true; + } + if (compLo > 0 + || compUp < 0 + || (compLo == 0 + && b1.getLowerBoundType() == EXCLUSIVE + && b2.getLowerBoundType() == INCLUSIVE) + || (compUp == 0 + && b1.getUpperBoundType() == EXCLUSIVE + && b2.getUpperBoundType() == INCLUSIVE)) { + return false; + } + if (compLo == 0 && b1.getLowerBoundType() != b2.getLowerBoundType() + || compUp == 0 && b1.getUpperBoundType() != b2.getUpperBoundType()) { + return true; + } else if ((compLo + compUp) == 0) { + return false; + } else { + return true; + } + } +} diff --git a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/AbstractCheckerTest.java b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/AbstractCheckerTest.java index fb1ece2f70632896283d2991bef2d91e101aa0dc..8e5b5ddb789435f7af60d93ce7e7c619e3592c55 100644 --- a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/AbstractCheckerTest.java +++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/AbstractCheckerTest.java @@ -9,17 +9,19 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import de.unikoblenz.fgbks.base.utils.boundary.Boundary; import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VTypeRef; -public class AbstractCheckerTest { +public abstract class AbstractCheckerTest { protected BoundaryCheck checker; protected void doNumCheck(String b1, String b2, boolean expected) { doCheck(INTEGER, b1, b2, expected); - doCheck(INTEGER, b2, b1, expected); doCheck(LONG, b1, b2, expected); - doCheck(LONG, b2, b1, expected); doCheck(DOUBLE, b1, b2, expected); - doCheck(DOUBLE, b2, b1, expected); + if (checkBothWays()) { + doCheck(INTEGER, b2, b1, expected); + doCheck(LONG, b2, b1, expected); + doCheck(DOUBLE, b2, b1, expected); + } } private void doCheck(VTypeRef type, String b1, String b2, boolean expected) { @@ -33,4 +35,6 @@ public class AbstractCheckerTest { assertFalse(checker.check(b1, b2), b1.getText() + " / " + b2.getText()); } } + + protected abstract boolean checkBothWays(); } diff --git a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContactTest.java b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContactTest.java index e3b660641f88f7785ca8955dda4a2037a9390f94..741f2cadac14fdcc823b901cf2df128e7903b0e7 100644 --- a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContactTest.java +++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckInContactTest.java @@ -29,4 +29,9 @@ class CheckInContactTest extends AbstractCheckerTest { doNumCheck("[1..3]", "=4", false); doNumCheck("[1..3]", "<=4", true); } + + @Override + protected boolean checkBothWays() { + return true; + } } diff --git a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContactTest.java b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContactTest.java index 2a54a6bffced11046710ae2b7fb7186345a2a638..7f100311735aaa32d47d71756a27235f50a5f8bf 100644 --- a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContactTest.java +++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckNotInContactTest.java @@ -29,4 +29,9 @@ class CheckNotInContactTest extends AbstractCheckerTest { doNumCheck("[1..3]", "=4", true); doNumCheck("[1..3]", "<=4", false); } + + @Override + protected boolean checkBothWays() { + return true; + } } diff --git a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckOverlapTest.java b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckOverlapTest.java new file mode 100644 index 0000000000000000000000000000000000000000..85f93ac9b93f75bfc70646cde29fddbfc7475f9f --- /dev/null +++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckOverlapTest.java @@ -0,0 +1,63 @@ +package de.unikoblenz.fgbks.base.utils.boundary.checker; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +@QuarkusTest +class CheckOverlapTest extends AbstractCheckerTest { + + @Test + void check() { + super.checker = CheckOverlap.getInstance(); + doNumCheck("<1", "<5", false); + doNumCheck("<5", "<1", false); + doNumCheck("<1", ">5", false); + doNumCheck("[1..2]", ">5", false); + doNumCheck("[1..2]", ">2", false); + doNumCheck("[1..2]", "<2", true); + doNumCheck("[1..2]", "<1", false); + doNumCheck("[1..2]", "<=1", true); + doNumCheck("]1..2]", "<=1", false); + doNumCheck("]1..2]", "<1", false); + doNumCheck("[1..2]", "<1", false); + doNumCheck("[1..2]", "[1..2]", false); + doNumCheck("=1", "=1", false); + doNumCheck("[1..3]", "=1", false); + doNumCheck("[1..3]", "=2", false); + doNumCheck("[1..3]", "=3", false); + doNumCheck("[1..4]", "[2..3]", false); + doNumCheck("[1..4]", "]1..4[", false); + doNumCheck("[1..3]", "=0", false); + doNumCheck("[1..3]", "=4", false); + doNumCheck("[1..3]", "<=4", false); + doNumCheck("[1..3]", "<4", false); + doNumCheck("[1..3]", "<=3", false); + doNumCheck("[1..3]", ">0", false); + doNumCheck("[1..3]", ">=1", false); + doNumCheck("[1..3]", ">1", true); + doNumCheck("[1..3]", ">=2", true); + doNumCheck("=0", "[1..3]", false); + doNumCheck("=4", "[1..3]", false); + doNumCheck("<=4", "[1..3]", false); + doNumCheck("<4", "[1..3]", false); + doNumCheck("<=3", "[1..3]", false); + doNumCheck(">0", "[1..3]", false); + doNumCheck(">=1", "[1..3]", false); + doNumCheck(">1", "[1..3]", true); + doNumCheck(">=2", "[1..3]", true); + doNumCheck("=2", "=2", false); + doNumCheck("<2", "<2", false); + doNumCheck("<=2", "<=2", false); + doNumCheck(">2", ">2", false); + doNumCheck(">=2", ">=2", false); + doNumCheck("[1..3]", "[1..3]", false); + doNumCheck("[1..3[", "[1..3[", false); + doNumCheck("]1..3]", "]1..3]", false); + doNumCheck("]1..3[", "]1..3[", false); + } + + @Override + protected boolean checkBothWays() { + return false; + } +} diff --git a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckSubsumesTest.java b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckSubsumesTest.java new file mode 100644 index 0000000000000000000000000000000000000000..1583d7b7058d7ba799b2dfe56668091109a89175 --- /dev/null +++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckSubsumesTest.java @@ -0,0 +1,63 @@ +package de.unikoblenz.fgbks.base.utils.boundary.checker; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +@QuarkusTest +class CheckSubsumesTest extends AbstractCheckerTest { + + @Test + void check() { + super.checker = CheckSubsumes.getInstance(); + doNumCheck("<1", "<5", false); + doNumCheck("<5", "<1", true); + doNumCheck("<1", ">5", false); + doNumCheck("[1..2]", ">5", false); + doNumCheck("[1..2]", ">2", false); + doNumCheck("[1..2]", "<2", false); + doNumCheck("[1..2]", "<1", false); + doNumCheck("[1..2]", "<=1", false); + doNumCheck("]1..2]", "<=1", false); + doNumCheck("]1..2]", "<1", false); + doNumCheck("[1..2]", "<1", false); + doNumCheck("[1..2]", "[1..2]", false); + doNumCheck("=1", "=1", false); + doNumCheck("[1..3]", "=1", true); + doNumCheck("[1..3]", "=2", true); + doNumCheck("[1..3]", "=3", true); + doNumCheck("[1..4]", "[2..3]", true); + doNumCheck("[1..4]", "]1..4[", true); + doNumCheck("[1..3]", "=0", false); + doNumCheck("[1..3]", "=4", false); + doNumCheck("[1..3]", "<=4", false); + doNumCheck("[1..3]", "<4", false); + doNumCheck("[1..3]", "<=3", false); + doNumCheck("[1..3]", ">0", false); + doNumCheck("[1..3]", ">=1", false); + doNumCheck("[1..3]", ">1", false); + doNumCheck("[1..3]", ">=2", false); + doNumCheck("=0", "[1..3]", false); + doNumCheck("=4", "[1..3]", false); + doNumCheck("<=4", "[1..3]", true); + doNumCheck("<4", "[1..3]", true); + doNumCheck("<=3", "[1..3]", true); + doNumCheck(">0", "[1..3]", true); + doNumCheck(">=1", "[1..3]", true); + doNumCheck(">1", "[1..3]", false); + doNumCheck(">=2", "[1..3]", false); + doNumCheck("=2", "=2", false); + doNumCheck("<2", "<2", false); + doNumCheck("<=2", "<=2", false); + doNumCheck(">2", ">2", false); + doNumCheck(">=2", ">=2", false); + doNumCheck("[1..3]", "[1..3]", false); + doNumCheck("[1..3[", "[1..3[", false); + doNumCheck("]1..3]", "]1..3]", false); + doNumCheck("]1..3[", "]1..3[", false); + } + + @Override + protected boolean checkBothWays() { + return false; + } +}