diff --git a/CHANGELOG.md b/CHANGELOG.md index 249ce03e2e73c..13aca56a25e27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Fixed - Fix flaky test FieldDataLoadingIT.testIndicesFieldDataCacheSizeSetting ([#19571](https://github.com/opensearch-project/OpenSearch/pull/19571)) +- Fix incorrect rewriting of terms query with more than 2 consecutive whole numbers + ([#19587](https://github.com/opensearch-project/OpenSearch/pull/19587)) ### Dependencies - Bump `com.azure:azure-core-http-netty` from 1.15.12 to 1.16.1 ([#19533](https://github.com/opensearch-project/OpenSearch/pull/19533)) diff --git a/server/src/main/java/org/opensearch/index/query/ComplementHelperUtils.java b/server/src/main/java/org/opensearch/index/query/ComplementHelperUtils.java index 0dfc439f32f65..163687d4856fd 100644 --- a/server/src/main/java/org/opensearch/index/query/ComplementHelperUtils.java +++ b/server/src/main/java/org/opensearch/index/query/ComplementHelperUtils.java @@ -62,6 +62,7 @@ public static List numberValuesToComplement(String fieldName, List // If this is a whole number field and the last value is 1 less than the current value, we can skip this part of the // complement if (isWholeNumber && value.longValue() - lastValue.longValue() == 1) { + lastValue = value; continue; } range.includeLower(false); diff --git a/server/src/test/java/org/opensearch/index/query/TermsQueryBuilderTests.java b/server/src/test/java/org/opensearch/index/query/TermsQueryBuilderTests.java index 57de1cdeba900..7e9d0fc28f809 100644 --- a/server/src/test/java/org/opensearch/index/query/TermsQueryBuilderTests.java +++ b/server/src/test/java/org/opensearch/index/query/TermsQueryBuilderTests.java @@ -505,6 +505,15 @@ public void testGetComplementWholeNumber() throws Exception { complement = queryBuilder.getComplement(createShardContext(searcher)); assertEquals(complement, expectedComplement); + // Test multiple consecutive values + queryBuilder = new TermsQueryBuilder(INT_FIELD_NAME, List.of("1", "2", "3")); + complement = queryBuilder.getComplement(createShardContext(searcher)); + expectedComplement = List.of( + new RangeQueryBuilder(INT_FIELD_NAME).to(1).includeLower(true).includeUpper(false), + new RangeQueryBuilder(INT_FIELD_NAME).from(3).includeLower(false).includeUpper(true) + ); + assertEquals(complement, expectedComplement); + // If zero values, we should get null queryBuilder = new TermsQueryBuilder(INT_FIELD_NAME, List.of()); complement = queryBuilder.getComplement(createShardContext(searcher));