All Downloads are FREE. Search and download functionalities are using the official Maven repository.

tech.ydb.table.result.impl.ProtoValueReaders Maven / Gradle / Ivy

package tech.ydb.table.result.impl;

import java.util.Collection;
import java.util.Iterator;

import com.google.common.base.Preconditions;

import tech.ydb.proto.ValueProtos;
import tech.ydb.table.result.ResultSetReader;
import tech.ydb.table.result.ValueReader;


/**
 * @author Sergey Polovko
 */
public class ProtoValueReaders {
    private ProtoValueReaders() { }

    public static ResultSetReader forResultSet(ValueProtos.ResultSet resultSet) {
        return new ProtoResultSetReader(resultSet);
    }

    public static ResultSetReader forResultSets(Collection resultSets) {
        // TODO: add lightweight implementation instead of proto joining
        Preconditions.checkArgument(!resultSets.isEmpty(), "Expect multiple result sets to join from");

        Iterator iterator = resultSets.iterator();
        if (resultSets.size() == 1) {
            return castAsProtoReader(iterator.next());
        }
        ValueProtos.ResultSet.Builder builder = castAsProtoReader(iterator.next()).getResultSet().toBuilder();
        while (iterator.hasNext()) {
            ValueProtos.ResultSet resultSet = castAsProtoReader(iterator.next()).getResultSet();
            if (resultSet.getTruncated()) {
                builder.setTruncated(true);
            }
            builder.addAllRows(resultSet.getRowsList());
            // TODO: Check columns?
        }
        return new ProtoResultSetReader(builder.build());
    }

    public static ValueReader forType(ValueProtos.Type type) {
        return forTypeImpl(type);
    }

    static AbstractValueReader forTypeImpl(ValueProtos.Type type) {
        switch (type.getTypeCase()) {
            case TYPE_ID:
            case DECIMAL_TYPE:
                return new ProtoPrimitiveValueReader(type);
            case OPTIONAL_TYPE:
                return optionalReader(type);
            case TUPLE_TYPE:
                return tupleReader(type);
            case DICT_TYPE:
                return dictReader(type);
            case LIST_TYPE:
                return listReader(type);
            case STRUCT_TYPE:
                return structReader(type);
            case VARIANT_TYPE:
                return variantReader(type);
            case VOID_TYPE:
                return ProtoVoidValueReader.INSTANCE;
            case NULL_TYPE:
                return ProtoNullValueReader.INSTANCE;
            default:
                throw new IllegalStateException("unsupported type: " + type);
        }
    }

    private static AbstractValueReader variantReader(ValueProtos.Type type) {
        final ValueProtos.VariantType variantType = type.getVariantType();
        if (variantType.hasStructItems()) {
            ValueProtos.StructType structItems = variantType.getStructItems();
            AbstractValueReader[] itemReaders = new AbstractValueReader[structItems.getMembersCount()];
            for (int i = 0; i < structItems.getMembersCount(); i++) {
                itemReaders[i] = forTypeImpl(structItems.getMembers(i).getType());
            }
            return new ProtoVariantValueReader(type, itemReaders);
        }
        if (variantType.hasTupleItems()) {
            ValueProtos.TupleType tupleItems = variantType.getTupleItems();
            AbstractValueReader[] itemReaders = new AbstractValueReader[tupleItems.getElementsCount()];
            for (int i = 0; i < tupleItems.getElementsCount(); i++) {
                itemReaders[i] = forTypeImpl(tupleItems.getElements(i));
            }
            return new ProtoVariantValueReader(type, itemReaders);
        }
        throw new IllegalStateException("empty variant type");
    }

    private static AbstractValueReader structReader(ValueProtos.Type type) {
        final ValueProtos.StructType structType = type.getStructType();
        final int membersCount = structType.getMembersCount();

        AbstractValueReader[] memberReaders = new AbstractValueReader[membersCount];
        for (int i = 0; i < membersCount; i++) {
            memberReaders[i] = forTypeImpl(structType.getMembers(i).getType());
        }
        return new ProtoStructValueReader(type, memberReaders);
    }

    private static AbstractValueReader listReader(ValueProtos.Type type) {
        ValueProtos.ListType listType = type.getListType();
        return new ProtoListValueReader(type, forTypeImpl(listType.getItem()));
    }

    private static AbstractValueReader dictReader(ValueProtos.Type type) {
        ValueProtos.DictType dictType = type.getDictType();
        return new ProtoDictValueReader(type,
            forTypeImpl(dictType.getKey()),
            forTypeImpl(dictType.getPayload()));
    }

    private static AbstractValueReader optionalReader(ValueProtos.Type type) {
        ValueProtos.Type itemType = type.getOptionalType().getItem();
        switch (itemType.getTypeCase()) {
            case TYPE_ID:
            case DECIMAL_TYPE:
                return new ProtoPrimitiveValueReader.Optional(type);
            default:
                return new ProtoOptionalValueReader(type, forTypeImpl(itemType));
        }
    }

    private static AbstractValueReader tupleReader(ValueProtos.Type type) {
        final ValueProtos.TupleType tupleType = type.getTupleType();
        final int elementsCount = tupleType.getElementsCount();

        AbstractValueReader[] elementReaders = new AbstractValueReader[elementsCount];
        for (int i = 0; i < elementsCount; i++) {
            elementReaders[i] = forTypeImpl(tupleType.getElements(i));
        }
        return new ProtoTupleValueReader(type, elementReaders);
    }

    private static ProtoResultSetReader castAsProtoReader(ResultSetReader reader) {
        Preconditions.checkState(reader instanceof ProtoResultSetReader,
                "Expect %s class to join from resultSets", ProtoResultSetReader.class);
        return (ProtoResultSetReader) reader;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy