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 016fcb0c02e89d5a02092405b91f95cc3d679c0a..fa1ff05f2013e15dda50a4dfe07ef048dff939e3 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 @@ -1,7 +1,14 @@ package de.unikoblenz.fgbks.base.utils.boundary.bicreater; +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.Iterator; +import java.util.Objects; import java.util.Optional; +import java.util.Set; public class BiCreaterStringIntersection extends AbstractBoundaryBiCreater<StringBoundary> { @@ -22,6 +29,79 @@ public class BiCreaterStringIntersection extends AbstractBoundaryBiCreater<Strin @Override public Optional<StringBoundary> create(StringBoundary b1, StringBoundary b2) { + if (b1.checkWith(IS_NOT_IN_CONTACT, b2)) { + return Optional.empty(); + } + if (b1.isMatchAny() && b2.isMatchAny() + || b1.isMatchAny() && !b2.matchesNoneOfValues() + || b2.isMatchAny() && !b1.matchesNoneOfValues()) { + return Optional.of(StringBoundary.getBuilder().isMatchAny(true).build()); + } + if (b1.isMatchAny() && b2.matchesNoneOfValues()) { + return Optional.of( + StringBoundary.getBuilder().isMatchNoneOfValues(true).addValues(b2.getValues()).build()); + } + if (b2.isMatchAny() && b1.matchesNoneOfValues()) { + return Optional.of( + StringBoundary.getBuilder().isMatchNoneOfValues(true).addValues(b1.getValues()).build()); + } + if (b1.matchesNoneOfValues() && b2.matchesNoneOfValues()) { + Set<String> intersectionStrings = new HashSet<>(); + intersectionStrings.addAll(Arrays.asList(b1.getValues())); + intersectionStrings.addAll(Arrays.asList(b2.getValues())); + if (intersectionStrings.size() == 0) { + return Optional.empty(); + } + return Optional.of( + StringBoundary.getBuilder() + .isMatchNoneOfValues(true) + .addValues(b1.getValues()) + .addValues(b2.getValues()) + .build()); + } + if (!b1.matchesNoneOfValues() && !b2.matchesNoneOfValues()) { + Set<String> intersectionStrings = new HashSet<>(); + String[] b1v = b1.getValues(); + int[] b2Hashes = b2.getValuesHashes(); + for (String s1 : b1v) { + int h1 = Objects.hashCode(s1); + for (int h2 : b2Hashes) { + if (h1 == h2) { + intersectionStrings.add(s1); + break; + } + } + } + return Optional.of(StringBoundary.getBuilder().addValues(intersectionStrings).build()); + } + if (b1.matchesNoneOfValues()) { + return Optional.of( + StringBoundary.getBuilder() + .addValues(getIntersectionStrings(b2, b1)) + .build()); + } + if (b2.matchesNoneOfValues()) { + return Optional.of( + StringBoundary.getBuilder() + .addValues(getIntersectionStrings(b1, b2)) + .build()); + } return Optional.empty(); } + + private Set<String> getIntersectionStrings(StringBoundary b1, StringBoundary b2) { + Set<String> intersectionStrings = new HashSet<>(Arrays.asList(b1.getValues())); + int[] b2Hashes = b2.getValuesHashes(); + for (Iterator<String> it = intersectionStrings.iterator(); it.hasNext(); ) { + String element = it.next(); + int h1 = Objects.hashCode(element); + for (int h2 : b2Hashes) { + if (h1 == h2) { + it.remove(); + break; + } + } + } + return intersectionStrings; + } } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java index 12d091ebd65780538dc64ab8f52ae43204f45eb3..65ca20e6afbba790f28d5a8cd49b3e23d061764c 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java @@ -39,14 +39,14 @@ import de.unikoblenz.fgbks.base.utils.boundary.creater.BoundaryCreater; import de.unikoblenz.fgbks.base.utils.boundary.creater.BoundaryCreaterType; import de.unikoblenz.fgbks.base.utils.boundary.creater.CreaterStringLower; import de.unikoblenz.fgbks.base.utils.boundary.creater.CreaterStringUpper; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.List; +import java.util.HashSet; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; import org.apache.commons.lang3.Validate; @@ -177,10 +177,10 @@ public class StringBoundary extends AbstractBoundary<String> { public class Builder extends DefaultBuilder<StringBoundary> { - private List<String> buildingValues; + private Set<String> buildingValues; private Builder() { - buildingValues = new ArrayList<>(); + buildingValues = new HashSet<>(); value.matchAny = false; value.matchNoneOfValues = false; } @@ -209,14 +209,6 @@ public class StringBoundary extends AbstractBoundary<String> { return addValues(Validate.notNull(Arrays.asList(values))); } - @Override - protected void validate() { - super.validate(); - if (matchAny) { - // TODO exception - } - } - @Override public StringBoundary build() { value.values = buildingValues.toArray(new String[0]); 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 new file mode 100644 index 0000000000000000000000000000000000000000..00880f0a98c196bdcf165306b73632c40f70d102 --- /dev/null +++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringIntersectionTest.java @@ -0,0 +1,113 @@ +package de.unikoblenz.fgbks.base.utils.boundary.bicreater; + +import static de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreaterType.INTERSECTION; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import de.unikoblenz.fgbks.base.utils.boundary.impl.StringBoundary; +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +@QuarkusTest +class BiCreaterStringIntersectionTest { + + StringBoundary sb1; + StringBoundary sb2; + StringBoundary sbR; + + @Test + void testCreater() { + sb1 = StringBoundary.getBuilder().addValue("a").build(); + sb2 = StringBoundary.getBuilder().addValue("b").build(); + assertFalse(sb1.createBi(INTERSECTION, sb2).isPresent()); + + sb1 = StringBoundary.getBuilder().addValue("a").build(); + sb2 = StringBoundary.getBuilder().addValue("a").build(); + sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get(); + assertArrayEquals(new String[]{"a"}, sbR.getValues()); + assertFalse(sbR.matchesNoneOfValues()); + assertFalse(sbR.isMatchAny()); + + sb1 = StringBoundary.getBuilder().isMatchAny(true).build(); + sb2 = StringBoundary.getBuilder().isMatchAny(true).build(); + sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get(); + assertArrayEquals(new String[]{}, sbR.getValues()); + assertFalse(sbR.matchesNoneOfValues()); + assertTrue(sbR.isMatchAny()); + + sb1 = StringBoundary.getBuilder().isMatchAny(true).build(); + sb2 = StringBoundary.getBuilder().addValue("a").build(); + sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get(); + assertArrayEquals(new String[]{}, sbR.getValues()); + assertFalse(sbR.matchesNoneOfValues()); + assertTrue(sbR.isMatchAny()); + + sb1 = StringBoundary.getBuilder().addValue("a").build(); + sb2 = StringBoundary.getBuilder().isMatchAny(true).build(); + sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get(); + assertArrayEquals(new String[]{}, sbR.getValues()); + assertFalse(sbR.matchesNoneOfValues()); + assertTrue(sbR.isMatchAny()); + + sb1 = StringBoundary.getBuilder().isMatchAny(true).build(); + sb2 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").build(); + sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get(); + assertArrayEquals(new String[]{"a"}, sbR.getValues()); + assertTrue(sbR.matchesNoneOfValues()); + assertFalse(sbR.isMatchAny()); + + sb1 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").build(); + sb2 = StringBoundary.getBuilder().isMatchAny(true).build(); + sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get(); + assertArrayEquals(new String[]{"a"}, sbR.getValues()); + assertTrue(sbR.matchesNoneOfValues()); + assertFalse(sbR.isMatchAny()); + + sb1 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").build(); + sb2 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").build(); + sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get(); + assertArrayEquals(new String[]{"a"}, sbR.getValues()); + assertTrue(sbR.matchesNoneOfValues()); + assertFalse(sbR.isMatchAny()); + + sb1 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").build(); + sb2 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").addValue("b").build(); + sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get(); + assertArrayEquals(new String[]{"a", "b"}, sbR.getValues()); + assertTrue(sbR.matchesNoneOfValues()); + assertFalse(sbR.isMatchAny()); + + sb1 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").addValue("b").build(); + sb2 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").build(); + sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get(); + assertArrayEquals(new String[]{"a", "b"}, sbR.getValues()); + assertTrue(sbR.matchesNoneOfValues()); + assertFalse(sbR.isMatchAny()); + + sb1 = StringBoundary.getBuilder().addValue("a").addValue("b").build(); + sb2 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").build(); + sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get(); + assertArrayEquals(new String[]{"b"}, sbR.getValues()); + assertFalse(sbR.matchesNoneOfValues()); + assertFalse(sbR.isMatchAny()); + + sb1 = StringBoundary.getBuilder().addValue("a").addValue("b").build(); + sb2 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("a").addValue("b").build(); + assertFalse(sb1.createBi(INTERSECTION, sb2).isPresent()); + + sb1 = StringBoundary.getBuilder().addValue("a").addValue("b").build(); + sb2 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("c").build(); + sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get(); + assertArrayEquals(new String[]{"a", "b"}, sbR.getValues()); + assertFalse(sbR.matchesNoneOfValues()); + assertFalse(sbR.isMatchAny()); + + sb1 = StringBoundary.getBuilder().isMatchNoneOfValues(true).addValue("c").build(); + sb2 = StringBoundary.getBuilder().addValue("a").addValue("b").build(); + sbR = (StringBoundary) sb1.createBi(INTERSECTION, sb2).get(); + assertArrayEquals(new String[]{"a", "b"}, sbR.getValues()); + assertFalse(sbR.matchesNoneOfValues()); + assertFalse(sbR.isMatchAny()); + } +}