private static long estimateArrayValue()

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());
    }
  }