diff options
author | jonmv <venstad@gmail.com> | 2022-10-25 11:57:31 +0200 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2022-10-26 12:07:18 +0200 |
commit | 2c39e2bc5b7d6d517761b148e468021527c366f5 (patch) | |
tree | f6c894e3248b908fa3c222efef2ed3d51dd6a81d /container-search | |
parent | 4961b091bad43c3ac5809b1229ff473dc5663fed (diff) |
Handle dominated query points
Diffstat (limited to 'container-search')
-rw-r--r-- | container-search/src/main/java/com/yahoo/prelude/query/MultiRangeItem.java | 21 | ||||
-rw-r--r-- | container-search/src/test/java/com/yahoo/prelude/query/MultiRangeItemTestCase.java | 3 |
2 files changed, 17 insertions, 7 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/MultiRangeItem.java b/container-search/src/main/java/com/yahoo/prelude/query/MultiRangeItem.java index dfd26d5df6d..8839ead7977 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/MultiRangeItem.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/MultiRangeItem.java @@ -179,12 +179,12 @@ public class MultiRangeItem<Type extends Number> extends MultiTermItem { if (sorted && ! ranges.isEmpty()) { // If the new range is not completely before the current last range, we can prune, and keep a sorted list. Range<Type> last = ranges.get(ranges.size() - 1); - sorted = overlap(range.end, last.start); + sorted = overlap(range, last); if (sorted) { // Pop all ranges that overlap with the new range ... Range<Type> popped = range; for (int i = ranges.size(); i-- > 0; ) - if (overlap(ranges.get(i).end, range.start)) + if (overlap(ranges.get(i), range)) popped = ranges.remove(i); else break; @@ -197,9 +197,18 @@ public class MultiRangeItem<Type extends Number> extends MultiTermItem { return this; } - private boolean overlap(Number endOfFirst, Number startOfSecond) { - int comparison = comparator.compare(endOfFirst, startOfSecond); - return comparison > 0 || comparison == 0 && startInclusive | endInclusive; + /** + * Assumption: first.start <= second.start + * Then there is overlap if + * first.end > second.start + * first.end == second.start AND either of + * ranges are inclusive at either end, OR + * either range is a (logically empty) point (a, a), since this dominated by (or equal to) the other range. + */ + private boolean overlap(Range<Type> first, Range<Type> second) { + int comparison = type.comparator.compare(first.end, second.start); + return comparison > 0 + || comparison == 0 && (startInclusive || endInclusive || first.start.equals(first.end) || second.start.equals(second.end)); } private Type min(Type a, Type b) { @@ -220,7 +229,7 @@ public class MultiRangeItem<Type extends Number> extends MultiTermItem { Range<Type> start = ranges.get(0), end = start; for (int i = 1; i < ranges.size(); i++) { Range<Type> range = ranges.get(i); - if (overlap(end.end, range.start)) { + if (overlap(end, range)) { end = type.comparator.compare(end.end, range.end) < 0 ? range : end; } else { diff --git a/container-search/src/test/java/com/yahoo/prelude/query/MultiRangeItemTestCase.java b/container-search/src/test/java/com/yahoo/prelude/query/MultiRangeItemTestCase.java index c970f97c70e..9f8e76e7c45 100644 --- a/container-search/src/test/java/com/yahoo/prelude/query/MultiRangeItemTestCase.java +++ b/container-search/src/test/java/com/yahoo/prelude/query/MultiRangeItemTestCase.java @@ -135,7 +135,8 @@ public class MultiRangeItemTestCase { item.sortedRanges()); item.addRange(0.0, POSITIVE_INFINITY); - assertEquals(List.of(new Range<>(NEGATIVE_INFINITY, POSITIVE_INFINITY)), + assertEquals(List.of(new Range<>(NEGATIVE_INFINITY, 0.0), + new Range<>(0.0, POSITIVE_INFINITY)), item.sortedRanges()); try { |