diff options
author | Stewart Stewart <stewinsalot@gmail.com> | 2017-02-24 05:48:00 -0500 |
---|---|---|
committer | Stewart Stewart <stewinsalot@gmail.com> | 2017-02-24 05:48:00 -0500 |
commit | 55e374669634dd8a7d5b7c2abd549081c71b21f8 (patch) | |
tree | d3fc53af6c1b9897adb154e08f556baa713ba89e /src/main/scala/TypedIdTable.scala | |
parent | e800f430a3437c5b4b3dfc61740e211ee74a8abf (diff) | |
download | slick-codegen-plugin-55e374669634dd8a7d5b7c2abd549081c71b21f8.tar.gz slick-codegen-plugin-55e374669634dd8a7d5b7c2abd549081c71b21f8.tar.bz2 slick-codegen-plugin-55e374669634dd8a7d5b7c2abd549081c71b21f8.zip |
separate typed key implementation
Diffstat (limited to 'src/main/scala/TypedIdTable.scala')
-rw-r--r-- | src/main/scala/TypedIdTable.scala | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/main/scala/TypedIdTable.scala b/src/main/scala/TypedIdTable.scala new file mode 100644 index 0000000..b5c6056 --- /dev/null +++ b/src/main/scala/TypedIdTable.scala @@ -0,0 +1,48 @@ +import slick.codegen.SourceCodeGenerator +import slick.{model => m} + +class TypedIdSourceCodeGenerator( + model: m.Model, + idType: Option[String], + manualForeignKeys: Map[(String, String), (String, String)] +) extends SourceCodeGenerator(model) { + val manualReferences = SchemaParser.references(model, manualForeignKeys) + + def derefColumn(table: m.Table, + column: m.Column): (m.Table, m.Column) = { + val referencedColumn: Seq[(m.Table, m.Column)] = + table.foreignKeys + .filter(tableFk => tableFk.referencingColumns.forall(_ == column)) + .filter(columnFk => columnFk.referencedColumns.length == 1) + .flatMap(_.referencedColumns.map(c => + (model.tablesByName(c.table), c))) + assert(referencedColumn.distinct.length <= 1, referencedColumn) + + referencedColumn.headOption + .orElse(manualReferences.get((table.name.asString, column.name))) + .map((derefColumn _).tupled) + .getOrElse((table, column)) + } + + override def Table = new Table(_){ table => + override def Column = new Column(_) { column => + + def tableReferenceName(tableName: m.QualifiedName) = { + val schemaObjectName = tableName.schema.getOrElse("`public`") + val rowTypeName = entityName(tableName.table) + val idTypeName = idType.getOrElse("Id") + s"$idTypeName[$schemaObjectName.$rowTypeName]" + } + + override def rawType: String = { + // write key columns as Id types + val (referencedTable, referencedColumn) = + derefColumn(table.model, column.model) + if (referencedColumn.options.contains( + slick.ast.ColumnOption.PrimaryKey)) + tableReferenceName(referencedTable.name) + else super.rawType + } + } + } +} |