in seatunnel-api/src/main/java/org/apache/seatunnel/api/table/type/SeaTunnelRow.java [276:354]
private int getBytesForValue(Object v) {
if (v == null) {
return 0;
}
String clazz = v.getClass().getSimpleName();
switch (clazz) {
case "String":
return ((String) v).length();
case "Boolean":
case "Byte":
return 1;
case "Short":
return 2;
case "Integer":
case "Float":
return 4;
case "Long":
case "Double":
return 8;
case "BigDecimal":
return 36;
case "byte[]":
return ((byte[]) v).length;
case "LocalDate":
return 24;
case "LocalTime":
return 12;
case "LocalDateTime":
case "OffsetDateTime":
return 48;
case "String[]":
return getBytesForArray(v, BasicType.STRING_TYPE);
case "Boolean[]":
return getBytesForArray(v, BasicType.BOOLEAN_TYPE);
case "Byte[]":
return getBytesForArray(v, BasicType.BYTE_TYPE);
case "Short[]":
return getBytesForArray(v, BasicType.SHORT_TYPE);
case "Integer[]":
return getBytesForArray(v, BasicType.INT_TYPE);
case "Long[]":
return getBytesForArray(v, BasicType.LONG_TYPE);
case "Float[]":
return getBytesForArray(v, BasicType.FLOAT_TYPE);
case "Double[]":
return getBytesForArray(v, BasicType.DOUBLE_TYPE);
case "Map[]":
return getBytesForArray(
v, new MapType<>(BasicType.STRING_TYPE, BasicType.INT_TYPE));
case "HashMap":
case "LinkedHashMap":
int size = 0;
for (Map.Entry<?, ?> entry : ((Map<?, ?>) v).entrySet()) {
size += getBytesForValue(entry.getKey()) + getBytesForValue(entry.getValue());
}
return size;
case "HeapByteBuffer":
case "ByteBuffer":
return ((ByteBuffer) v).capacity();
case "SeaTunnelRow":
int rowSize = 0;
SeaTunnelRow row = (SeaTunnelRow) v;
for (int i = 0; i < row.fields.length; i++) {
rowSize += getBytesForValue(row.fields[i]);
}
return rowSize;
default:
if (v instanceof Map) {
int mapSize = 0;
for (Map.Entry<?, ?> entry : ((Map<?, ?>) v).entrySet()) {
mapSize +=
getBytesForValue(entry.getKey())
+ getBytesForValue(entry.getValue());
}
return mapSize;
}
throw new UnsupportedOperationException("Unsupported type: " + clazz);
}
}