diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringCombine.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringCombine.java index 2ce7ba4cd6a62fa4f694e5a10c604f5cb3c89c7c..150bf62ead17e2c5613a7533a832c62a809998ee 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringCombine.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringCombine.java @@ -1,7 +1,10 @@ package de.unikoblenz.fgbks.base.utils.boundary.bicreater; 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 BiCreaterStringCombine extends AbstractBoundaryBiCreater<StringBoundary> { @@ -22,6 +25,48 @@ public class BiCreaterStringCombine extends AbstractBoundaryBiCreater<StringBoun @Override public Optional<StringBoundary> create(StringBoundary b1, StringBoundary b2) { - return Optional.empty(); + if (b1.isMatchAny() || b2.isMatchAny()) { + return Optional.of(StringBoundary.getBuilder().isMatchAny(true).build()); + } + if (!b1.matchesNoneOfValues() && !b2.matchesNoneOfValues()) { + return Optional.of( + StringBoundary.getBuilder().addValues(b1.getValues()).addValues(b2.getValues()).build()); + } + Set<String> values = new HashSet<>(); + if (b1.matchesNoneOfValues() && b2.matchesNoneOfValues()) { + values = intersection(b1.getValues(), b2.getValues()); + } + if (b1.matchesNoneOfValues()) { + values = leftInter(b1.getValues(), b2.getValues()); + } + if (b2.matchesNoneOfValues()) { + values = leftInter(b2.getValues(), b1.getValues()); + } + return Optional.of( + StringBoundary.getBuilder() + .isMatchNoneOfValues(true) + .addValues(values) + .isMatchAny(values.size() == 0) + .build()); + } + + private Set<String> leftInter(String[] values1, String[] values2) { + Set<String> vals = new HashSet<>(Arrays.asList(values1)); + for (String v : values2) { + vals.removeIf(x -> x.equals(v)); + } + return vals; + } + + private Set<String> intersection(String[] values1, String[] values2) { + Set<String> vals = new HashSet<>(); + for (String v1 : values1) { + for (String v2 : values2) { + if (v1.equals(v2)) { + vals.add(v1); + } + } + } + return vals; } } 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 436dbc0f6b99fddab31fb313f9fd7e22ead350e9..232c476c6997ebe35e4318ec315c21573a9beaa9 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 @@ -21,6 +21,7 @@ import de.unikoblenz.fgbks.base.utils.boundary.Boundary; import de.unikoblenz.fgbks.base.utils.boundary.BoundaryParseException; import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterStringAppend; import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterStringBetween; +import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterStringCombine; import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterStringIntersection; import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterStringLowerBounds; import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterStringUpperBounds; @@ -69,7 +70,7 @@ public class StringBoundary extends AbstractBoundary<String> { biCreaterMap.put(UPPER_BOUNDS, BiCreaterStringUpperBounds.getInstance()); biCreaterMap.put(BETWEEN, BiCreaterStringBetween.getInstance()); biCreaterMap.put(APPEND, BiCreaterStringAppend.getInstance()); - biCreaterMap.put(COMBINE, BiCreaterStringBetween.getInstance()); + biCreaterMap.put(COMBINE, BiCreaterStringCombine.getInstance()); } private boolean matchNoneOfValues;