diff --git a/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/ChangesetIdFilterEqualsAnyOf.java b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/ChangesetIdFilterEqualsAnyOf.java index 76feb9201..2b6a62461 100644 --- a/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/ChangesetIdFilterEqualsAnyOf.java +++ b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/ChangesetIdFilterEqualsAnyOf.java @@ -14,11 +14,13 @@ * A filter which selects OSM contributions by matching to a list of changeset ids. */ public class ChangesetIdFilterEqualsAnyOf extends NegatableFilter { - private final Collection changesetIdList; + private final Set changesetIds; ChangesetIdFilterEqualsAnyOf(@Nonnull Collection changesetIdList) { + this(new HashSet<>(changesetIdList)); + } + ChangesetIdFilterEqualsAnyOf(@Nonnull Set changesetIds) { super(new FilterInternal() { - private final Set changesetIds = new HashSet<>(changesetIdList); @Override public boolean applyOSH(OSHEntity entity) { @@ -37,15 +39,15 @@ public boolean applyOSMEntitySnapshot(OSMEntitySnapshot ignored) { @Override public String toString() { - return "changeset:in(" + changesetIdList.stream().map(String::valueOf) + return "changeset:in(" + changesetIds.stream().map(String::valueOf) .collect(Collectors.joining(",")) + ")"; } }); - this.changesetIdList = changesetIdList; + this.changesetIds = changesetIds; } @Contract(pure = true) - public Collection getChangesetIdList() { - return this.changesetIdList; + public Set getChangesetIdList() { + return this.changesetIds; } } diff --git a/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/ChangesetIdFilterRange.java b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/ChangesetIdFilterRange.java index 9b0cfb4fc..672b671c9 100644 --- a/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/ChangesetIdFilterRange.java +++ b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/ChangesetIdFilterRange.java @@ -8,6 +8,8 @@ * A filter which selects OSM contributions by matching to a range of changeset ids. */ public class ChangesetIdFilterRange extends NegatableFilter { + private final IdRange changesetIdRange; + ChangesetIdFilterRange(IdRange changesetIdRange) { super(new FilterInternal() { @Override @@ -30,5 +32,10 @@ public String toString() { return "changeset:in-range" + changesetIdRange; } }); + this.changesetIdRange = changesetIdRange; + } + + public IdRange getChangesetIdRange() { + return changesetIdRange; } } diff --git a/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/FilterExpression.java b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/FilterExpression.java index c1f23c763..bb06b2101 100644 --- a/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/FilterExpression.java +++ b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/FilterExpression.java @@ -81,7 +81,7 @@ default boolean applyOSMGeometry(OSMEntity entity, Geometry geometry) { * Apply a filter to a snapshot ({@link OSMEntitySnapshot}) of an OSM entity. * * @param snapshot a snapshot of the OSM entity to check - * @return true if the the OSM entity snapshot fulfills the specified filter, otherwise false. + * @return true if the OSM entity snapshot fulfills the specified filter, otherwise false. */ @Contract(pure = true) default boolean applyOSMEntitySnapshot(OSMEntitySnapshot snapshot) { @@ -95,7 +95,7 @@ default boolean applyOSMEntitySnapshot(OSMEntitySnapshot snapshot) { * modification or the state of it after the modification matches the filter.

* * @param contribution a modification of the OSM entity to check - * @return true if the the OSM contribution fulfills the specified filter, otherwise false. + * @return true if the OSM contribution fulfills the specified filter, otherwise false. */ @Contract(pure = true) default boolean applyOSMContribution(OSMContribution contribution) { @@ -133,11 +133,11 @@ default boolean applyOSMContribution(OSMContribution contribution) { */ @Contract(pure = true) default List> normalize() { - if (this instanceof Filter) { - return Collections.singletonList(Collections.singletonList((Filter) this)); - } else if (this instanceof AndOperator) { - List> exp1 = ((BinaryOperator) this).getLeftOperand().normalize(); - List> exp2 = ((BinaryOperator) this).getRightOperand().normalize(); + if (this instanceof Filter filter) { + return Collections.singletonList(Collections.singletonList(filter)); + } else if (this instanceof AndOperator operator) { + List> exp1 = operator.getLeftOperand().normalize(); + List> exp2 = operator.getRightOperand().normalize(); // return cross product of exp1 and exp2 List> combined = new LinkedList<>(); for (List e1 : exp1) { @@ -149,9 +149,9 @@ default List> normalize() { } } return combined; - } else if (this instanceof OrOperator) { - List> exp1 = ((BinaryOperator) this).getLeftOperand().normalize(); - List> exp2 = ((BinaryOperator) this).getRightOperand().normalize(); + } else if (this instanceof OrOperator operator) { + List> exp1 = operator.getLeftOperand().normalize(); + List> exp2 = operator.getRightOperand().normalize(); List> combined = new ArrayList<>(exp1.size() + exp2.size()); combined.addAll(exp1); combined.addAll(exp2); diff --git a/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/FilterUtil.java b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/FilterUtil.java new file mode 100644 index 000000000..01717068b --- /dev/null +++ b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/FilterUtil.java @@ -0,0 +1,96 @@ +package org.heigit.ohsome.oshdb.filter; + +import org.heigit.ohsome.oshdb.OSHDBTag; +import org.heigit.ohsome.oshdb.osm.OSMType; + +import java.util.*; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Stream; + +import static java.util.Collections.*; +import static java.util.Comparator.comparingLong; + +public class FilterUtil { + + private FilterUtil() { + throw new IllegalStateException("utility class"); + } + + public static Map, Set> tags(FilterExpression expression, Predicate test) { + return tags(expression.normalize(), test); + } + + public static Map, Set> tags(List> normalized, Predicate test) { + return extract(normalized, filter -> { + if (filter instanceof TagFilterEquals tagFilter) { + return Stream.of(tagFilter.getTag()).filter(test); + } else if (filter instanceof TagFilterEqualsAny tagFilter) { + return Stream.of(tagFilter.getTag()).map(key -> new OSHDBTag(key.toInt(), -1)).filter(test); + } else if (filter instanceof TagFilterEqualsAnyOf tagFilter) { + return tagFilter.tags.stream().filter(test); + } + return Stream.empty(); + }); + } + + private static Map, Set> extract(List> normalized, Function> extractor) { + var result = new HashMap, Set>(); + for(var group: normalized){ + var type = EnumSet.allOf(OSMType.class); + var groupResult = new HashSet(); + for (var filter : group) { + if (filter instanceof TypeFilter typeFilter) { + type = EnumSet.of(typeFilter.getType()); + } else { + extractor.apply(filter).forEach(groupResult::add); + } + } + if (groupResult.isEmpty()) { + return emptyMap(); + } + result.computeIfAbsent(type, x -> new HashSet<>()).addAll(groupResult); + } + return result; + } + + public static Map, Set> extractIds(FilterExpression expression) { + return extractIds(expression.normalize()); + } + + public static Map, Set> extractIds(List> normalized) { + var result = extract(normalized, filter -> { + if (filter instanceof IdFilterEquals idFilter){ + return Stream.of(new IdRange(idFilter.getId())); + } else if (filter instanceof IdFilterEqualsAnyOf idFilter) { + return idFilter.getIds().stream().map(IdRange::new); + } else if (filter instanceof IdFilterRange idFilter) { + return Stream.of(idFilter.getRange()); + } + return Stream.empty(); + }); + compactRanges(result); + return result; + } + + private static void compactRanges(Map, Set> result) { + for (var entry : result.entrySet()) { + var ranges = new ArrayList<>(entry.getValue()); + var compact = new HashSet(ranges.size()); + ranges.sort(comparingLong(IdRange::getFromId)); + var itr = ranges.iterator(); + var range = itr.next(); + while (itr.hasNext()) { + var next = itr.next(); + if (next.getFromId() <= range.getToId() + 1) { + range = new IdRange(range.getFromId(), next.getToId()); + } else { + compact.add(range); + range = next; + } + } + compact.add(range); + entry.setValue(compact); + } + } +} diff --git a/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/IdFilterEqualsAnyOf.java b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/IdFilterEqualsAnyOf.java index 9904b9025..cd3d79b7f 100644 --- a/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/IdFilterEqualsAnyOf.java +++ b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/IdFilterEqualsAnyOf.java @@ -12,13 +12,19 @@ * A tag filter which executes a "id [not] in (id1, id2, …)" check. */ public class IdFilterEqualsAnyOf extends NegatableFilter { + + private final Set ids; + IdFilterEqualsAnyOf(@Nonnull Collection idList) { + this(new HashSet<>(idList)); + } + + IdFilterEqualsAnyOf(@Nonnull Set ids) { super(new FilterInternal() { - private final Set ids = new HashSet<>(idList); @Override public boolean applyOSH(OSHEntity entity) { - return this.ids.contains(entity.getId()); + return ids.contains(entity.getId()); } @Override @@ -28,7 +34,7 @@ boolean applyOSHNegated(OSHEntity entity) { @Override public boolean applyOSM(OSMEntity entity) { - return this.ids.contains(entity.getId()); + return ids.contains(entity.getId()); } @Override @@ -38,12 +44,18 @@ boolean applyOSMNegated(OSMEntity entity) { @Override public String toString() { - return "id:in" + this.ids.stream().map(String::valueOf).collect(Collectors.joining(",")); + return "id:in" + ids.stream().map(String::valueOf).collect(Collectors.joining(",")); } }); - if (idList.isEmpty()) { + if (ids.isEmpty()) { throw new IllegalStateException("list of ids must not be empty in a id in (list) filter"); } + + this.ids = ids; + } + + public Set getIds() { + return ids; } } \ No newline at end of file diff --git a/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/IdFilterRange.java b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/IdFilterRange.java index ac332e888..3ff4679ae 100644 --- a/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/IdFilterRange.java +++ b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/IdFilterRange.java @@ -8,6 +8,8 @@ * A filter which executes a "id [not] in range" check. */ public class IdFilterRange extends NegatableFilter { + private final IdRange range; + IdFilterRange(@Nonnull IdRange range) { super(new FilterInternal() { @Override @@ -35,5 +37,10 @@ public String toString() { return "id:in-range" + range; } }); + this.range = range; + } + + public IdRange getRange() { + return range; } } \ No newline at end of file diff --git a/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/IdRange.java b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/IdRange.java index 4efc8b4f5..fe8b2e7be 100644 --- a/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/IdRange.java +++ b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/IdRange.java @@ -1,6 +1,8 @@ package org.heigit.ohsome.oshdb.filter; import java.io.Serializable; +import java.util.Objects; +import java.util.stream.LongStream; /** * Helper class to handle ranges of ids (incl. user ids, changeset ids, etc.). @@ -8,7 +10,7 @@ *

The range's limits are tested inclusively: the range (10..12) would match the values 10, * 11 and 12, but not 9 or 13 for example.

*/ -class IdRange implements Serializable { +public class IdRange implements Serializable { private final long fromId; private final long toId; @@ -19,11 +21,15 @@ class IdRange implements Serializable { * @param fromId lower limit of the range. * @param toId upper limit of the range. */ - IdRange(long fromId, long toId) { + public IdRange(long fromId, long toId) { this.fromId = Math.min(fromId, toId); this.toId = Math.max(fromId, toId); } + public IdRange(long id) { + this(id, id); + } + /** Checks if the given id falls into the id range. */ public boolean test(long id) { return id >= fromId && id <= toId; @@ -34,4 +40,33 @@ public String toString() { + ".." + (toId == Long.MAX_VALUE ? "" : toId); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof IdRange idRange)) return false; + return fromId == idRange.fromId && toId == idRange.toId; + } + + @Override + public int hashCode() { + return Objects.hash(fromId, toId); + } + + public long getFromId() { + return fromId; + } + + public long getToId() { + return toId; + } + + public long size() { + return 1 + toId - fromId; + } + + /** Converts the id range to a stream of consecutive ids. */ + public LongStream getIds() { + return LongStream.range(fromId, toId+1); + } } diff --git a/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/TagFilterAnyOf.java b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/TagFilterAnyOf.java index 954522351..e017bd348 100644 --- a/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/TagFilterAnyOf.java +++ b/oshdb-filter/src/main/java/org/heigit/ohsome/oshdb/filter/TagFilterAnyOf.java @@ -16,15 +16,22 @@ abstract class TagFilterAnyOf implements Filter { TagFilterAnyOf(@Nonnull Collection tags) { Optional firstTag = tags.stream().findFirst(); - if (!firstTag.isPresent()) { - throw new IllegalStateException("list of tags must not be empty in a key in (values) filter"); - } else { - this.keyId = firstTag.get().getKey(); - this.tags = new HashSet<>(tags); - } + this.keyId = firstTag + .orElseThrow(() -> new IllegalStateException("list of tags must not be empty in a key in (values) filter")) + .getKey(); + this.tags = new HashSet<>(tags); + if (!tags.stream().allMatch(tag -> tag.getKey() == this.keyId)) { throw new IllegalStateException( "list of tags must all share the same tag key in a key in (values) filter"); } } + + public int getKeyId() { + return keyId; + } + + public Set getTags() { + return tags; + } } diff --git a/oshdb-filter/src/test/java/org/heigit/ohsome/oshdb/filter/FilterUtilTest.java b/oshdb-filter/src/test/java/org/heigit/ohsome/oshdb/filter/FilterUtilTest.java new file mode 100644 index 000000000..0dd5ba963 --- /dev/null +++ b/oshdb-filter/src/test/java/org/heigit/ohsome/oshdb/filter/FilterUtilTest.java @@ -0,0 +1,66 @@ +package org.heigit.ohsome.oshdb.filter; + +import org.heigit.ohsome.oshdb.OSHDBTag; +import org.heigit.ohsome.oshdb.osm.OSMType; +import org.junit.jupiter.api.Test; + +import java.util.EnumSet; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class FilterUtilTest extends FilterTest{ + + @Test + void extractIds() { + extractIds("id:123", Map.of(EnumSet.allOf(OSMType.class),List.of(new IdRange(123L)))); + extractIds("id:123 or id:234", Map.of(EnumSet.allOf(OSMType.class),List.of(new IdRange(123L), new IdRange(234L)))); + extractIds("id:123 or id:124", Map.of(EnumSet.allOf(OSMType.class),List.of(new IdRange(123L, 124L)))); + extractIds("id:123 and not id:234", Map.of(EnumSet.allOf(OSMType.class),List.of(new IdRange(123L)))); + extractIds("id:123 or name=heigit", Map.of()); + extractIds("id:(123, 234)", Map.of(EnumSet.allOf(OSMType.class),List.of(new IdRange(123L), new IdRange(234L)))); + extractIds("id:(123 .. 125)", Map.of(EnumSet.allOf(OSMType.class),List.of(new IdRange(123L, 125L)))); + } + + @Test + void extractIdsWithTypes() { + extractIds("id:node/123 or id:way/234", Map.of( + EnumSet.of(OSMType.NODE), List.of(new IdRange(123L)), + EnumSet.of(OSMType.WAY), List.of(new IdRange(234L)))); + extractIds("id:node/123 or id:way/234 or id:way/235", Map.of( + EnumSet.of(OSMType.NODE), List.of(new IdRange(123L)), + EnumSet.of(OSMType.WAY), List.of(new IdRange(234L, 235L)))); + extractIds("id:node/123 or (type:way and id:234)", Map.of( + EnumSet.of(OSMType.NODE), List.of(new IdRange(123L)), + EnumSet.of(OSMType.WAY), List.of(new IdRange(234L)))); + extractIds("id:node/123 or id:234", Map.of( + EnumSet.of(OSMType.NODE), List.of(new IdRange(123L)), + EnumSet.allOf(OSMType.class), List.of(new IdRange(234L)))); + extractIds("not type:node and id:123", Map.of( + EnumSet.of(OSMType.WAY), List.of(new IdRange(123L)), + EnumSet.of(OSMType.RELATION), List.of(new IdRange(123L)))); + } + + @Test + void extractTags() { + var expression = parser.parse("type:way and (highway=primary or building=*)"); + var result = FilterUtil.tags(expression, x -> true); + assertTrue(result.containsKey(EnumSet.of(OSMType.WAY))); + assertTrue(result.get(EnumSet.of(OSMType.WAY)).containsAll(List.of(new OSHDBTag(2,7), new OSHDBTag(1,-1)))); + } + + private void extractIds(String filter, Map, List> expected) { + var expression = parser.parse(filter); + var actual = FilterUtil.extractIds(expression); + + assertEquals(expected.size(), actual.size()); + for (var entry : expected.entrySet()) { + assertTrue(actual.containsKey(entry.getKey())); + assertEquals(entry.getValue().size(), actual.get(entry.getKey()).size()); + assertTrue(actual.get(entry.getKey()).containsAll(entry.getValue())); + } + } + +} \ No newline at end of file diff --git a/oshdb-filter/src/test/java/org/heigit/ohsome/oshdb/filter/ParseTest.java b/oshdb-filter/src/test/java/org/heigit/ohsome/oshdb/filter/ParseTest.java index 243322b79..5090719d7 100644 --- a/oshdb-filter/src/test/java/org/heigit/ohsome/oshdb/filter/ParseTest.java +++ b/oshdb-filter/src/test/java/org/heigit/ohsome/oshdb/filter/ParseTest.java @@ -1,14 +1,5 @@ package org.heigit.ohsome.oshdb.filter; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.EnumSet; -import java.util.List; import org.heigit.ohsome.oshdb.OSHDBTag; import org.heigit.ohsome.oshdb.filter.GeometryTypeFilter.GeometryType; import org.heigit.ohsome.oshdb.osm.OSMType; @@ -16,6 +7,10 @@ import org.jparsec.error.ParserException; import org.junit.jupiter.api.Test; +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; + /** * Tests the parsing of filters and the application to OSM entities. */ @@ -24,7 +19,7 @@ class ParseTest extends FilterTest { void testTagFilterEquals() { FilterExpression expression = parser.parse("highway=residential"); assertTrue(expression instanceof TagFilterEquals); - OSHDBTag tag = tagTranslator.getOSHDBTagOf("highway", "residential").get(); + OSHDBTag tag = tagTranslator.getOSHDBTagOf("highway", "residential").orElseThrow(); assertEquals(tag, ((TagFilterEquals) expression).getTag()); assertEquals("tag:" + tag.getKey() + "=" + tag.getValue(), expression.toString()); } @@ -44,7 +39,7 @@ void testTagFilterStrings() { void testTagFilterEqualsAny() { FilterExpression expression = parser.parse("highway=*"); assertTrue(expression instanceof TagFilterEqualsAny); - OSHDBTagKey tag = tagTranslator.getOSHDBTagKeyOf("highway").get(); + OSHDBTagKey tag = tagTranslator.getOSHDBTagKeyOf("highway").orElseThrow(); assertEquals(tag, ((TagFilterEqualsAny) expression).getTag()); assertEquals("tag:" + tag.toInt() + "=*", expression.toString()); } @@ -53,7 +48,7 @@ void testTagFilterEqualsAny() { void testTagFilterNotEquals() { FilterExpression expression = parser.parse("highway!=residential"); assertTrue(expression instanceof TagFilterNotEquals); - OSHDBTag tag = tagTranslator.getOSHDBTagOf("highway", "residential").get(); + OSHDBTag tag = tagTranslator.getOSHDBTagOf("highway", "residential").orElseThrow(); assertEquals(tag, ((TagFilterNotEquals) expression).getTag()); assertEquals("tag:" + tag.getKey() + "!=" + tag.getValue(), expression.toString()); } @@ -62,7 +57,7 @@ void testTagFilterNotEquals() { void testTagFilterNotEqualsAny() { FilterExpression expression = parser.parse("highway!=*"); assertTrue(expression instanceof TagFilterNotEqualsAny); - OSHDBTagKey tag = tagTranslator.getOSHDBTagKeyOf("highway").get(); + OSHDBTagKey tag = tagTranslator.getOSHDBTagKeyOf("highway").orElseThrow(); assertEquals(tag, ((TagFilterNotEqualsAny) expression).getTag()); assertEquals("tag:" + tag.toInt() + "!=*", expression.toString()); } @@ -72,8 +67,8 @@ void testTagFilterNotEqualsAny() { void testTagFilterEqualsAnyOf() { FilterExpression expression = parser.parse("highway in (residential, track)"); assertTrue(expression instanceof TagFilterEqualsAnyOf); - OSHDBTag tag1 = tagTranslator.getOSHDBTagOf("highway", "residential").get(); - OSHDBTag tag2 = tagTranslator.getOSHDBTagOf("highway", "track").get(); + OSHDBTag tag1 = tagTranslator.getOSHDBTagOf("highway", "residential").orElseThrow(); + OSHDBTag tag2 = tagTranslator.getOSHDBTagOf("highway", "track").orElseThrow(); assertTrue(expression.toString().matches("tag:" + tag1.getKey() + "in(" + tag1.getValue() + "," + tag2.getValue() + "|" + tag2.getValue() + "," + tag1.getValue() + ")" @@ -85,8 +80,8 @@ void testTagFilterEqualsAnyOf() { void testTagFilterNotEqualsAnyOf() { FilterExpression expression = parser.parse("not highway in (residential, track)"); assertTrue(expression instanceof TagFilterNotEqualsAnyOf); - OSHDBTag tag1 = tagTranslator.getOSHDBTagOf("highway", "residential").get(); - OSHDBTag tag2 = tagTranslator.getOSHDBTagOf("highway", "track").get(); + OSHDBTag tag1 = tagTranslator.getOSHDBTagOf("highway", "residential").orElseThrow(); + OSHDBTag tag2 = tagTranslator.getOSHDBTagOf("highway", "track").orElseThrow(); assertTrue(expression.toString().matches("tag:" + tag1.getKey() + "not-in(" + tag1.getValue() + "," + tag2.getValue() + "|" + tag2.getValue() + "," + tag1.getValue() + ")" @@ -95,36 +90,30 @@ void testTagFilterNotEqualsAnyOf() { @Test() void testTagFilterEqualsAnyOfCheckEmpty() { - assertThrows(IllegalStateException.class, () -> { - new TagFilterEqualsAnyOf(Collections.emptyList()); - }); + var list = Collections.emptyList(); + assertThrows(IllegalStateException.class, () -> new TagFilterEqualsAnyOf(list)); } @Test() void testTagFilterNotEqualsAnyOfCheckEmpty() { - assertThrows(IllegalStateException.class, () -> { - new TagFilterNotEqualsAnyOf(Collections.emptyList()); - }); + var list = Collections.emptyList(); + assertThrows(IllegalStateException.class, () -> new TagFilterNotEqualsAnyOf(list)); } @Test() void testTagFilterEqualsAnyOfCheckMixed() { - assertThrows(IllegalStateException.class, () -> { - new TagFilterEqualsAnyOf(Arrays.asList( - tagTranslator.getOSHDBTagOf("highway", "residential").get(), - tagTranslator.getOSHDBTagOf("building", "yes").get() - )); - }); + var list = Arrays.asList( + tagTranslator.getOSHDBTagOf("highway", "residential").orElseThrow(), + tagTranslator.getOSHDBTagOf("building", "yes").orElseThrow()); + assertThrows(IllegalStateException.class, () -> new TagFilterEqualsAnyOf(list)); } @Test() void testTagFilterNotEqualsAnyOfCheckMixed() { - assertThrows(IllegalStateException.class, () -> { - new TagFilterNotEqualsAnyOf(Arrays.asList( - tagTranslator.getOSHDBTagOf("highway", "residential").get(), - tagTranslator.getOSHDBTagOf("building", "yes").get() - )); - }); + var list = Arrays.asList( + tagTranslator.getOSHDBTagOf("highway", "residential").orElseThrow(), + tagTranslator.getOSHDBTagOf("building", "yes").orElseThrow()); + assertThrows(IllegalStateException.class, () -> new TagFilterNotEqualsAnyOf(list)); } @Test @@ -158,6 +147,8 @@ void testIdFilterEqualsAnyOf() { FilterExpression expression = parser.parse("id:(1,2,3)"); assertTrue(expression instanceof IdFilterEqualsAnyOf); assertEquals("id:in1,2,3", expression.toString()); + var filter = (IdFilterEqualsAnyOf) expression; + assertTrue(filter.getIds().containsAll(List.of(1L, 2L, 3L))); } @Test @@ -171,9 +162,8 @@ void testIdTypeFilterEqualsAnyOf() { @Test() void testIdFilterEqualsAnyOfCheckEmpty() { - assertThrows(IllegalStateException.class, () -> { - new IdFilterEqualsAnyOf(Collections.emptyList()); - }); + var emptyList = Collections.emptyList(); + assertThrows(IllegalStateException.class, () -> new IdFilterEqualsAnyOf(emptyList)); } @Test @@ -430,11 +420,8 @@ void testContributorUserIdRangeFilter() { assertEquals("contributor:in-range10..12", expression.toString()); } - @SuppressWarnings("ResultOfMethodCallIgnored") @Test() void testContributorIdFilterNotEnabled() { - assertThrows(ParserException.class, () -> { - parser.parse("contributor:0"); - }); + assertThrows(ParserException.class, () -> parser.parse("contributor:0")); } }