Skip to content

Commit d1873fe

Browse files
MapConverter: allow Java float, always returned as double.
1 parent 4261370 commit d1873fe

File tree

2 files changed

+24
-26
lines changed

2 files changed

+24
-26
lines changed

objectbox-java/src/main/java/io/objectbox/converter/FlexMapConverter.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,8 @@ private void addMap(FlexBuffersBuilder builder, String mapKey, Map<Object, Objec
7878
builder.putInt(key, (Integer) value);
7979
} else if (value instanceof Long) {
8080
builder.putInt(key, (Long) value);
81-
// FIXME When restoring, can't know if Float or Double.
82-
// } else if (value instanceof Float) {
83-
// builder.putFloat(key, (Float) value);
81+
} else if (value instanceof Float) {
82+
builder.putFloat(key, (Float) value);
8483
} else if (value instanceof Double) {
8584
builder.putFloat(key, (Double) value);
8685
} else if (value instanceof byte[]) {
@@ -112,9 +111,8 @@ private void addVector(FlexBuffersBuilder builder, String vectorKey, List<Object
112111
builder.putInt((Integer) item);
113112
} else if (item instanceof Long) {
114113
builder.putInt((Long) item);
115-
// FIXME When restoring, can't know if Float or Double.
116-
// } else if (item instanceof Float) {
117-
// builder.putFloat((Float) item);
114+
} else if (item instanceof Float) {
115+
builder.putFloat((Float) item);
118116
} else if (item instanceof Double) {
119117
builder.putFloat((Double) item);
120118
} else if (item instanceof byte[]) {
@@ -186,7 +184,7 @@ private Map<Object, Object> buildMap(FlexBuffers.Map map) {
186184
resultMap.put(key, value.asInt());
187185
}
188186
} else if (value.isFloat()) {
189-
// FIXME Float or Double? Reading Float as Double is destructive.
187+
// Always return as double; if original was float casting will give original value.
190188
resultMap.put(key, value.asFloat());
191189
} else if (value.isBlob()) {
192190
resultMap.put(key, value.asBlob().getBytes());
@@ -226,7 +224,7 @@ private List<Object> buildList(FlexBuffers.Vector vector) {
226224
list.add(item.asInt());
227225
}
228226
} else if (item.isFloat()) {
229-
// FIXME Float or Double? Reading Float as Double is destructive.
227+
// Always return as double; if original was float casting will give original value.
230228
list.add(item.asFloat());
231229
} else if (item.isBlob()) {
232230
list.add(item.asBlob().getBytes());

tests/objectbox-java-test/src/test/java/io/objectbox/converter/FlexMapConverterTest.java

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@
22

33
import org.junit.Test;
44

5+
import javax.annotation.Nullable;
56
import java.time.Instant;
67
import java.util.HashMap;
78
import java.util.LinkedList;
89
import java.util.List;
910
import java.util.Map;
1011

11-
import javax.annotation.Nullable;
12-
13-
1412
import static org.junit.Assert.assertArrayEquals;
1513
import static org.junit.Assert.assertEquals;
1614
import static org.junit.Assert.assertThrows;
@@ -44,15 +42,17 @@ public void keysString_valsSupportedTypes_works() {
4442
map.put("string", "Grüezi");
4543
map.put("boolean", true);
4644
map.put("long", 1L);
47-
// map.put("float", 1.3f);
45+
map.put("float", 1.3f);
4846
map.put("double", -1.4d);
49-
convertAndBackThenAssert(map, converter);
47+
Map<String, Object> restoredMap = convertAndBack(map, converter);
48+
// Java float is returned as double, so expect double.
49+
map.put("float", (double) 1.3f);
50+
assertEquals(map, restoredMap);
5051
}
5152

5253
/**
5354
* If no item is wider than 32 bits, all integers are restored as Integer.
5455
*/
55-
@SuppressWarnings("unchecked")
5656
@Test
5757
public void keysString_valsIntegersBiggest32Bit_works() {
5858
FlexMapConverter converter = new StringFlexMapConverter();
@@ -90,7 +90,6 @@ public void keysString_valsLongBiggest32Bit_works() {
9090
/**
9191
* If at least one item is 64 bit wide, all integers are restored as Long.
9292
*/
93-
@SuppressWarnings("unchecked")
9493
@Test
9594
public void keysString_valsIntegersBiggest64Bit_works() {
9695
FlexMapConverter converter = new StringFlexMapConverter();
@@ -109,7 +108,6 @@ public void keysString_valsIntegersBiggest64Bit_works() {
109108
}
110109

111110
// Note: can't use assertEquals(map, map) as byte[] does not implement equals(obj).
112-
@SuppressWarnings("unchecked")
113111
@Test
114112
public void keysString_valsByteArray_works() {
115113
FlexMapConverter converter = new StringFlexMapConverter();
@@ -184,21 +182,24 @@ public void nestedList_works() {
184182
embeddedList1.add("Grüezi");
185183
embeddedList1.add(true);
186184
embeddedList1.add(-2L);
187-
// embeddedList1.add(1.3f);
185+
embeddedList1.add(1.3f);
188186
embeddedList1.add(-1.4d);
189187
map.put("Hello", embeddedList1);
190188
List<Object> embeddedList2 = new LinkedList<>();
191189
embeddedList2.add("Grüezi");
192190
embeddedList2.add(true);
193191
embeddedList2.add(-22L);
194-
// embeddedList2.add(2.3f);
192+
embeddedList2.add(2.3f);
195193
embeddedList2.add(-2.4d);
196194
map.put("💡", embeddedList2);
197-
convertAndBackThenAssert(map, converter);
195+
Map<String, List<Object>> restoredMap = convertAndBack(map, converter);
196+
// Java float is returned as double, so expect double.
197+
embeddedList1.set(3, (double) 1.3f);
198+
embeddedList2.set(3, (double) 2.3f);
199+
assertEquals(map, restoredMap);
198200
}
199201

200202
// Note: can't use assertEquals(map, map) as byte[] does not implement equals(obj).
201-
@SuppressWarnings("unchecked")
202203
@Test
203204
public void nestedListByteArray_works() {
204205
FlexMapConverter converter = new StringFlexMapConverter();
@@ -237,15 +238,14 @@ public void unsupportedValue_throws() {
237238
convertThenAssertThrows(map, converter);
238239
}
239240

240-
@SuppressWarnings({"rawtypes", "unchecked"})
241-
private Map convertAndBack(@Nullable Map expected, FlexMapConverter converter) {
242-
byte[] converted = converter.convertToDatabaseValue(expected);
241+
@SuppressWarnings("unchecked")
242+
private <K, V> Map<K, V> convertAndBack(@Nullable Map<K, V> expected, FlexMapConverter converter) {
243+
byte[] converted = converter.convertToDatabaseValue((Map<Object, Object>) expected);
243244

244-
return converter.convertToEntityProperty(converted);
245+
return (Map<K, V>) converter.convertToEntityProperty(converted);
245246
}
246247

247-
@SuppressWarnings({"rawtypes"})
248-
private void convertAndBackThenAssert(@Nullable Map expected, FlexMapConverter converter) {
248+
private <K, V> void convertAndBackThenAssert(@Nullable Map<K, V> expected, FlexMapConverter converter) {
249249
assertEquals(expected, convertAndBack(expected, converter));
250250
}
251251

0 commit comments

Comments
 (0)