use of org.apache.parquet.schema.OriginalType.LIST in project presto by prestodb.
the class ParquetTypeVisitor method visit.
public static <T> T visit(Type type, ParquetTypeVisitor<T> visitor) {
if (type instanceof MessageType) {
return visitor.message((MessageType) type, visitFields(type.asGroupType(), visitor));
} else if (type.isPrimitive()) {
return visitor.primitive(type.asPrimitiveType());
} else {
// if not a primitive, the typeId must be a group
GroupType group = type.asGroupType();
OriginalType annotation = group.getOriginalType();
if (annotation == LIST) {
checkArgument(!group.isRepetition(REPEATED), "Invalid list: top-level group is repeated: " + group);
checkArgument(group.getFieldCount() == 1, "Invalid list: does not contain single repeated field: " + group);
GroupType repeatedElement = group.getFields().get(0).asGroupType();
checkArgument(repeatedElement.isRepetition(REPEATED), "Invalid list: inner group is not repeated");
checkArgument(repeatedElement.getFieldCount() <= 1, "Invalid list: repeated group is not a single field: " + group);
visitor.fieldNames.push(repeatedElement.getName());
try {
T elementResult = null;
if (repeatedElement.getFieldCount() > 0) {
elementResult = visitField(repeatedElement.getType(0), visitor);
}
return visitor.list(group, elementResult);
} finally {
visitor.fieldNames.pop();
}
} else if (annotation == MAP) {
checkArgument(!group.isRepetition(REPEATED), "Invalid map: top-level group is repeated: " + group);
checkArgument(group.getFieldCount() == 1, "Invalid map: does not contain single repeated field: " + group);
GroupType repeatedKeyValue = group.getType(0).asGroupType();
checkArgument(repeatedKeyValue.isRepetition(REPEATED), "Invalid map: inner group is not repeated");
checkArgument(repeatedKeyValue.getFieldCount() <= 2, "Invalid map: repeated group does not have 2 fields");
visitor.fieldNames.push(repeatedKeyValue.getName());
try {
T keyResult = null;
T valueResult = null;
if (repeatedKeyValue.getFieldCount() == 2) {
keyResult = visitField(repeatedKeyValue.getType(0), visitor);
valueResult = visitField(repeatedKeyValue.getType(1), visitor);
} else if (repeatedKeyValue.getFieldCount() == 1) {
Type keyOrValue = repeatedKeyValue.getType(0);
if (keyOrValue.getName().equalsIgnoreCase("key")) {
keyResult = visitField(keyOrValue, visitor);
// value result remains null
} else {
valueResult = visitField(keyOrValue, visitor);
// key result remains null
}
}
return visitor.map(group, keyResult, valueResult);
} finally {
visitor.fieldNames.pop();
}
}
return visitor.struct(group, visitFields(group, visitor));
}
}
Aggregations