Search in sources :

Example 1 with MetacatJsonLocator

use of com.netflix.metacat.common.json.MetacatJsonLocator in project metacat by Netflix.

the class ConnectorTypeConverter method fromMetacatTypeToJson.

/**
 * Converts from Metacat type to JSON format.
 * @param type type
 * @return Type in JSON format
 */
default JsonNode fromMetacatTypeToJson(Type type) {
    final MetacatJsonLocator json = new MetacatJsonLocator();
    JsonNode result = null;
    final TypeEnum base = type.getTypeSignature().getBase();
    if (!base.isParametricType()) {
        result = new TextNode(fromMetacatType(type));
    } else if (type instanceof DecimalType || type instanceof CharType || type instanceof VarcharType || type instanceof VarbinaryType) {
        final ObjectNode node = json.emptyObjectNode();
        final String typeText = fromMetacatType(type);
        final int index = typeText.indexOf('(');
        if (index == -1) {
            node.put("type", typeText);
        } else {
            node.put("type", typeText.substring(0, index));
            if (type instanceof DecimalType) {
                node.put("precision", ((DecimalType) type).getPrecision());
                node.put("scale", ((DecimalType) type).getScale());
            } else if (type instanceof CharType) {
                node.put("length", ((CharType) type).getLength());
            } else if (type instanceof VarcharType) {
                node.put("length", ((VarcharType) type).getLength());
            } else {
                node.put("length", ((VarbinaryType) type).getLength());
            }
        }
        result = node;
    } else if (base.equals(TypeEnum.MAP)) {
        final MapType mapType = (MapType) type;
        final ObjectNode node = json.emptyObjectNode();
        node.put("type", TypeEnum.MAP.getType());
        node.set("keyType", fromMetacatTypeToJson(mapType.getKeyType()));
        node.set("valueType", fromMetacatTypeToJson(mapType.getValueType()));
        result = node;
    } else if (base.equals(TypeEnum.ROW)) {
        final RowType rowType = (RowType) type;
        final ObjectNode node = json.emptyObjectNode();
        final ArrayNode fieldsNode = node.arrayNode();
        rowType.getFields().forEach(f -> {
            final ObjectNode fieldNode = json.emptyObjectNode();
            fieldNode.put("name", f.getName());
            fieldNode.set("type", fromMetacatTypeToJson(f.getType()));
            fieldsNode.add(fieldNode);
        });
        node.put("type", TypeEnum.ROW.getType());
        node.set("fields", fieldsNode);
        result = node;
    } else if (base.equals(TypeEnum.ARRAY)) {
        final ObjectNode node = json.emptyObjectNode();
        node.put("type", TypeEnum.ARRAY.getType());
        ((ParametricType) type).getParameters().stream().findFirst().ifPresent(t -> node.set("elementType", fromMetacatTypeToJson(t)));
        result = node;
    }
    return result;
}
Also used : DecimalType(com.netflix.metacat.common.type.DecimalType) VarbinaryType(com.netflix.metacat.common.type.VarbinaryType) Type(com.netflix.metacat.common.type.Type) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) TextNode(com.fasterxml.jackson.databind.node.TextNode) ArrayNode(com.fasterxml.jackson.databind.node.ArrayNode) MetacatJsonLocator(com.netflix.metacat.common.json.MetacatJsonLocator) CharType(com.netflix.metacat.common.type.CharType) VarcharType(com.netflix.metacat.common.type.VarcharType) JsonNode(com.fasterxml.jackson.databind.JsonNode) RowType(com.netflix.metacat.common.type.RowType) TypeEnum(com.netflix.metacat.common.type.TypeEnum) MapType(com.netflix.metacat.common.type.MapType) ParametricType(com.netflix.metacat.common.type.ParametricType) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) VarcharType(com.netflix.metacat.common.type.VarcharType) RowType(com.netflix.metacat.common.type.RowType) JsonNode(com.fasterxml.jackson.databind.JsonNode) TextNode(com.fasterxml.jackson.databind.node.TextNode) MetacatJsonLocator(com.netflix.metacat.common.json.MetacatJsonLocator) MapType(com.netflix.metacat.common.type.MapType) VarbinaryType(com.netflix.metacat.common.type.VarbinaryType) TypeEnum(com.netflix.metacat.common.type.TypeEnum) DecimalType(com.netflix.metacat.common.type.DecimalType) CharType(com.netflix.metacat.common.type.CharType) ArrayNode(com.fasterxml.jackson.databind.node.ArrayNode)

Aggregations

JsonNode (com.fasterxml.jackson.databind.JsonNode)1 ArrayNode (com.fasterxml.jackson.databind.node.ArrayNode)1 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)1 TextNode (com.fasterxml.jackson.databind.node.TextNode)1 MetacatJsonLocator (com.netflix.metacat.common.json.MetacatJsonLocator)1 CharType (com.netflix.metacat.common.type.CharType)1 DecimalType (com.netflix.metacat.common.type.DecimalType)1 MapType (com.netflix.metacat.common.type.MapType)1 ParametricType (com.netflix.metacat.common.type.ParametricType)1 RowType (com.netflix.metacat.common.type.RowType)1 Type (com.netflix.metacat.common.type.Type)1 TypeEnum (com.netflix.metacat.common.type.TypeEnum)1 VarbinaryType (com.netflix.metacat.common.type.VarbinaryType)1 VarcharType (com.netflix.metacat.common.type.VarcharType)1