in holo-client/src/main/java/com/alibaba/hologres/client/model/Record.java [142:213]
private long getObjByteSize(int index, Object obj) {
if (obj == null) {
return 4;
}
long ret = 0;
Column column = schema.getColumnSchema()[index];
switch (column.getType()) {
case Types.BOOLEAN:
case Types.TINYINT:
case Types.BIT:
ret = 1;
break;
case Types.SMALLINT:
ret = 2;
break;
case Types.BIGINT:
case Types.DOUBLE:
ret = 8;
break;
case Types.TIMESTAMP:
case Types.TIME_WITH_TIMEZONE:
ret = 12;
break;
case Types.NUMERIC:
case Types.DECIMAL:
ret = 24;
break;
case Types.CHAR:
case Types.VARCHAR:
ret = String.valueOf(obj).length();
break;
case Types.ARRAY:
if (obj instanceof int[]) {
ret = ((int[]) obj).length * 4L;
} else if (obj instanceof long[]) {
ret = ((long[]) obj).length * 8L;
} else if (obj instanceof float[]) {
ret = ((float[]) obj).length * 4L;
} else if (obj instanceof double[]) {
ret = ((double[]) obj).length * 8L;
} else if (obj instanceof boolean[]) {
ret = ((boolean[]) obj).length;
} else if (obj instanceof String[]) {
ret = ArrayUtil.getArrayLength((String[]) obj);
} else if (obj instanceof Object[]) {
ret = ArrayUtil.getArrayLength((Object[]) obj, column.getTypeName());
} else if (obj instanceof List) {
ret = ArrayUtil.getArrayLength((List<?>) obj, column.getTypeName());
} else if (obj instanceof PgArray) {
ret = ArrayUtil.getArrayLength((PgArray) obj);
} else {
ret = 1024;
}
break;
default:
if ("json".equalsIgnoreCase(column.getTypeName()) || "jsonb".equalsIgnoreCase(column.getTypeName())) { // json, jsonb 等类型
ret = String.valueOf(obj).length();
break;
}
if (obj instanceof PGobject) { // PGmoney 等类型
PGobject pObj = (PGobject) obj;
if (pObj.getValue() != null) {
ret = pObj.getValue().length();
}
} else if (obj instanceof byte[]) { // RoaringBitmap, bytea 等类型
ret = ((byte[]) obj).length;
} else {
ret = 4;
}
}
return ret;
}