diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-12-17 07:12:30 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-12-17 07:17:35 +0100 |
commit | 74ab92418ba90fc9f67ddb3fae19df32e694d427 (patch) | |
tree | 9348b13444175c19bfa500e877279f79883ff936 /metrics-proxy | |
parent | 2eaa27f75d37737eaac6e14a2ac68d94646eb209 (diff) |
numbers outside of the range of a long are forced to have a decimal punctuation to enforce parsing as non integer number.
Diffstat (limited to 'metrics-proxy')
3 files changed, 42 insertions, 6 deletions
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModel.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModel.java index 9bc0dddb784..133d8fee81f 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModel.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModel.java @@ -9,8 +9,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_ABSENT; diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/JacksonUtil.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/JacksonUtil.java index c4f2b7198a4..d599e75b243 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/JacksonUtil.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/JacksonUtil.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.databind.module.SimpleModule; import java.io.IOException; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; +import java.text.NumberFormat; import java.util.Locale; /** @@ -19,12 +20,18 @@ import java.util.Locale; */ public class JacksonUtil { - private static final DecimalFormat decimalFormat = createDecimalFormat(); - private static DecimalFormat createDecimalFormat() { + private static final ThreadLocal<DecimalFormat> withinLongRangeFormat = ThreadLocal.withInitial(JacksonUtil::createWithinLongRangeFormat); + private static final ThreadLocal<DecimalFormat> outsideLongRangeFormat = ThreadLocal.withInitial(JacksonUtil::createOutsideLongRangeFormat); + private static DecimalFormat createWithinLongRangeFormat() { DecimalFormat df = new DecimalFormat("#.####", new DecimalFormatSymbols(Locale.ENGLISH)); df.setMaximumFractionDigits(13); return df; } + private static DecimalFormat createOutsideLongRangeFormat() { + DecimalFormat df = new DecimalFormat("#.0###", new DecimalFormatSymbols(Locale.ENGLISH)); + df.setMaximumFractionDigits(13); + return df; + } /** * Returns an object mapper with a custom floating point serializer to avoid scientific notation */ @@ -40,13 +47,27 @@ public class JacksonUtil { * Returns an object mapper with a custom floating point serializer to avoid scientific notation */ public static void writeDouble(JsonGenerator jgen, Double value) throws IOException { - jgen.writeNumber(decimalFormat.format(value)); + jgen.writeNumber(format(value)); + } + + public static String format(Double value) { + return format(value, withinLongRangeFormat.get(), outsideLongRangeFormat.get()); + } + + private static String format(Double value, NumberFormat withinLongRange, NumberFormat outsideLongRange) { + if ((value <= Long.MAX_VALUE) && (value >= Long.MIN_VALUE)) { + return withinLongRange.format(value); + } else { + return outsideLongRange.format(value); + } } public static class DoubleSerializer extends JsonSerializer<Double> { + private DecimalFormat withinLongRangeFormat = createWithinLongRangeFormat(); + private DecimalFormat outsideLongRangeFormat = createOutsideLongRangeFormat(); @Override public void serialize(Double value, JsonGenerator jgen, SerializerProvider provider) throws IOException { - writeDouble(jgen, value); + jgen.writeNumber(format(value, withinLongRangeFormat, outsideLongRangeFormat)); } } diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModelTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModelTest.java index 5a9bc9ee725..5ddd10fd03c 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModelTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModelTest.java @@ -143,4 +143,21 @@ public class GenericJsonModelTest { return mapper.readValue(getFileContents(filename), GenericJsonModel.class); } + @Test + public void within_long_range_as_long_if_possible() { + assertEquals("7", JacksonUtil.format(7D)); + assertEquals("7.1", JacksonUtil.format(7.1)); + assertEquals("-7", JacksonUtil.format(-7D)); + assertEquals("-7.1", JacksonUtil.format(-7.1)); + } + + @Test + public void outside_long_range_as_decimal_if_possible() { + double within = Long.MAX_VALUE; + double outside = 3 * within; + assertEquals("9223372036854776000", JacksonUtil.format(within)); + assertEquals("-9223372036854776000", JacksonUtil.format(-within)); + assertEquals("27670116110564327000.0", JacksonUtil.format(outside)); + assertEquals("-27670116110564327000.0", JacksonUtil.format(-outside)); + } } |