in gobblin-compaction/src/main/java/org/apache/gobblin/compaction/mapreduce/orc/OrcUtils.java [126:198]
static boolean isEvolutionValid(TypeDescription fileType, TypeDescription readerType) {
boolean isOk = true;
if (fileType.getCategory() == readerType.getCategory()) {
switch (readerType.getCategory()) {
case BOOLEAN:
case BYTE:
case SHORT:
case INT:
case LONG:
case DOUBLE:
case FLOAT:
case STRING:
case TIMESTAMP:
case BINARY:
case DATE:
// these are always a match
break;
case CHAR:
case VARCHAR:
break;
case DECIMAL:
break;
case UNION:
case MAP:
case LIST: {
// these must be an exact match
List<TypeDescription> fileChildren = fileType.getChildren();
List<TypeDescription> readerChildren = readerType.getChildren();
if (fileChildren.size() == readerChildren.size()) {
for (int i = 0; i < fileChildren.size(); ++i) {
isOk &= isEvolutionValid(fileChildren.get(i), readerChildren.get(i));
}
return isOk;
} else {
return false;
}
}
case STRUCT: {
List<TypeDescription> readerChildren = readerType.getChildren();
List<TypeDescription> fileChildren = fileType.getChildren();
List<String> readerFieldNames = readerType.getFieldNames();
List<String> fileFieldNames = fileType.getFieldNames();
final Map<String, TypeDescription> fileTypesIdx = new HashMap();
for (int i = 0; i < fileFieldNames.size(); i++) {
final String fileFieldName = fileFieldNames.get(i);
fileTypesIdx.put(fileFieldName, fileChildren.get(i));
}
for (int i = 0; i < readerFieldNames.size(); i++) {
final String readerFieldName = readerFieldNames.get(i);
TypeDescription readerField = readerChildren.get(i);
TypeDescription fileField = fileTypesIdx.get(readerFieldName);
if (fileField == null) {
continue;
}
isOk &= isEvolutionValid(fileField, readerField);
}
return isOk;
}
default:
throw new IllegalArgumentException("Unknown type " + readerType);
}
return isOk;
} else {
/*
* Check for the few cases where will not convert....
*/
return ConvertTreeReaderFactory.canConvert(fileType, readerType);
}
}