From 825196fa0ac6c4c929d1b78d659605708701974a Mon Sep 17 00:00:00 2001 From: Alexander Koval Date: Thu, 9 Oct 2025 15:29:59 +0300 Subject: [PATCH 1/2] Fix rewriting terms query with consecutive whole numbers Fixes #19566 Signed-off-by: Alexander Koval --- .../opensearch/index/query/ComplementHelperUtils.java | 1 + .../opensearch/index/query/TermsQueryBuilderTests.java | 9 +++++++++ 2 files changed, 10 insertions(+) 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)); From d207a867c18cd0614858199c62a9a7d772919ea0 Mon Sep 17 00:00:00 2001 From: Alexander Koval Date: Thu, 9 Oct 2025 17:21:55 +0300 Subject: [PATCH 2/2] Add entry to changelog Signed-off-by: Alexander Koval --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) 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))