Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: mapping Number types to POJO query output #414

Merged
merged 5 commits into from
Sep 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,16 +129,24 @@ 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;
}
bednar marked this conversation as resolved.
Show resolved Hide resolved
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)) {
Expand Down Expand Up @@ -172,7 +180,7 @@ private double toDoubleValue(final Object value) {
return (double) value;
}

return (Double) value;
return ((Number) value).doubleValue();
}

private long toLongValue(final Object value) {
Expand All @@ -181,7 +189,7 @@ private long toLongValue(final Object value) {
return (long) value;
}

return ((Double) value).longValue();
return ((Number) value).longValue();
}

private int toIntValue(final Object value) {
Expand All @@ -190,7 +198,25 @@ private int toIntValue(final Object value) {
return (int) value;
}

return ((Double) value).intValue();
return ((Number) value).intValue();
}

bednar marked this conversation as resolved.
Show resolved Hide resolved
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) {
bednar marked this conversation as resolved.
Show resolved Hide resolved
Expand All @@ -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);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,82 @@ 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);
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 {
@Column(name = "value1")
BigDecimal value1;
Expand Down Expand Up @@ -166,4 +242,19 @@ public static class BeanWithMeasurement {
@Column(name = "value")
BigDecimal value;
}

public static class NumberFields {
@Column
private Long fieldLong;
@Column
private Double fieldDouble;
@Column
private Integer fieldInt;
@Column
private Float fieldFloat;
@Column
private Short fieldShort;
@Column
private BigDecimal fieldBigDecimal;
}
}