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