Skip to content

Commit 264a58c

Browse files
committed
Added two unit tests for the decimals fix. testStarTreeDocValuesWithDecimals validates the behavior of the StarTree index when it works with decimal values (both double and float types). testStarTreeDocValuesDecimalPrecision validates that the StarTree index maintains decimal precision, particularly with high precision values like 10.9999 for double and 99.999f for float.
Signed-off-by: Daniel Salas <daniel.salas@encora.com>
1 parent 3791e74 commit 264a58c

2 files changed

Lines changed: 43 additions & 2 deletions

File tree

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,14 +161,14 @@ public DimensionFilter getRangeMatchFilter(
161161
Long parsedLow = rawLow == null ? defaultMinimum() : numberFieldType.numberType().parse(rawLow, true).longValue();
162162
Long parsedHigh = rawHigh == null ? defaultMaximum() : numberFieldType.numberType().parse(rawHigh, true).longValue();
163163

164-
boolean lowerTermHasDecimalPart = hasDecimalPart(rawLow);
164+
boolean lowerTermHasDecimalPart = hasDecimalPart(parsedLow);
165165
if ((lowerTermHasDecimalPart == false && includeLow == false) || (lowerTermHasDecimalPart && signum(parsedLow) > 0)) {
166166
if (parsedLow.equals(defaultMaximum())) {
167167
return new MatchNoneFilter();
168168
}
169169
++parsedLow;
170170
}
171-
boolean upperTermHasDecimalPart = hasDecimalPart(rawHigh);
171+
boolean upperTermHasDecimalPart = hasDecimalPart(parsedHigh);
172172
if ((upperTermHasDecimalPart == false && includeHigh == false) || (upperTermHasDecimalPart && signum(parsedHigh) < 0)) {
173173
if (parsedHigh.equals(defaultMinimum())) {
174174
return new MatchNoneFilter();

server/src/test/java/org/opensearch/search/aggregations/startree/MetricAggregatorTests.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,47 @@ public void testStarTreeDocValues() throws IOException {
168168
}
169169
}
170170

171+
public void testStarTreeDocValuesWithDecimals() throws IOException {
172+
final List<DimensionFieldData> dimensionFieldDatum = List.of(
173+
new DimensionFieldData("double_field", () -> 10.75, DimensionTypes.DOUBLE),
174+
new DimensionFieldData("float_field", () -> 5.25f, DimensionTypes.FLOAT)
175+
);
176+
testStarTreeDocValuesInternal(
177+
getCodec(() -> 10,
178+
dimensionFieldDatum.stream().collect(
179+
Collectors.toMap(
180+
df -> df.getDimension().getField(),
181+
DimensionFieldData::getFieldType,
182+
(v1, v2) -> v1,
183+
LinkedHashMap::new
184+
)
185+
),
186+
StarTreeFilterTests.METRIC_TYPE_MAP
187+
),
188+
dimensionFieldDatum
189+
);
190+
}
191+
public void testStarTreeDocValuesDecimalPrecision() throws IOException {
192+
final List<DimensionFieldData> dimensionFieldDatum = List.of(
193+
new DimensionFieldData("double_field", () -> 10.9999, DimensionTypes.DOUBLE),
194+
new DimensionFieldData("float_field", () -> 99.999f, DimensionTypes.FLOAT)
195+
);
196+
testStarTreeDocValuesInternal(
197+
getCodec(() -> 50,
198+
dimensionFieldDatum.stream().collect(
199+
Collectors.toMap(
200+
df -> df.getDimension().getField(),
201+
DimensionFieldData::getFieldType,
202+
(v1, v2) -> v1,
203+
LinkedHashMap::new
204+
)
205+
),
206+
StarTreeFilterTests.METRIC_TYPE_MAP
207+
),
208+
dimensionFieldDatum
209+
);
210+
}
211+
171212
private void testStarTreeDocValuesInternal(Codec codec, List<DimensionFieldData> dimensionFieldData) throws IOException {
172213
Directory directory = newDirectory();
173214
IndexWriterConfig conf = newIndexWriterConfig(null);

0 commit comments

Comments
 (0)