From 666236d268ce1586a6148e3ba964ade8ca4981e6 Mon Sep 17 00:00:00 2001 From: Prudhvi Godithi Date: Wed, 6 Aug 2025 17:23:07 -0700 Subject: [PATCH 1/4] Fix scaled float bug Signed-off-by: Prudhvi Godithi --- .../index/mapper/ScaledFloatFieldMapper.java | 15 ++++++--------- .../index/mapper/ScaledFloatFieldMapperTests.java | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/modules/mapper-extras/src/main/java/org/opensearch/index/mapper/ScaledFloatFieldMapper.java b/modules/mapper-extras/src/main/java/org/opensearch/index/mapper/ScaledFloatFieldMapper.java index cd1b303ca5124..954cfed59188b 100644 --- a/modules/mapper-extras/src/main/java/org/opensearch/index/mapper/ScaledFloatFieldMapper.java +++ b/modules/mapper-extras/src/main/java/org/opensearch/index/mapper/ScaledFloatFieldMapper.java @@ -219,18 +219,15 @@ public byte[] encodePoint(Number value) { @Override public byte[] encodePoint(Object value, boolean roundUp) { - double doubleValue = parse(value); - long scaledValue = Math.round(scale(doubleValue)); + long scaledValue = Math.round(scale(value)); if (roundUp) { - if (scaledValue < Long.MAX_VALUE) { - scaledValue = scaledValue + 1; - } + scaledValue = scaledValue + 1; } else { - if (scaledValue > Long.MIN_VALUE) { - scaledValue = scaledValue - 1; - } + scaledValue = scaledValue - 1; } - return encodePoint(scaledValue); + byte[] point = new byte[Long.BYTES]; + LongPoint.encodeDimension(scaledValue, point, 0); + return point; } public double getScalingFactor() { diff --git a/modules/mapper-extras/src/test/java/org/opensearch/index/mapper/ScaledFloatFieldMapperTests.java b/modules/mapper-extras/src/test/java/org/opensearch/index/mapper/ScaledFloatFieldMapperTests.java index 0e256867845f3..431ef1aa64c70 100644 --- a/modules/mapper-extras/src/test/java/org/opensearch/index/mapper/ScaledFloatFieldMapperTests.java +++ b/modules/mapper-extras/src/test/java/org/opensearch/index/mapper/ScaledFloatFieldMapperTests.java @@ -33,6 +33,7 @@ package org.opensearch.index.mapper; import org.apache.lucene.document.Document; +import org.apache.lucene.document.LongPoint; import org.apache.lucene.document.SortedNumericDocValuesField; import org.apache.lucene.document.StoredField; import org.apache.lucene.index.DirectoryReader; @@ -473,4 +474,17 @@ public void testRejectIndexOptions() { assertThat(e.getMessage(), containsString("Failed to parse mapping [_doc]: Field [scaling_factor] is required")); assertWarnings("Parameter [index_options] has no effect on type [scaled_float] and will be removed in future"); } + + public void testScaledFloatEncodePoint() { + double scalingFactor = 100.0; + ScaledFloatFieldMapper.ScaledFloatFieldType fieldType = + new ScaledFloatFieldMapper.ScaledFloatFieldType("test_field", scalingFactor); + double originalValue = 10.5; + byte[] encodedRoundUp = fieldType.encodePoint(originalValue, true); + byte[] encodedRoundDown = fieldType.encodePoint(originalValue, false); + long decodedUp = LongPoint.decodeDimension(encodedRoundUp, 0); + long decodedDown = LongPoint.decodeDimension(encodedRoundDown, 0); + assertEquals(1051, decodedUp); // 10.5 scaled = 1050, then +1 = 1051 (represents 10.51) + assertEquals(1049, decodedDown); // 10.5 scaled = 1050, then -1 = 1049 (represents 10.49) + } } From f795ff63c3c9721ac250fd0c919d77fb570c82c2 Mon Sep 17 00:00:00 2001 From: Prudhvi Godithi Date: Wed, 6 Aug 2025 17:38:21 -0700 Subject: [PATCH 2/4] Update changelog Signed-off-by: Prudhvi Godithi --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94ab41614b4cc..15c565777cd4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -118,6 +118,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Fix query string regex queries incorrectly swallowing TooComplexToDeterminizeException ([#18883](https://github.com/opensearch-project/OpenSearch/pull/18883)) - Fix socks5 user password settings for Azure repo ([#18904](https://github.com/opensearch-project/OpenSearch/pull/18904)) - Reset isPipelineResolved to false to resolve the system ingest pipeline again. ([#18911](https://github.com/opensearch-project/OpenSearch/pull/18911)) +- Bug fix for `scaled_float` in `encodePoint` method ([#18952](https://github.com/opensearch-project/OpenSearch/pull/18952)) ### Security From 87e2c2c2f8c032abd7e4c14330eb1aea3988a9e3 Mon Sep 17 00:00:00 2001 From: Prudhvi Godithi Date: Wed, 6 Aug 2025 17:41:18 -0700 Subject: [PATCH 3/4] Update changelog Signed-off-by: Prudhvi Godithi --- .../index/mapper/ScaledFloatFieldMapperTests.java | 6 ++++-- release-notes/opensearch.release-notes-3.2.0.md | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/mapper-extras/src/test/java/org/opensearch/index/mapper/ScaledFloatFieldMapperTests.java b/modules/mapper-extras/src/test/java/org/opensearch/index/mapper/ScaledFloatFieldMapperTests.java index 431ef1aa64c70..95d88cc202f84 100644 --- a/modules/mapper-extras/src/test/java/org/opensearch/index/mapper/ScaledFloatFieldMapperTests.java +++ b/modules/mapper-extras/src/test/java/org/opensearch/index/mapper/ScaledFloatFieldMapperTests.java @@ -477,8 +477,10 @@ public void testRejectIndexOptions() { public void testScaledFloatEncodePoint() { double scalingFactor = 100.0; - ScaledFloatFieldMapper.ScaledFloatFieldType fieldType = - new ScaledFloatFieldMapper.ScaledFloatFieldType("test_field", scalingFactor); + ScaledFloatFieldMapper.ScaledFloatFieldType fieldType = new ScaledFloatFieldMapper.ScaledFloatFieldType( + "test_field", + scalingFactor + ); double originalValue = 10.5; byte[] encodedRoundUp = fieldType.encodePoint(originalValue, true); byte[] encodedRoundDown = fieldType.encodePoint(originalValue, false); diff --git a/release-notes/opensearch.release-notes-3.2.0.md b/release-notes/opensearch.release-notes-3.2.0.md index b251614141cb3..81a35de5edde6 100644 --- a/release-notes/opensearch.release-notes-3.2.0.md +++ b/release-notes/opensearch.release-notes-3.2.0.md @@ -111,4 +111,5 @@ Compatible with OpenSearch and OpenSearch Dashboards version 3.2.0 * Close IndexFieldDataService asynchronously ([#18888](https://github.com/opensearch-project/OpenSearch/pull/18888)) * Fix query string regex queries incorrectly swallowing TooComplexToDeterminizeException ([#18883](https://github.com/opensearch-project/OpenSearch/pull/18883)) * Fix socks5 user password settings for Azure repo ([#18904](https://github.com/opensearch-project/OpenSearch/pull/18904)) -* Reset isPipelineResolved to false to resolve the system ingest pipeline again. ([#18911](https://github.com/opensearch-project/OpenSearch/pull/18911)) \ No newline at end of file +* Reset isPipelineResolved to false to resolve the system ingest pipeline again. ([#18911](https://github.com/opensearch-project/OpenSearch/pull/18911)) +* Bug fix for `scaled_float` in `encodePoint` method ([#18952](https://github.com/opensearch-project/OpenSearch/pull/18952)) From 8350432d8e2b734acb0506abc8d8b6a987cbd3b2 Mon Sep 17 00:00:00 2001 From: Prudhvi Godithi Date: Thu, 7 Aug 2025 08:34:18 -0700 Subject: [PATCH 4/4] Add clamps Signed-off-by: Prudhvi Godithi --- .../opensearch/index/mapper/ScaledFloatFieldMapper.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/mapper-extras/src/main/java/org/opensearch/index/mapper/ScaledFloatFieldMapper.java b/modules/mapper-extras/src/main/java/org/opensearch/index/mapper/ScaledFloatFieldMapper.java index 954cfed59188b..46f403251c323 100644 --- a/modules/mapper-extras/src/main/java/org/opensearch/index/mapper/ScaledFloatFieldMapper.java +++ b/modules/mapper-extras/src/main/java/org/opensearch/index/mapper/ScaledFloatFieldMapper.java @@ -221,9 +221,13 @@ public byte[] encodePoint(Number value) { public byte[] encodePoint(Object value, boolean roundUp) { long scaledValue = Math.round(scale(value)); if (roundUp) { - scaledValue = scaledValue + 1; + if (scaledValue < Long.MAX_VALUE) { + scaledValue = scaledValue + 1; + } } else { - scaledValue = scaledValue - 1; + if (scaledValue > Long.MIN_VALUE) { + scaledValue = scaledValue - 1; + } } byte[] point = new byte[Long.BYTES]; LongPoint.encodeDimension(scaledValue, point, 0);