aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStewart Stewart <stewinsalot@gmail.com>2017-02-24 05:48:00 -0500
committerStewart Stewart <stewinsalot@gmail.com>2017-02-24 05:48:00 -0500
commit55e374669634dd8a7d5b7c2abd549081c71b21f8 (patch)
treed3fc53af6c1b9897adb154e08f556baa713ba89e
parente800f430a3437c5b4b3dfc61740e211ee74a8abf (diff)
downloadslick-codegen-plugin-55e374669634dd8a7d5b7c2abd549081c71b21f8.tar.gz
slick-codegen-plugin-55e374669634dd8a7d5b7c2abd549081c71b21f8.tar.bz2
slick-codegen-plugin-55e374669634dd8a7d5b7c2abd549081c71b21f8.zip
separate typed key implementation
-rw-r--r--src/main/scala/TypedIdTable.scala48
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
+ }
+ }
+ }
+}