Skip to content

Commit b85183d

Browse files
committed
Skipping binary range search in ST if low doesn't exists
Signed-off-by: expani <[email protected]>
1 parent 516e3de commit b85183d

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

server/src/main/java/org/opensearch/search/startree/filter/RangeMatchDimFilter.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public class RangeMatchDimFilter implements DimensionFilter {
3030
private Long lowOrdinal;
3131
private Long highOrdinal;
3232

33+
private boolean skipRangeCollection = false;
34+
3335
public RangeMatchDimFilter(String dimensionName, Object low, Object high, boolean includeLow, boolean includeHigh) {
3436
this.dimensionName = dimensionName;
3537
this.low = low;
@@ -40,6 +42,7 @@ public RangeMatchDimFilter(String dimensionName, Object low, Object high, boolea
4042

4143
@Override
4244
public void initialiseForSegment(StarTreeValues starTreeValues, SearchContext searchContext) {
45+
skipRangeCollection = false;
4346
DimensionFilterMapper dimensionFilterMapper = DimensionFilterMapper.Factory.fromMappedFieldType(
4447
searchContext.mapperService().fieldType(dimensionName)
4548
);
@@ -51,6 +54,7 @@ public void initialiseForSegment(StarTreeValues starTreeValues, SearchContext se
5154
lowOrdinal = lowOrdinalFound.get();
5255
} else { // This is only valid for Non-numeric fields.
5356
lowOrdinal = highOrdinal = Long.MAX_VALUE;
57+
skipRangeCollection = true;
5458
return; // High can't be found since nothing >= low exists.
5559
}
5660
}
@@ -65,7 +69,7 @@ public void initialiseForSegment(StarTreeValues starTreeValues, SearchContext se
6569
@Override
6670
public void matchStarTreeNodes(StarTreeNode parentNode, StarTreeValues starTreeValues, StarTreeNodeCollector collector)
6771
throws IOException {
68-
if (parentNode != null) {
72+
if (parentNode != null && !skipRangeCollection) {
6973
parentNode.collectChildrenInRange(lowOrdinal, highOrdinal, collector);
7074
}
7175
}

server/src/main/java/org/opensearch/search/startree/filter/provider/DimensionFilterMapper.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,9 @@ public Optional<Long> getMatchingOrdinal(
352352
if (seekStatus == TermsEnum.SeekStatus.NOT_FOUND) {
353353
long ordGreaterThanValue = termsEnum.ord();
354354
// Checking if we are in bounds for satisfying LT
355-
return ((ordGreaterThanValue - 1) < sortedSetIterator.getValueCount()) ? Optional.of(ordGreaterThanValue - 1) : Optional.empty();
355+
return ((ordGreaterThanValue - 1) < sortedSetIterator.getValueCount())
356+
? Optional.of(ordGreaterThanValue - 1)
357+
: Optional.empty();
356358
} else {
357359
return Optional.of(termsEnum.ord());
358360
}
@@ -362,7 +364,7 @@ public Optional<Long> getMatchingOrdinal(
362364
throw new RuntimeException(e);
363365
}
364366
} else {
365-
throw new IllegalArgumentException("Unsupported star tree values iterator " + genericIterator.getClass().getName());
367+
throw new IllegalStateException("Unsupported star tree values iterator " + genericIterator.getClass().getName());
366368
}
367369
}
368370

0 commit comments

Comments
 (0)