Skip to content

Commit bdf25d1

Browse files
committed
support structs in schema
1 parent 33a6f30 commit bdf25d1

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

Diff for: codegen/src/main/scala/dbcodegen/DataSchema.scala

+14
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,20 @@ case class DataEnum(
4141
def scalaName = NameFormat.sanitizeScalaName(NameFormat.toPascalCase(name))
4242
}
4343

44+
case class DataStructMember(
45+
name: String,
46+
scalaType: String,
47+
) {
48+
def scalaName = NameFormat.sanitizeScalaName(NameFormat.toCamelCase(name))
49+
}
50+
51+
case class DataStruct(
52+
name: String,
53+
member: Seq[DataStructMember],
54+
) {
55+
def scalaName = NameFormat.sanitizeScalaName(NameFormat.toPascalCase(name))
56+
}
57+
4458
case class DataSchema(
4559
name: String,
4660
tables: Seq[DataTable],

Diff for: codegen/src/main/scala/dbcodegen/SchemaConverter.scala

+14-9
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ object SchemaConverter {
7272
): (String, Option[DataEnum]) = {
7373
val tpe = column.getColumnDataType
7474

75+
val structAttributes = tpe.getAttributes.asScala
7576
val (enumValues, arrayElementType) = (tpe.getJavaSqlType.getVendorTypeNumber.intValue(), tpe.getName) match {
7677
// TODO: specific to Postgres
7778
// we want to get type information for enums that are used in arrays.
@@ -86,24 +87,28 @@ object SchemaConverter {
8687
val schemaRetrievalOptions = SchemaCrawlerUtility.matchSchemaRetrievalOptions(connection)
8788
val enumType = schemaRetrievalOptions.getEnumDataTypeHelper.getEnumDataTypeInfo(column, columnDataType, conn)
8889
connection.releaseConnection(conn)
89-
(enumType.getEnumValues, Some(elementType))
90+
(enumType.getEnumValues.asScala, Some(elementType))
9091
case (_, _) =>
91-
(tpe.getEnumValues, None)
92+
(tpe.getEnumValues.asScala, None)
9293
}
9394

94-
val (baseScalaType, dataEnum) = enumValues match {
95-
case enumValues if enumValues.isEmpty =>
95+
val (baseScalaType, dataEnum, dataStruct) = {
96+
if (structAttributes.nonEmpty) {
97+
("", None, None)
98+
} else if (enumValues.nonEmpty) {
99+
val targetTypeName = arrayElementType.getOrElse(tpe.getName)
100+
val dataEnum = DataEnum(targetTypeName, enumValues.map(DataEnumValue(_)).toSeq)
101+
(dataEnum.scalaName, Some(dataEnum), None)
102+
} else {
96103
val targetType =
97104
arrayElementType.flatMap(localTypeNameToSqlType).orElse(localTypeNameToSqlType(tpe.getName)).getOrElse(tpe.getJavaSqlType)
105+
98106
val scalaTypeClassGuess = sqlToScalaType(targetType)
99107
val scalaTypeStringGuess = scalaTypeClassGuess.map(_.toString.replaceFirst("java\\.lang\\.", ""))
100108
val scalaTypeStringMapped = config.typeMapping(targetType, scalaTypeStringGuess)
101109
val scalaTypeString = scalaTypeStringMapped.getOrElse(throw new Exception(s"Cannot map sql type '${targetType}'"))
102-
(scalaTypeString, None)
103-
case enumValues =>
104-
val targetTypeName = arrayElementType.getOrElse(tpe.getName)
105-
val dataEnum = DataEnum(targetTypeName, enumValues.asScala.map(DataEnumValue(_)).toSeq)
106-
(dataEnum.scalaName, Some(dataEnum))
110+
(scalaTypeString, None, None)
111+
}
107112
}
108113

109114
val scalaTypeWithArray = if (arrayElementType.isDefined) s"Vector[${baseScalaType}]" else baseScalaType

0 commit comments

Comments
 (0)