Skip to content

Commit 6490e82

Browse files
Add item ordering in record value mapper
1 parent f4f65b4 commit 6490e82

File tree

2 files changed

+72
-12
lines changed

2 files changed

+72
-12
lines changed

contrib/src/main/java/gov/nasa/jpl/aerie/contrib/serialization/mappers/RecordValueMapper.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.lang.reflect.Constructor;
99
import java.lang.reflect.InvocationTargetException;
1010
import java.lang.reflect.RecordComponent;
11+
import java.util.ArrayList;
1112
import java.util.Arrays;
1213
import java.util.HashMap;
1314
import java.util.HashSet;
@@ -36,11 +37,15 @@ public record Component<R, T>(
3637
@Override
3738
public ValueSchema getValueSchema() {
3839
final var valueSchemas = new HashMap<String, ValueSchema>();
40+
final var metadata = new ArrayList<SerializedValue>();
3941
for (final var component : this.components) {
42+
metadata.add(SerializedValue.of(component.name));
4043
valueSchemas.put(component.name,
4144
component.mapper.getValueSchema());
4245
}
43-
return ValueSchema.ofStruct(valueSchemas);
46+
return components.isEmpty() ?
47+
ValueSchema.ofStruct(valueSchemas) :
48+
ValueSchema.withMeta("item_order", SerializedValue.of(metadata), ValueSchema.ofStruct(valueSchemas));
4449
}
4550

4651
@Override

contrib/src/test/java/gov/nasa/jpl/aerie/contrib/serialization/mappers/RecordValueMapperTest.java

Lines changed: 66 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ record EmptyRecord() {}
1616
record StringRecord(String aString) {}
1717

1818
record MultiValueRecord(String aString, Map<String, List<Boolean>> fancy) {}
19+
record NestedMultiValueRecord(String aString, Map<String, List<Boolean>> fancy, MultiValueRecord record) {}
1920

2021
@Test
2122
void getValueSchema_emptyRecord() {
@@ -32,12 +33,16 @@ void getValueSchema_stringRecord() {
3233
StringRecord::aString,
3334
new StringValueMapper()
3435
))).getValueSchema();
35-
assertEquals(ValueSchema.ofStruct(Map.of("aString", ValueSchema.STRING)), valueSchema);
36+
assertEquals(ValueSchema.withMeta(
37+
"item_order",
38+
SerializedValue.of(List.of(SerializedValue.of("aString"))),
39+
ValueSchema.ofStruct(Map.of("aString", ValueSchema.STRING))),
40+
valueSchema);
41+
3642
}
3743

38-
@Test
39-
void getValueSchema_multiValueRecord() {
40-
final var valueSchema = new RecordValueMapper<>(
44+
final RecordValueMapper<MultiValueRecord> getMultiValueRecordValueSchema() {
45+
return new RecordValueMapper<>(
4146
MultiValueRecord.class,
4247
List.of(
4348
new RecordValueMapper.Component<>(
@@ -49,15 +54,65 @@ void getValueSchema_multiValueRecord() {
4954
"fancy",
5055
MultiValueRecord::fancy,
5156
new MapValueMapper<>(new StringValueMapper(), new ListValueMapper<>(new BooleanValueMapper()))
57+
)));
58+
}
59+
60+
@Test
61+
void getValueSchema_multiValueRecord() {
62+
final var valueSchema = getMultiValueRecordValueSchema();
63+
assertEquals(
64+
ValueSchema.withMeta(
65+
"item_order",
66+
SerializedValue.of(List.of(SerializedValue.of("aString"), SerializedValue.of("fancy"))),
67+
ValueSchema.ofStruct(Map.of(
68+
"aString", ValueSchema.STRING,
69+
"fancy", ValueSchema.ofSeries(ValueSchema.ofStruct(Map.of(
70+
"key", ValueSchema.STRING,
71+
"value", ValueSchema.ofSeries(ValueSchema.BOOLEAN))))))),
72+
valueSchema);
73+
}
74+
75+
@Test
76+
void getValueSchema_nested() {
77+
final var valueSchema = new RecordValueMapper<>(
78+
NestedMultiValueRecord.class,
79+
List.of(
80+
new RecordValueMapper.Component<>(
81+
"aString",
82+
NestedMultiValueRecord::aString,
83+
new StringValueMapper()
84+
),
85+
new RecordValueMapper.Component<>(
86+
"fancy",
87+
NestedMultiValueRecord::fancy,
88+
new MapValueMapper<>(new StringValueMapper(), new ListValueMapper<>(new BooleanValueMapper()))
89+
),
90+
new RecordValueMapper.Component<>(
91+
"record",
92+
NestedMultiValueRecord::record,
93+
getMultiValueRecordValueSchema()
5294
))).getValueSchema();
53-
assertEquals(ValueSchema.ofStruct(Map.of(
54-
"aString", ValueSchema.STRING,
55-
"fancy", ValueSchema.ofSeries(
95+
assertEquals(
96+
ValueSchema.withMeta(
97+
"item_order",
98+
SerializedValue.of(List.of(
99+
SerializedValue.of("aString"),
100+
SerializedValue.of("fancy"),
101+
SerializedValue.of("record"))),
56102
ValueSchema.ofStruct(Map.of(
57-
"key", ValueSchema.STRING,
58-
"value", ValueSchema.ofSeries(ValueSchema.BOOLEAN)
59-
))
60-
))), valueSchema);
103+
"aString", ValueSchema.STRING,
104+
"fancy", ValueSchema.ofSeries(ValueSchema.ofStruct(Map.of(
105+
"key", ValueSchema.STRING,
106+
"value", ValueSchema.ofSeries(ValueSchema.BOOLEAN)))),
107+
"record", ValueSchema.withMeta(
108+
"item_order",
109+
SerializedValue.of(List.of(SerializedValue.of("aString"), SerializedValue.of("fancy"))),
110+
ValueSchema.ofStruct(Map.of(
111+
"aString", ValueSchema.STRING,
112+
"fancy", ValueSchema.ofSeries(ValueSchema.ofStruct(Map.of(
113+
"key", ValueSchema.STRING,
114+
"value", ValueSchema.ofSeries(ValueSchema.BOOLEAN)))))))))),
115+
valueSchema);
61116
}
62117

63118
@Test

0 commit comments

Comments
 (0)