in ingestion-core/src/main/java/com/mozilla/telemetry/ingestion/core/transform/PubsubMessageToObjectNode.java [584:610]
private void expandMapType(String jsonFieldName, ObjectNode value, Field field,
ObjectNode parent, ObjectNode additionalProperties) {
final ObjectNode props = additionalProperties == null ? null : Json.createObjectNode();
final Optional<Field> valueFieldOption;
if (field.getSubFields().size() == 2) {
valueFieldOption = Optional.of(field.getSubFields().get(1));
} else {
valueFieldOption = Optional.empty();
if (props != null) {
props.setAll(value);
}
}
final ArrayNode unmapped = Json.createArrayNode();
value.fields().forEachRemaining(e -> {
ObjectNode kv = Json.createObjectNode();
valueFieldOption
.ifPresent(valueField -> processField(e.getKey(), valueField, e.getValue(), kv, props));
// add key after processField so it can't be dropped due to e.getKey() matching
// FieldName.KEY when e.getValue() is null or empty or can't be coerced
unmapped.add(kv.put(FieldName.KEY, e.getKey()));
});
if (!Json.isNullOrEmpty(props)) {
additionalProperties.set(jsonFieldName, props);
}
parent.set(field.getName(), unmapped);
}