public static int getFieldValueLength()

in asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/NonTaggedFormatUtil.java [112:211]


    public static int getFieldValueLength(byte[] serNonTaggedAObject, int offset, ATypeTag typeTag, boolean tagged)
            throws HyracksDataException {
        switch (typeTag) {
            case ANY:
                ATypeTag tag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(serNonTaggedAObject[offset]);
                if (tag == ATypeTag.ANY) {
                    throw new RuntimeDataException(ErrorCode.FIELD_SHOULD_BE_TYPED);
                }
                return getFieldValueLength(serNonTaggedAObject, offset, tag, true) + 1;
            case MISSING:
            case NULL:
                return 0;
            case BOOLEAN:
            case TINYINT:
                return 1;
            case SMALLINT:
                return 2;
            case INTEGER:
            case FLOAT:
            case DATE:
            case YEARMONTHDURATION:
                return 4;
            case TIME:
                return 4;
            case BIGINT:
            case DOUBLE:
            case DATETIME:
            case DAYTIMEDURATION:
                return 8;
            case DURATION:
                return 12;
            case POINT:
            case UUID:
                return 16;
            case INTERVAL:
                if (tagged) {
                    return AIntervalSerializerDeserializer.getIntervalLength(serNonTaggedAObject, offset + 1);
                } else {
                    return AIntervalSerializerDeserializer.getIntervalLength(serNonTaggedAObject, offset);
                }
            case POINT3D:
            case CIRCLE:
                return 24;
            case LINE:
            case RECTANGLE:
                return 32;
            case POLYGON:
                if (tagged) {
                    return AInt16SerializerDeserializer.getShort(serNonTaggedAObject, offset + 1) * 16 + 2;
                } else {
                    return AInt16SerializerDeserializer.getShort(serNonTaggedAObject, offset) * 16 + 2;
                }
            case STRING:
                if (tagged) {
                    int len = UTF8StringUtil.getUTFLength(serNonTaggedAObject, offset + 1);
                    return len + UTF8StringUtil.getNumBytesToStoreLength(len);
                } else {
                    int len = UTF8StringUtil.getUTFLength(serNonTaggedAObject, offset);
                    return len + UTF8StringUtil.getNumBytesToStoreLength(len);
                }
            case BINARY:
                if (tagged) {
                    int len = ByteArrayPointable.getContentLength(serNonTaggedAObject, offset + 1);
                    return len + ByteArrayPointable.getNumberBytesToStoreMeta(len);
                } else {
                    int len = ByteArrayPointable.getContentLength(serNonTaggedAObject, offset);
                    return len + ByteArrayPointable.getNumberBytesToStoreMeta(len);
                }
            case OBJECT:
                if (tagged) {
                    return ARecordSerializerDeserializer.getRecordLength(serNonTaggedAObject, offset + 1) - 1;
                } else {
                    return ARecordSerializerDeserializer.getRecordLength(serNonTaggedAObject, offset) - 1;
                }
            case ARRAY:
                if (tagged) {
                    return AOrderedListSerializerDeserializer.getOrderedListLength(serNonTaggedAObject, offset + 1) - 1;
                } else {
                    return AOrderedListSerializerDeserializer.getOrderedListLength(serNonTaggedAObject, offset) - 1;
                }
            case MULTISET:
                if (tagged) {
                    return AUnorderedListSerializerDeserializer.getUnorderedListLength(serNonTaggedAObject, offset + 1)
                            - 1;
                } else {
                    return AUnorderedListSerializerDeserializer.getUnorderedListLength(serNonTaggedAObject, offset) - 1;
                }
            case GEOMETRY:
                // Since Geometry is variable size, we store its size at the first 32 bits for efficiency
                // @see: STGeomFromTextDescriptor#createEvaluatorFactory, AGeometrySerializerDeserializer#serialize
                if (tagged) {
                    return AInt32SerializerDeserializer.getInt(serNonTaggedAObject, offset + 1) + 4;
                } else {
                    return AInt32SerializerDeserializer.getInt(serNonTaggedAObject, offset) + 4;
                }
            default:
                throw new NotImplementedException(
                        "No getLength implemented for a value of this type " + typeTag + " .");
        }
    }