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 + " .");
}
}