in src/main/java/com/epam/eco/commons/avro/avpath/AvPath.java [114:158]
private List<PathTemplate> bildPathTemplates(Schema schema) {
List<PathTemplate> finalPathTemplates = new ArrayList<>();
Map<String, List<PathTemplate>> templatesBySchemaPaths = new HashMap<>();
new SchemaTraverser(
new SchemaTraverseListener() {
@Override
public void onSchemaField(String path, Schema parentSchema, Field field) {
int sepIdx = path.lastIndexOf('.');
String prefixPath = sepIdx > 0 ? path.substring(0, sepIdx) : null;
List<PathTemplate> prefixPathTemplates =
prefixPath != null ?
templatesBySchemaPaths.get(prefixPath) :
Collections.singletonList(EMPTY_PATH_TEMPLATE);
List<PathTemplate> fieldPathTemplates =
buildPathTemplatesForPath(field.name(), field.schema());
List<PathTemplate> pathTemplates = new ArrayList<>();
for (PathTemplate prefixPathTemplate : prefixPathTemplates) {
for (PathTemplate fieldPathTemplate : fieldPathTemplates) {
PathTemplate pathTemplate = prefixPathTemplate.join(fieldPathTemplate);
if (pathTemplate.getSchema().getType() == Type.RECORD) {
pathTemplates.add(pathTemplate);
} else {
finalPathTemplates.add(pathTemplate);
}
}
}
templatesBySchemaPaths.put(path, pathTemplates);
}
@Override
public void onSchema(String path, Schema parentSchema, Schema schema) {
}
}).walk(schema);
return Stream.concat(
finalPathTemplates.stream(),
templatesBySchemaPaths.values().stream().
flatMap(Collection::stream)).
sorted().
collect(Collectors.collectingAndThen(
Collectors.toList(),
Collections::unmodifiableList));
}