private Schema avroType()

in v1/src/main/java/com/google/cloud/teleport/spanner/DdlToAvroSchemaConverter.java [475:540]


  private Schema avroType(
      com.google.cloud.teleport.spanner.common.Type spannerType, String structSuffix) {
    LOG.info("avroType type={} suffix={}", spannerType.toString(), structSuffix);
    switch (spannerType.getCode()) {
      case BOOL:
      case PG_BOOL:
        return SchemaBuilder.builder().booleanType();
      case INT64:
      case PG_INT8:
      case ENUM:
        return SchemaBuilder.builder().longType();
      case FLOAT32:
      case PG_FLOAT4:
        return SchemaBuilder.builder().floatType();
      case FLOAT64:
      case PG_FLOAT8:
        return SchemaBuilder.builder().doubleType();
      case PG_TEXT:
      case PG_VARCHAR:
      case STRING:
      case DATE:
      case PG_DATE:
      case JSON:
      case PG_JSONB:
        return SchemaBuilder.builder().stringType();
      case UUID:
      case PG_UUID:
        return LogicalTypes.uuid().addToSchema(SchemaBuilder.builder().stringType());
      case BYTES:
      case PG_BYTEA:
      case PROTO:
      case TOKENLIST:
      case PG_SPANNER_TOKENLIST:
        return SchemaBuilder.builder().bytesType();
      case TIMESTAMP:
      case PG_TIMESTAMPTZ:
      case PG_SPANNER_COMMIT_TIMESTAMP:
        return shouldExportTimestampAsLogicalType
            ? LogicalTypes.timestampMicros().addToSchema(SchemaBuilder.builder().longType())
            : SchemaBuilder.builder().stringType();
      case NUMERIC:
        return LogicalTypes.decimal(NumericUtils.PRECISION, NumericUtils.SCALE)
            .addToSchema(SchemaBuilder.builder().bytesType());
      case PG_NUMERIC:
        return LogicalTypes.decimal(NumericUtils.PG_MAX_PRECISION, NumericUtils.PG_MAX_SCALE)
            .addToSchema(SchemaBuilder.builder().bytesType());
      case ARRAY:
      case PG_ARRAY:
        Schema avroItemsType = avroType(spannerType.getArrayElementType(), structSuffix);
        return SchemaBuilder.builder().array().items().type(wrapAsNullable(avroItemsType));
      case STRUCT:
        SchemaBuilder.FieldAssembler<Schema> fields =
            SchemaBuilder.builder().record("struct_" + structSuffix).fields();
        int fieldCounter = 0;
        for (com.google.cloud.teleport.spanner.common.Type.StructField structField :
            spannerType.getStructFields()) {
          fields
              .name(structField.getName())
              .type(avroType(structField.getType(), structSuffix + "_" + fieldCounter++))
              .noDefault();
        }
        return fields.endRecord();
      default:
        throw new IllegalArgumentException("Unknown spanner type " + spannerType);
    }
  }