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"));
}
}