summaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorjonmv <venstad@gmail.com>2022-10-25 11:57:31 +0200
committerjonmv <venstad@gmail.com>2022-10-26 12:07:18 +0200
commit2c39e2bc5b7d6d517761b148e468021527c366f5 (patch)
treef6c894e3248b908fa3c222efef2ed3d51dd6a81d /container-search
parent4961b091bad43c3ac5809b1229ff473dc5663fed (diff)
Handle dominated query points
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/MultiRangeItem.java21
-rw-r--r--container-search/src/test/java/com/yahoo/prelude/query/MultiRangeItemTestCase.java3
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 {