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

com.alicloud.openservices.tablestore.model.sql.SQLRowsFBsColumnBased Maven / Gradle / Ivy

Go to download

Aliyun Open Services SDK for Java Copyright (C) Alibaba Cloud Computing All rights reserved. 版权所有 (C)阿里云计算有限公司 http://www.aliyun.com

The newest version!
package com.alicloud.openservices.tablestore.model.sql;

import com.alicloud.openservices.tablestore.core.protocol.sql.flatbuffers.BytesValue;
import com.alicloud.openservices.tablestore.core.protocol.sql.flatbuffers.ColumnValues;
import com.alicloud.openservices.tablestore.core.protocol.sql.flatbuffers.DataType;
import com.alicloud.openservices.tablestore.core.protocol.sql.flatbuffers.RLEStringValues;
import com.alicloud.openservices.tablestore.core.protocol.sql.flatbuffers.SQLResponseColumn;
import com.alicloud.openservices.tablestore.core.protocol.sql.flatbuffers.SQLResponseColumns;
import com.alicloud.openservices.tablestore.core.protocol.sql.flatbuffers.LogicType;
import com.alicloud.openservices.tablestore.core.protocol.sql.flatbuffers.ComplexColumnTypeInfo;
import com.alicloud.openservices.tablestore.model.ColumnType;

import java.time.*;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Represents a dataset stored in columnar format using the Flatbuffers protocol.
 **/
public class SQLRowsFBsColumnBased implements SQLRows {

    private SQLTableMeta sqlTableMeta;

    private String[] columnNames;

    private byte[] columnTypes;

    private ColumnValues[] columnValues;

    private RLEStringValues[] rleStringValues;

    private ComplexColumnTypeInfo[] columnComplexTypeInfos;

    private long rowCount;

    private long columnCount;

    public SQLRowsFBsColumnBased(SQLResponseColumns columns) {
        this.columnNames = new String[columns.columnsLength()];
        this.columnTypes = new byte[columns.columnsLength()];
        this.columnValues = new ColumnValues[columns.columnsLength()];
        this.rleStringValues = new RLEStringValues[columns.columnsLength()];
        this.columnComplexTypeInfos = new ComplexColumnTypeInfo[columns.columnsLength()];
        for (int i = 0; i < columns.columnsLength(); i++) {
            SQLResponseColumn column = columns.columns(i);
            this.columnNames[i] = column.columnName();
            this.columnTypes[i] = column.columnType();
            this.columnValues[i] = column.columnValue();
            this.rleStringValues[i] = this.columnValues[i].rleStringValues();
            this.columnComplexTypeInfos[i] = column.columnComplexTypeInfo();
        }
        this.rowCount = columns.rowCount();
        this.columnCount = columns.columnsLength();
        this.sqlTableMeta = resolveSQLTableMetaFromColumns();
    }

    private SQLTableMeta resolveSQLTableMetaFromColumns() {
        List schema = new ArrayList();
        Map columnsMap = new HashMap();
        for (int i = 0; i < columnCount; i++) {
            schema.add(new SQLColumnSchema(columnNames[i], convertColumnType(columnTypes[i],this.columnComplexTypeInfos[i].columnLogicType())));
            columnsMap.put(columnNames[i], i);
        }
        return new SQLTableMeta(schema, columnsMap);
    }

    private ColumnType convertColumnType(byte columnType,byte logicType) {
        switch (columnType) {
            case DataType.LONG:
                return ColumnType.INTEGER;
            case DataType.BOOLEAN:
                return ColumnType.BOOLEAN;
            case DataType.DOUBLE:
                return ColumnType.DOUBLE;
            case DataType.STRING:
            case DataType.STRING_RLE:
                return ColumnType.STRING;
            case DataType.BINARY:
                return ColumnType.BINARY;
            case DataType.COMPLEX:
                switch (logicType) {
                	case LogicType.DATETIME:
                			return ColumnType.DATETIME;
                	case LogicType.TIME:
                			return ColumnType.TIME;
                	case LogicType.DATE:
                			return ColumnType.DATE;
                	default:
                        throw new UnsupportedOperationException("not supported Logic type in flatbuffers: " + logicType);
                	}

            default:
                throw new UnsupportedOperationException("not supported column type in flatbuffers: " + columnType);
        }
    }

    @Override
    public SQLTableMeta getSQLTableMeta() {
        return sqlTableMeta;
    }

    @Override
    public long rowCount() {
        return rowCount;
    }

    @Override
    public long columnCount() {
        return columnCount;
    }

    @Override
    public Object get(int rowIndex, int columnIndex) {
        if (rowIndex >= rowCount() || rowIndex < 0) {
            throw new IllegalStateException("Row index " + columnIndex + " out of range");
        }
        if (columnIndex >= columnCount || columnIndex < 0) {
            throw new IllegalStateException("Column index " + columnIndex + " out of range");
        }
        byte columnType = columnTypes[columnIndex];
        byte logicType = columnComplexTypeInfos[columnIndex].columnLogicType();
        byte encodingType = columnComplexTypeInfos[columnIndex].columnEncodeType();
        ColumnValues columnValue = columnValues[columnIndex];
        switch (columnType) {
            case DataType.LONG:
                if (columnValue.isNullvalues(rowIndex)) {
                    return null;
                } else {
                    return columnValue.longValues(rowIndex);
                }
            case DataType.BOOLEAN:
                if (columnValue.isNullvalues(rowIndex)) {
                    return null;
                } else {
                    return columnValue.boolValues(rowIndex);
                }
            case DataType.DOUBLE:
                if (columnValue.isNullvalues(rowIndex)) {
                    return null;
                } else {
                    return columnValue.doubleValues(rowIndex);
                }
            case DataType.STRING:
                if (columnValue.isNullvalues(rowIndex)) {
                    return null;
                } else {
                    return columnValue.stringValues(rowIndex);
                }
            case DataType.BINARY:
                if (columnValue.isNullvalues(rowIndex)) {
                    return null;
                } else {
                    BytesValue bytesValue = columnValue.binaryValues(rowIndex);
                    return bytesValue.valueAsByteBuffer().duplicate();
                }
            case DataType.STRING_RLE:
                if (columnValue.isNullvalues(rowIndex)) {
                    return null;
                } else {
                    RLEStringValues rleStringValue = rleStringValues[columnIndex];
                    return resolveRLEString(rleStringValue, rowIndex);
                }
            case DataType.COMPLEX:
                switch (logicType) {
                    case LogicType.DATETIME:
                        if(encodingType != DataType.LONG){
                            throw new UnsupportedOperationException("encoding Type need to be: " + DataType.LONG +" , but get: " + encodingType);
                        }
                        if (columnValue.isNullvalues(rowIndex)) {
                            return null;
                        } else {
                            return resolveDateTime(columnValue.longValues(rowIndex));
                        }
                    case LogicType.TIME:
                        if(encodingType != DataType.LONG){
                            throw new UnsupportedOperationException("encoding Type need to be: " + DataType.LONG +" , but get: " + encodingType);
                        }
                        if (columnValue.isNullvalues(rowIndex)) {
                            return null;
                        } else {
                            return resolveTime(columnValue.longValues(rowIndex));
                        }
                    case LogicType.DATE:
                        if(encodingType != DataType.LONG){
                            throw new UnsupportedOperationException("encoding Type need to be: " + DataType.LONG +" , but get: " + encodingType);
                        }
                        if (columnValue.isNullvalues(rowIndex)) {
                            return null;
                        } else {
                            return resolveDate(columnValue.longValues(rowIndex));
                        }
                    default:
                        throw new UnsupportedOperationException("not supported Logic type in flatbuffers: " + logicType);
                }
            default:
                throw new UnsupportedOperationException("not supported column type in flatbuffers: " + columnType);
        }
    }

    private String resolveRLEString(RLEStringValues rleStringValue, int rowIndex) {
        return rleStringValue.array(rleStringValue.indexMapping(rowIndex));
    }

    private ZonedDateTime resolveDateTime(long ts) {
        return Instant.ofEpochSecond(ts / 1000000, (int) (ts % 1000000) * 1000).atZone(ZoneOffset.UTC);
    }

    private Duration resolveTime(long nanos) {
        return Duration.ofNanos(nanos);
    }

    private LocalDate resolveDate(long ts) {
        return Instant.ofEpochSecond(ts)
                .atZone(ZoneOffset.UTC)
                .toLocalDate();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy