Skip to content
Snippets Groups Projects
Commit f669f5a2 authored by Jonas Blatt's avatar Jonas Blatt :ant:
Browse files

Add implementation of BiCreater for String Intersection

parent c5c89a42
No related branches found
No related tags found
No related merge requests found
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;
}
}
......@@ -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]);
......
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());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment