public static int buildRowToRowGroupOffset()

in tablestore/src/main/java/com/alicloud/openservices/tablestore/core/protocol/timeseries/TimeseriesProtocolBuilder.java [97:194]


    public static int buildRowToRowGroupOffset(TimeseriesRow row, FlatBufferBuilder fbb, String timeseriesTableName, Cache<String, Long> timeseriesMetaCache) {
        int fieldCount = row.getFields().size();
        byte[] fieldValueTypes = new byte[fieldCount];
        int[] fieldNameOffs = new int[fieldCount];
        int idx = 0;
        int longValueCount = 0;
        int boolValueCount = 0;
        int doubleValueCount = 0;
        int stringValueCount = 0;
        int binaryValueCount = 0;
        for (Map.Entry<String, ColumnValue> entry : row.getFields().entrySet()) {
            fieldNameOffs[idx] = fbb.createString(entry.getKey());
            switch (entry.getValue().getType()) {
                case INTEGER: {
                    fieldValueTypes[idx] = DataType.LONG;
                    longValueCount++;
                    break;
                }
                case BOOLEAN: {
                    fieldValueTypes[idx] = DataType.BOOLEAN;
                    boolValueCount++;
                    break;
                }
                case DOUBLE: {
                    fieldValueTypes[idx] = DataType.DOUBLE;
                    doubleValueCount++;
                    break;
                }
                case STRING: {
                    fieldValueTypes[idx] = DataType.STRING;
                    stringValueCount++;
                    break;
                }
                case BINARY: {
                    fieldValueTypes[idx] = DataType.BINARY;
                    binaryValueCount++;
                    break;
                }
                default:
                    throw new IllegalStateException();
            }
            idx++;
        }
        long[] longValues = new long[longValueCount];
        boolean[] boolValues = new boolean[boolValueCount];
        double[] doubleValues = new double[doubleValueCount];
        int[] strValueOffs = new int[stringValueCount];
        int[] binaryValueOffs = new int[binaryValueCount];
        longValueCount = 0;
        boolValueCount = 0;
        doubleValueCount = 0;
        stringValueCount = 0;
        binaryValueCount = 0;
        for (Map.Entry<String, ColumnValue> entry : row.getFields().entrySet()) {
            switch (entry.getValue().getType()) {
                case INTEGER: {
                    longValues[longValueCount++] = entry.getValue().asLong();
                    break;
                }
                case BOOLEAN: {
                    boolValues[boolValueCount++] = entry.getValue().asBoolean();
                    break;
                }
                case DOUBLE: {
                    doubleValues[doubleValueCount++] = entry.getValue().asDouble();
                    break;
                }
                case STRING: {
                    strValueOffs[stringValueCount++] = fbb.createString(entry.getValue().asString());
                    break;
                }
                case BINARY: {
                    binaryValueOffs[binaryValueCount++] = BytesValue.createBytesValue(fbb,
                            BytesValue.createValueVector(fbb, entry.getValue().asBinary()));
                    break;
                }
                default:
                    throw new IllegalStateException();
            }
        }
        int fieldValueOff = FieldValues.createFieldValues(fbb,
                longValueCount == 0 ? 0 : FieldValues.createLongValuesVector(fbb, longValues),
                boolValueCount == 0 ? 0 : FieldValues.createBoolValuesVector(fbb, boolValues),
                doubleValueCount == 0 ? 0 : FieldValues.createDoubleValuesVector(fbb, doubleValues),
                stringValueCount == 0 ? 0 : FieldValues.createStringValuesVector(fbb, strValueOffs),
                binaryValueCount == 0 ? 0 : FieldValues.createBinaryValuesVector(fbb, binaryValueOffs));
        int[] rowInGroupOffs = new int[1];
        Long updateTimeInSec = timeseriesMetaCache.getIfPresent(row.getTimeseriesKey().buildMetaCacheKey(timeseriesTableName));
        long updateTime = updateTimeInSec == null ? 0 : updateTimeInSec;
        rowInGroupOffs[0] = FlatBufferRowInGroup.createFlatBufferRowInGroup(fbb,
                row.getTimeseriesKey().getDataSource() == null ? fbb.createString("") : fbb.createString(row.getTimeseriesKey().getDataSource()),
                fbb.createString(""),
                row.getTimeInUs(), fieldValueOff, updateTime, buildTags(row.getTimeseriesKey().getTags(), fbb));
        return FlatBufferRowGroup.createFlatBufferRowGroup(fbb, fbb.createString(row.getTimeseriesKey().getMeasurementName()),
                FlatBufferRowGroup.createFieldNamesVector(fbb, fieldNameOffs),
                FlatBufferRowGroup.createFieldTypesVector(fbb, fieldValueTypes),
                FlatBufferRowGroup.createRowsVector(fbb, rowInGroupOffs));
    }