Skip to content

Commit e93949f

Browse files
authored
Unify Point's and InfluxDBMapper's POJO saving logic (#979)
1 parent d697143 commit e93949f

File tree

4 files changed

+43
-94
lines changed

4 files changed

+43
-94
lines changed

Diff for: src/main/java/org/influxdb/dto/Point.java

+27-1
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ private void addFieldByAttribute(final Object pojo, final Field field, final boo
350350
}
351351
} else {
352352
if (fieldValue != null) {
353-
this.fields.put(fieldName, fieldValue);
353+
setField(field.getType(), fieldName, fieldValue);
354354
}
355355
}
356356

@@ -379,6 +379,32 @@ public Point build() {
379379
point.setTags(this.tags);
380380
return point;
381381
}
382+
383+
private void setField(
384+
final Class<?> fieldType,
385+
final String columnName,
386+
final Object value) {
387+
if (boolean.class.isAssignableFrom(fieldType) || Boolean.class.isAssignableFrom(fieldType)) {
388+
addField(columnName, (boolean) value);
389+
} else if (long.class.isAssignableFrom(fieldType) || Long.class.isAssignableFrom(fieldType)) {
390+
addField(columnName, (long) value);
391+
} else if (double.class.isAssignableFrom(fieldType) || Double.class.isAssignableFrom(fieldType)) {
392+
addField(columnName, (double) value);
393+
} else if (float.class.isAssignableFrom(fieldType) || Float.class.isAssignableFrom(fieldType)) {
394+
addField(columnName, (float) value);
395+
} else if (int.class.isAssignableFrom(fieldType) || Integer.class.isAssignableFrom(fieldType)) {
396+
addField(columnName, (int) value);
397+
} else if (short.class.isAssignableFrom(fieldType) || Short.class.isAssignableFrom(fieldType)) {
398+
addField(columnName, (short) value);
399+
} else if (String.class.isAssignableFrom(fieldType)) {
400+
addField(columnName, (String) value);
401+
} else if (Enum.class.isAssignableFrom(fieldType)) {
402+
addField(columnName, ((Enum<?>) value).name());
403+
} else {
404+
throw new InfluxDBMapperException(
405+
"Unsupported type " + fieldType + " for column " + columnName);
406+
}
407+
}
382408
}
383409

384410
/**

Diff for: src/main/java/org/influxdb/impl/InfluxDBMapper.java

+10-90
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
package org.influxdb.impl;
22

3-
import java.lang.reflect.Field;
4-
import java.time.Instant;
5-
import java.util.List;
6-
import java.util.concurrent.ConcurrentMap;
7-
import java.util.concurrent.TimeUnit;
83
import org.influxdb.InfluxDB;
9-
import org.influxdb.InfluxDBMapperException;
10-
import org.influxdb.annotation.Column;
114
import org.influxdb.annotation.Measurement;
125
import org.influxdb.dto.Point;
136
import org.influxdb.dto.Query;
147
import org.influxdb.dto.QueryResult;
158

9+
import java.util.List;
10+
1611
public class InfluxDBMapper extends InfluxDBResultMapper {
1712

1813
private final InfluxDB influxDB;
@@ -52,91 +47,16 @@ public <T> List<T> query(final Class<T> clazz) {
5247

5348
public <T> void save(final T model) {
5449
throwExceptionIfMissingAnnotation(model.getClass());
55-
cacheMeasurementClass(model.getClass());
56-
57-
ConcurrentMap<String, Field> colNameAndFieldMap = getColNameAndFieldMap(model.getClass());
58-
59-
try {
60-
Class<?> modelType = model.getClass();
61-
String measurement = getMeasurementName(modelType);
62-
String database = getDatabaseName(modelType);
63-
String retentionPolicy = getRetentionPolicy(modelType);
64-
TimeUnit timeUnit = getTimeUnit(modelType);
65-
long time = timeUnit.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS);
66-
Point.Builder pointBuilder = Point.measurement(measurement).time(time, timeUnit);
67-
68-
for (String key : colNameAndFieldMap.keySet()) {
69-
Field field = colNameAndFieldMap.get(key);
70-
Column column = field.getAnnotation(Column.class);
71-
String columnName = column.name();
72-
Class<?> fieldType = field.getType();
73-
74-
if (!field.isAccessible()) {
75-
field.setAccessible(true);
76-
}
77-
78-
Object value = field.get(model);
79-
80-
if (column.tag()) {
81-
/** Tags are strings either way. */
82-
pointBuilder.tag(columnName, value.toString());
83-
} else if ("time".equals(columnName)) {
84-
if (value != null) {
85-
setTime(pointBuilder, fieldType, timeUnit, value);
86-
}
87-
} else {
88-
setField(pointBuilder, fieldType, columnName, value);
89-
}
90-
}
91-
92-
Point point = pointBuilder.build();
50+
Class<?> modelType = model.getClass();
51+
String database = getDatabaseName(modelType);
52+
String retentionPolicy = getRetentionPolicy(modelType);
53+
Point.Builder pointBuilder = Point.measurementByPOJO(modelType).addFieldsFromPOJO(model);
54+
Point point = pointBuilder.build();
9355

94-
if ("[unassigned]".equals(database)) {
95-
influxDB.write(point);
96-
} else {
97-
influxDB.write(database, retentionPolicy, point);
98-
}
99-
100-
} catch (IllegalAccessException e) {
101-
throw new InfluxDBMapperException(e);
102-
}
103-
}
104-
105-
private void setTime(
106-
final Point.Builder pointBuilder,
107-
final Class<?> fieldType,
108-
final TimeUnit timeUnit,
109-
final Object value) {
110-
if (Instant.class.isAssignableFrom(fieldType)) {
111-
Instant instant = (Instant) value;
112-
long time = timeUnit.convert(instant.toEpochMilli(), TimeUnit.MILLISECONDS);
113-
pointBuilder.time(time, timeUnit);
114-
} else {
115-
throw new InfluxDBMapperException(
116-
"Unsupported type " + fieldType + " for time: should be of Instant type");
117-
}
118-
}
119-
120-
private void setField(
121-
final Point.Builder pointBuilder,
122-
final Class<?> fieldType,
123-
final String columnName,
124-
final Object value) {
125-
if (boolean.class.isAssignableFrom(fieldType) || Boolean.class.isAssignableFrom(fieldType)) {
126-
pointBuilder.addField(columnName, (boolean) value);
127-
} else if (long.class.isAssignableFrom(fieldType) || Long.class.isAssignableFrom(fieldType)) {
128-
pointBuilder.addField(columnName, (long) value);
129-
} else if (double.class.isAssignableFrom(fieldType)
130-
|| Double.class.isAssignableFrom(fieldType)) {
131-
pointBuilder.addField(columnName, (double) value);
132-
} else if (int.class.isAssignableFrom(fieldType) || Integer.class.isAssignableFrom(fieldType)) {
133-
pointBuilder.addField(columnName, (int) value);
134-
} else if (String.class.isAssignableFrom(fieldType)) {
135-
pointBuilder.addField(columnName, (String) value);
56+
if ("[unassigned]".equals(database)) {
57+
influxDB.write(point);
13658
} else {
137-
throw new InfluxDBMapperException(
138-
"Unsupported type " + fieldType + " for column " + columnName);
59+
influxDB.write(database, retentionPolicy, point);
13960
}
14061
}
141-
14262
}

Diff for: src/test/java/org/influxdb/dto/PointTest.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -737,7 +737,7 @@ public void testAddFieldsFromPOJOWithTimeColumnNull() throws NoSuchFieldExceptio
737737
}
738738

739739
@Test
740-
public void testAddFieldsFromPOJOWithData() throws NoSuchFieldException, IllegalAccessException {
740+
public void testAddFieldsFromPOJOWithData() {
741741
Pojo pojo = new Pojo();
742742
pojo.booleanObject = true;
743743
pojo.booleanPrimitive = false;
@@ -760,7 +760,6 @@ public void testAddFieldsFromPOJOWithData() throws NoSuchFieldException, Illegal
760760
Assertions.assertEquals(pojo.integerPrimitive, p.getFields().get("integerPrimitive"));
761761
Assertions.assertEquals(pojo.longObject, p.getFields().get("longObject"));
762762
Assertions.assertEquals(pojo.longPrimitive, p.getFields().get("longPrimitive"));
763-
Assertions.assertEquals(pojo.time, p.getFields().get("time"));
764763
Assertions.assertEquals(pojo.uuid, p.getTags().get("uuid"));
765764
}
766765

@@ -815,7 +814,6 @@ public void testAddFieldsFromPOJOWithPublicAttributes() {
815814
Assertions.assertEquals(pojo.integerPrimitive, p.getFields().get("integerPrimitive"));
816815
Assertions.assertEquals(pojo.longObject, p.getFields().get("longObject"));
817816
Assertions.assertEquals(pojo.longPrimitive, p.getFields().get("longPrimitive"));
818-
Assertions.assertEquals(pojo.time, p.getFields().get("time"));
819817
Assertions.assertEquals(pojo.uuid, p.getTags().get("uuid"));
820818
}
821819

@@ -962,6 +960,7 @@ static class Pojo {
962960
private boolean booleanPrimitive;
963961

964962
@Column(name = "time")
963+
@TimeColumn
965964
private Instant time;
966965

967966
@Column(name = "uuid", tag = true)
@@ -1078,6 +1077,7 @@ static class PojoWithPublicAttributes {
10781077
public boolean booleanPrimitive;
10791078

10801079
@Column(name = "time")
1080+
@TimeColumn
10811081
public Instant time;
10821082

10831083
@Column(name = "uuid", tag = true)

Diff for: src/test/java/org/influxdb/impl/InfluxDBMapperTest.java

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.influxdb.TestUtils;
1212
import org.influxdb.annotation.Column;
1313
import org.influxdb.annotation.Measurement;
14+
import org.influxdb.annotation.TimeColumn;
1415
import org.influxdb.dto.Query;
1516
import org.junit.Assert;
1617
import org.junit.jupiter.api.AfterEach;
@@ -129,6 +130,7 @@ static class ServerMeasure {
129130

130131
/** Check the instant conversions */
131132
@Column(name = "time")
133+
@TimeColumn
132134
private Instant time;
133135

134136
@Column(name = "name", tag = true)
@@ -322,6 +324,7 @@ public void setField(Integer field) {
322324
static class NonInstantTime {
323325

324326
@Column(name = "time")
327+
@TimeColumn
325328
private long time;
326329

327330
public long getTime() {

0 commit comments

Comments
 (0)