From 770885b28c38da8a4e4ee35fedd00a479089d8db Mon Sep 17 00:00:00 2001 From: Jakub Bednar Date: Wed, 7 Sep 2022 11:50:53 +0200 Subject: [PATCH 1/5] fix: mapping `Number` types to POJO query output --- .../query/internal/FluxResultMapper.java | 18 ++++----- .../query/internal/FluxResultMapperTest.java | 39 +++++++++++++++++++ 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/client-core/src/main/java/com/influxdb/query/internal/FluxResultMapper.java b/client-core/src/main/java/com/influxdb/query/internal/FluxResultMapper.java index e75a63f8cbe..09b4b3fff4e 100644 --- a/client-core/src/main/java/com/influxdb/query/internal/FluxResultMapper.java +++ b/client-core/src/main/java/com/influxdb/query/internal/FluxResultMapper.java @@ -129,16 +129,16 @@ private void setFieldValue(@Nonnull final Object object, } //convert primitives - if (double.class.isAssignableFrom(fieldType)) { - field.setDouble(object, toDoubleValue(value)); + if (double.class.isAssignableFrom(fieldType) || Double.class.isAssignableFrom(fieldType)) { + field.set(object, toDoubleValue(value)); return; } - if (long.class.isAssignableFrom(fieldType)) { - field.setLong(object, toLongValue(value)); + if (long.class.isAssignableFrom(fieldType) || Long.class.isAssignableFrom(fieldType)) { + field.set(object, toLongValue(value)); return; } - if (int.class.isAssignableFrom(fieldType)) { - field.setInt(object, toIntValue(value)); + if (int.class.isAssignableFrom(fieldType) || Integer.class.isAssignableFrom(fieldType)) { + field.set(object, toIntValue(value)); return; } if (boolean.class.isAssignableFrom(fieldType)) { @@ -172,7 +172,7 @@ private double toDoubleValue(final Object value) { return (double) value; } - return (Double) value; + return ((Number) value).doubleValue(); } private long toLongValue(final Object value) { @@ -181,7 +181,7 @@ private long toLongValue(final Object value) { return (long) value; } - return ((Double) value).longValue(); + return ((Number) value).longValue(); } private int toIntValue(final Object value) { @@ -190,7 +190,7 @@ private int toIntValue(final Object value) { return (int) value; } - return ((Double) value).intValue(); + return ((Number) value).intValue(); } private BigDecimal toBigDecimalValue(final Object value) { diff --git a/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java b/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java index 4c8ef932490..15c53e83af1 100644 --- a/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java +++ b/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java @@ -114,6 +114,36 @@ public void pojoWithMeasurement() { Assertions.assertThat(bean.value).isEqualByComparingTo(new BigDecimal(20)); } + @Test + public void numberConversion() { + + FluxRecord record = new FluxRecord(0); + + record.getValues().put("fieldLong", 55); + record.getValues().put("fieldDouble", 55); + record.getValues().put("fieldInt", 55); + NumberFields bean = mapper.toPOJO(record, NumberFields.class); + Assertions.assertThat(bean.fieldLong).isEqualTo(55L); + Assertions.assertThat(bean.fieldDouble).isEqualTo(55.0); + Assertions.assertThat(bean.fieldInt).isEqualTo(55); + + record.getValues().put("fieldLong", 55.0); + record.getValues().put("fieldDouble", 55.0); + record.getValues().put("fieldInt", 55.0); + bean = mapper.toPOJO(record, NumberFields.class); + Assertions.assertThat(bean.fieldLong).isEqualTo(55L); + Assertions.assertThat(bean.fieldDouble).isEqualTo(55.0); + Assertions.assertThat(bean.fieldInt).isEqualTo(55); + + record.getValues().put("fieldLong", 55L); + record.getValues().put("fieldDouble", 55L); + record.getValues().put("fieldInt", 55L); + bean = mapper.toPOJO(record, NumberFields.class); + Assertions.assertThat(bean.fieldLong).isEqualTo(55L); + Assertions.assertThat(bean.fieldDouble).isEqualTo(55.0); + Assertions.assertThat(bean.fieldInt).isEqualTo(55); + } + public static class BigDecimalBean { @Column(name = "value1") BigDecimal value1; @@ -166,4 +196,13 @@ public static class BeanWithMeasurement { @Column(name = "value") BigDecimal value; } + + public static class NumberFields { + @Column + private Long fieldLong; + @Column + private Double fieldDouble; + @Column + private Double fieldInt; + } } From 487f92c2ac52c489d2f6066b4fc941c4f06f7bc5 Mon Sep 17 00:00:00 2001 From: Jakub Bednar Date: Wed, 7 Sep 2022 11:54:50 +0200 Subject: [PATCH 2/5] docs: update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e165d6066f1..94093ea547b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,9 @@ ### Features 1. [#419](https://github.com/influxdata/influxdb-client-java/pull/419): Add possibility to get time from `Point` data structure +### Bug Fixes +1. [#414](https://github.com/influxdata/influxdb-client-java/pull/414): Mapping `Number` types to POJO query output + ### Documentation 1. [#406](https://github.com/influxdata/influxdb-client-java/pull/406): Fix compatibility of the `doclint` between JDK 8 and JDK 18 From 91ed83a03b8323b81ab86341c52c1c6076c6fffc Mon Sep 17 00:00:00 2001 From: Jakub Bednar Date: Thu, 8 Sep 2022 08:54:03 +0200 Subject: [PATCH 3/5] fix: mapping `Number` types to POJO query output --- .../java/com/influxdb/query/internal/FluxResultMapperTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java b/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java index 15c53e83af1..c4b28d2217b 100644 --- a/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java +++ b/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java @@ -203,6 +203,6 @@ public static class NumberFields { @Column private Double fieldDouble; @Column - private Double fieldInt; + private Integer fieldInt; } } From 63ac96838e131ce4ab084fff372d72b15428b64f Mon Sep 17 00:00:00 2001 From: Jakub Bednar Date: Fri, 16 Sep 2022 09:17:17 +0200 Subject: [PATCH 4/5] feat: add mapping for `float` and `short` --- .../query/internal/FluxResultMapper.java | 34 ++++++++++++ .../query/internal/FluxResultMapperTest.java | 54 +++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/client-core/src/main/java/com/influxdb/query/internal/FluxResultMapper.java b/client-core/src/main/java/com/influxdb/query/internal/FluxResultMapper.java index 09b4b3fff4e..d2544a22697 100644 --- a/client-core/src/main/java/com/influxdb/query/internal/FluxResultMapper.java +++ b/client-core/src/main/java/com/influxdb/query/internal/FluxResultMapper.java @@ -141,6 +141,14 @@ private void setFieldValue(@Nonnull final Object object, field.set(object, toIntValue(value)); return; } + if (float.class.isAssignableFrom(fieldType) || Float.class.isAssignableFrom(fieldType)) { + field.set(object, toFloatValue(value)); + return; + } + if (short.class.isAssignableFrom(fieldType) || Short.class.isAssignableFrom(fieldType)) { + field.set(object, toShortValue(value)); + return; + } if (boolean.class.isAssignableFrom(fieldType)) { field.setBoolean(object, Boolean.valueOf(String.valueOf(value))); return; @@ -193,6 +201,24 @@ private int toIntValue(final Object value) { return ((Number) value).intValue(); } + private float toFloatValue(final Object value) { + + if (float.class.isAssignableFrom(value.getClass()) || Float.class.isAssignableFrom(value.getClass())) { + return (float) value; + } + + return ((Number) value).floatValue(); + } + + private short toShortValue(final Object value) { + + if (short.class.isAssignableFrom(value.getClass()) || Short.class.isAssignableFrom(value.getClass())) { + return (short) value; + } + + return ((Number) value).shortValue(); + } + private BigDecimal toBigDecimalValue(final Object value) { if (String.class.isAssignableFrom(value.getClass())) { return new BigDecimal((String) value); @@ -210,6 +236,14 @@ private BigDecimal toBigDecimalValue(final Object value) { return BigDecimal.valueOf((long) value); } + if (float.class.isAssignableFrom(value.getClass()) || Float.class.isAssignableFrom(value.getClass())) { + return BigDecimal.valueOf((float) value); + } + + if (short.class.isAssignableFrom(value.getClass()) || Short.class.isAssignableFrom(value.getClass())) { + return BigDecimal.valueOf((short) value); + } + String message = String.format("Cannot cast %s [%s] to %s.", value.getClass().getName(), value, BigDecimal.class); diff --git a/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java b/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java index c4b28d2217b..034d0a33846 100644 --- a/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java +++ b/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java @@ -122,26 +122,72 @@ public void numberConversion() { record.getValues().put("fieldLong", 55); record.getValues().put("fieldDouble", 55); record.getValues().put("fieldInt", 55); + record.getValues().put("fieldFloat", 55); + record.getValues().put("fieldShort", 55); + record.getValues().put("fieldBigDecimal", 55); NumberFields bean = mapper.toPOJO(record, NumberFields.class); Assertions.assertThat(bean.fieldLong).isEqualTo(55L); Assertions.assertThat(bean.fieldDouble).isEqualTo(55.0); Assertions.assertThat(bean.fieldInt).isEqualTo(55); + Assertions.assertThat(bean.fieldFloat).isEqualTo(55F); + Assertions.assertThat(bean.fieldShort).isEqualTo((short) 55); + Assertions.assertThat(bean.fieldBigDecimal).isEqualByComparingTo(BigDecimal.valueOf(55)); record.getValues().put("fieldLong", 55.0); record.getValues().put("fieldDouble", 55.0); record.getValues().put("fieldInt", 55.0); + record.getValues().put("fieldFloat", 55.0); + record.getValues().put("fieldShort", 55.0); + record.getValues().put("fieldBigDecimal", 55.0); bean = mapper.toPOJO(record, NumberFields.class); Assertions.assertThat(bean.fieldLong).isEqualTo(55L); Assertions.assertThat(bean.fieldDouble).isEqualTo(55.0); Assertions.assertThat(bean.fieldInt).isEqualTo(55); + Assertions.assertThat(bean.fieldFloat).isEqualTo(55F); + Assertions.assertThat(bean.fieldShort).isEqualTo((short) 55); + Assertions.assertThat(bean.fieldBigDecimal).isEqualByComparingTo(BigDecimal.valueOf(55)); record.getValues().put("fieldLong", 55L); record.getValues().put("fieldDouble", 55L); record.getValues().put("fieldInt", 55L); + record.getValues().put("fieldFloat", 55L); + record.getValues().put("fieldShort", 55L); + record.getValues().put("fieldBigDecimal", 55L); bean = mapper.toPOJO(record, NumberFields.class); Assertions.assertThat(bean.fieldLong).isEqualTo(55L); Assertions.assertThat(bean.fieldDouble).isEqualTo(55.0); Assertions.assertThat(bean.fieldInt).isEqualTo(55); + Assertions.assertThat(bean.fieldFloat).isEqualTo(55F); + Assertions.assertThat(bean.fieldShort).isEqualTo((short) 55); + Assertions.assertThat(bean.fieldBigDecimal).isEqualByComparingTo(BigDecimal.valueOf(55)); + + record.getValues().put("fieldLong", 55F); + record.getValues().put("fieldDouble", 55F); + record.getValues().put("fieldInt", 55F); + record.getValues().put("fieldFloat", 55F); + record.getValues().put("fieldShort", 55f); + record.getValues().put("fieldBigDecimal", 55f); + bean = mapper.toPOJO(record, NumberFields.class); + Assertions.assertThat(bean.fieldLong).isEqualTo(55L); + Assertions.assertThat(bean.fieldDouble).isEqualTo(55.0); + Assertions.assertThat(bean.fieldInt).isEqualTo(55); + Assertions.assertThat(bean.fieldFloat).isEqualTo(55F); + Assertions.assertThat(bean.fieldShort).isEqualTo((short) 55); + Assertions.assertThat(bean.fieldBigDecimal).isEqualByComparingTo(BigDecimal.valueOf(55)); + + record.getValues().put("fieldLong", (short) 55); + record.getValues().put("fieldDouble", (short) 55); + record.getValues().put("fieldInt", (short) 55); + record.getValues().put("fieldFloat", (short) 55); + record.getValues().put("fieldShort", (short) 55); + record.getValues().put("fieldBigDecimal", (short) 55); + bean = mapper.toPOJO(record, NumberFields.class); + Assertions.assertThat(bean.fieldLong).isEqualTo(55L); + Assertions.assertThat(bean.fieldDouble).isEqualTo(55.0); + Assertions.assertThat(bean.fieldInt).isEqualTo(55); + Assertions.assertThat(bean.fieldFloat).isEqualTo(55F); + Assertions.assertThat(bean.fieldShort).isEqualTo((short) 55); + Assertions.assertThat(bean.fieldBigDecimal).isEqualByComparingTo(BigDecimal.valueOf(55)); } public static class BigDecimalBean { @@ -204,5 +250,13 @@ public static class NumberFields { private Double fieldDouble; @Column private Integer fieldInt; + @Column + private Float fieldFloat; + + @Column + private Short fieldShort; + + @Column + private BigDecimal fieldBigDecimal; } } From 2812f038a7f8adc3fd8a81313f652da4aba04f6e Mon Sep 17 00:00:00 2001 From: Jakub Bednar Date: Fri, 16 Sep 2022 09:20:18 +0200 Subject: [PATCH 5/5] fix: code style --- .../java/com/influxdb/query/internal/FluxResultMapperTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java b/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java index 034d0a33846..0681443bb7d 100644 --- a/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java +++ b/client-core/src/test/java/com/influxdb/query/internal/FluxResultMapperTest.java @@ -252,10 +252,8 @@ public static class NumberFields { private Integer fieldInt; @Column private Float fieldFloat; - @Column private Short fieldShort; - @Column private BigDecimal fieldBigDecimal; }