Search in sources :

Example 1 with LIST

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));
    }
}
Also used : OriginalType(org.apache.parquet.schema.OriginalType) PrimitiveType(org.apache.parquet.schema.PrimitiveType) MessageType(org.apache.parquet.schema.MessageType) GroupType(org.apache.parquet.schema.GroupType) Type(org.apache.parquet.schema.Type) OriginalType(org.apache.parquet.schema.OriginalType) GroupType(org.apache.parquet.schema.GroupType) LIST(org.apache.parquet.schema.OriginalType.LIST) MessageType(org.apache.parquet.schema.MessageType)

Aggregations

GroupType (org.apache.parquet.schema.GroupType)1 MessageType (org.apache.parquet.schema.MessageType)1 OriginalType (org.apache.parquet.schema.OriginalType)1 LIST (org.apache.parquet.schema.OriginalType.LIST)1 PrimitiveType (org.apache.parquet.schema.PrimitiveType)1 Type (org.apache.parquet.schema.Type)1