in v1/src/main/java/com/google/cloud/teleport/spanner/spannerio/MutationSizeEstimator.java [143:216]
private static long estimateArrayValue(Value v) {
if (v.isNull()) {
return 0;
}
switch (v.getType().getArrayElementType().getCode()) {
case BOOL:
return v.getBoolArray().size();
case FLOAT32:
return 4L * v.getFloat32Array().size();
case INT64:
case ENUM:
return 8L * v.getInt64Array().size();
case FLOAT64:
return 8L * v.getFloat64Array().size();
case STRING:
case PG_NUMERIC:
long totalLength = 0;
for (String s : v.getStringArray()) {
if (s == null) {
continue;
}
totalLength += s.length();
}
return totalLength;
case BYTES:
case PROTO:
totalLength = 0;
for (ByteArray bytes : v.getBytesArray()) {
if (bytes == null) {
continue;
}
totalLength += bytes.length();
}
return totalLength;
case DATE:
return 12L * v.getDateArray().size();
case TIMESTAMP:
return 12L * v.getTimestampArray().size();
case NUMERIC:
totalLength = 0;
for (BigDecimal n : v.getNumericArray()) {
if (n == null) {
continue;
}
// see
// https://cloud.google.com/spanner/docs/working-with-numerics#handling_numeric_when_creating_a_client_library_or_driver
// Numeric/BigDecimal are stored in protos as String. It is likely that they
// are also stored in the Spanner database as String, so this gives an approximation for
// mutation value size.
totalLength += n.toString().length();
}
return totalLength;
case JSON:
totalLength = 0;
for (String s : v.getJsonArray()) {
if (s == null) {
continue;
}
totalLength += s.length();
}
return totalLength;
case PG_JSONB:
totalLength = 0;
for (String s : v.getPgJsonbArray()) {
if (s == null) {
continue;
}
totalLength += s.length();
}
return totalLength;
default:
throw new IllegalArgumentException("Unsupported type " + v.getType());
}
}