in src/main/java/com/google/cloud/spanner/pgadapter/utils/MutationWriter.java [459:545]
static int calculateSize(Mutation mutation) {
int size = 0;
for (Value value : mutation.getValues()) {
if (value.isNull()) {
size++;
continue;
}
switch (value.getType().getCode()) {
case BOOL:
size++;
break;
case FLOAT32:
size += 4;
break;
case FLOAT64:
case INT64:
size += 8;
break;
case PG_NUMERIC:
size += value.getString().length();
break;
case STRING:
case PG_JSONB:
// Assume four bytes per character to be on the safe side.
size += value.getString().length() * 4;
break;
case BYTES:
size += value.getBytes().length();
break;
case TIMESTAMP:
size += 30;
break;
case DATE:
size += 10;
break;
case ARRAY:
switch (value.getType().getArrayElementType().getCode()) {
case BOOL:
size += value.getBoolArray().size();
break;
case FLOAT32:
size += value.getFloat32Array().size() * 4;
break;
case FLOAT64:
size += value.getFloat64Array().size() * 8;
break;
case INT64:
size += value.getInt64Array().size() * 8;
break;
case PG_NUMERIC:
for (String s : value.getStringArray()) {
size += s == null ? 8 : s.length();
}
break;
case PG_JSONB:
case STRING:
for (String s : value.getStringArray()) {
size += s == null ? 8 : s.length() * 4;
}
break;
case BYTES:
for (ByteArray b : value.getBytesArray()) {
size += b == null ? 8 : b.length();
}
break;
case TIMESTAMP:
size += value.getTimestampArray().size() * 30;
break;
case DATE:
size += value.getDateArray().size() * 10;
break;
case ARRAY:
case NUMERIC:
case JSON:
case STRUCT:
break;
}
break;
case NUMERIC:
case JSON:
case STRUCT:
break;
}
}
return size;
}