Skip to content

Commit

Permalink
Add support for generating code without schema reference with supplyi…
Browse files Browse the repository at this point in the history
…ng `SchemaMode` (Experimental, fixes #123) (#126)
  • Loading branch information
oyvindberg authored Jul 25, 2024
1 parent 098a1bc commit f21078a
Show file tree
Hide file tree
Showing 30 changed files with 605 additions and 52 deletions.
2 changes: 1 addition & 1 deletion sql/custom/domains.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
SELECT nsp.nspname as "schema",
SELECT nsp.nspname as "schema?",
typ.typname as "name",
tt.typname as "type",
pc.collname as "collation",
Expand Down
2 changes: 1 addition & 1 deletion sql/custom/enums.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
select n.nspname as enum_schema,
select n.nspname as "enum_schema?",
t.typname as enum_name,
e.enumsortorder as enum_sort_order,
e.enumlabel as enum_value
Expand Down
2 changes: 1 addition & 1 deletion sql/custom/table_comments.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
SELECT n.nspname as schema,
SELECT n.nspname as "schema?",
c.relname as name,
pg_catalog.obj_description(c.oid, 'pg_class') as description
FROM pg_catalog.pg_class c
Expand Down
2 changes: 1 addition & 1 deletion typo-scripts/src/scala/scripts/CompileBenchmark.scala
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ object CompileBenchmark extends BleepScript("CompileBenchmark") {

override def run(started: Started, commands: Commands, args: List[String]): Unit = {
val ds = TypoDataSource.hikari(server = "localhost", port = 6432, databaseName = "Adventureworks", username = "postgres", password = "password")
val metadb = Await.result(MetaDb.fromDb(logger = TypoLogger.Noop, ds = ds, viewSelector = Selector.All), Duration.Inf)
val metadb = Await.result(MetaDb.fromDb(logger = TypoLogger.Noop, ds = ds, viewSelector = Selector.All, schemaMode = SchemaMode.MultiSchema), Duration.Inf)
val sqlFiles = Await.result(readSqlFileDirectories(TypoLogger.Noop, buildDir.resolve("adventureworks_sql"), ds), Duration.Inf)

val crossIds = List(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ object GeneratedAdventureWorks {
val ds = TypoDataSource.hikari(server = "localhost", port = 6432, databaseName = "Adventureworks", username = "postgres", password = "password")
val scriptsPath = buildDir.resolve("adventureworks_sql")
val selector = Selector.ExcludePostgresInternal
val metadb = Await.result(MetaDb.fromDb(TypoLogger.Console, ds, selector), Duration.Inf)
val metadb = Await.result(MetaDb.fromDb(TypoLogger.Console, ds, selector, schemaMode = SchemaMode.MultiSchema), Duration.Inf)

val variants = List(
(DbLibName.Anorm, JsonLibName.PlayJson, "typo-tester-anorm", new AtomicReference(Map.empty[RelPath, sc.Code])),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,8 @@ case class ConstraintsSqlRow(
/** Points to [[information_schema.table_constraints.TableConstraintsViewRow.constraintName]]
debug: {"baseColumnName":"constraint_name","baseRelationName":"information_schema.table_constraints","columnClassName":"java.lang.String","columnDisplaySize":2147483647,"parsedColumnName":{"name":"constraint_name","originalName":"constraint_name"},"columnName":"constraint_name","columnType":"VarChar","columnTypeName":"name","format":0,"isAutoIncrement":false,"isCaseSensitive":true,"isCurrency":false,"isDefinitelyWritable":false,"isNullable":"Nullable","isReadOnly":false,"isSearchable":true,"isSigned":false,"isWritable":true,"precision":2147483647,"scale":0,"tableName":"table_constraints"} */
constraintName: Option[/* nullability unknown */ String],
/** Points to [[information_schema.check_constraints.CheckConstraintsViewRow.checkClause]]
debug: {"baseColumnName":"check_clause","baseRelationName":"information_schema.check_constraints","columnClassName":"java.lang.String","columnDisplaySize":2147483647,"parsedColumnName":{"name":"check_clause","originalName":"check_clause"},"columnName":"check_clause","columnType":"VarChar","columnTypeName":"varchar","format":0,"isAutoIncrement":false,"isCaseSensitive":true,"isCurrency":false,"isDefinitelyWritable":false,"isNullable":"Nullable","isReadOnly":false,"isSearchable":true,"isSigned":false,"isWritable":true,"precision":2147483647,"scale":0,"tableName":"check_constraints"} */
checkClause: Option[/* nullability unknown */ String]
/** debug: {"baseColumnName":"check_clause","baseRelationName":"information_schema.check_constraints","columnClassName":"java.lang.String","columnDisplaySize":2147483647,"parsedColumnName":{"name":"check_clause","originalName":"check_clause"},"columnName":"check_clause","columnType":"VarChar","columnTypeName":"varchar","format":0,"isAutoIncrement":false,"isCaseSensitive":true,"isCurrency":false,"isDefinitelyWritable":false,"isNullable":"Nullable","isReadOnly":false,"isSearchable":true,"isSigned":false,"isWritable":true,"precision":2147483647,"scale":0,"tableName":"check_constraints"} */
checkClause: Option[String]
)

object ConstraintsSqlRow {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import java.sql.Connection
class DomainsSqlRepoImpl extends DomainsSqlRepo {
override def apply()(implicit c: Connection): List[DomainsSqlRow] = {
val sql =
SQL"""SELECT nsp.nspname as "schema",
SQL"""SELECT nsp.nspname as "schema?",
typ.typname as "name",
tt.typname as "type",
pc.collname as "collation",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ import scala.util.Try
/** SQL file: custom/domains.sql */
case class DomainsSqlRow(
/** Points to [[pg_catalog.pg_namespace.PgNamespaceRow.nspname]]
debug: {"baseColumnName":"nspname","baseRelationName":"pg_catalog.pg_namespace","columnClassName":"java.lang.String","columnDisplaySize":2147483647,"parsedColumnName":{"name":"schema","originalName":"schema"},"columnName":"schema","columnType":"VarChar","columnTypeName":"name","format":0,"isAutoIncrement":false,"isCaseSensitive":true,"isCurrency":false,"isDefinitelyWritable":false,"isNullable":"NoNulls","isReadOnly":false,"isSearchable":true,"isSigned":false,"isWritable":true,"precision":2147483647,"scale":0,"tableName":"pg_namespace"} */
schema: String,
debug: {"baseColumnName":"nspname","baseRelationName":"pg_catalog.pg_namespace","columnClassName":"java.lang.String","columnDisplaySize":2147483647,"parsedColumnName":{"name":"schema","originalName":"schema?","nullability":"Nullable"},"columnName":"schema?","columnType":"VarChar","columnTypeName":"name","format":0,"isAutoIncrement":false,"isCaseSensitive":true,"isCurrency":false,"isDefinitelyWritable":false,"isNullable":"NoNulls","isReadOnly":false,"isSearchable":true,"isSigned":false,"isWritable":true,"precision":2147483647,"scale":0,"tableName":"pg_namespace"} */
schema: Option[String],
/** Points to [[pg_catalog.pg_type.PgTypeRow.typname]]
debug: {"baseColumnName":"typname","baseRelationName":"pg_catalog.pg_type","columnClassName":"java.lang.String","columnDisplaySize":2147483647,"parsedColumnName":{"name":"name","originalName":"name"},"columnName":"name","columnType":"VarChar","columnTypeName":"name","format":0,"isAutoIncrement":false,"isCaseSensitive":true,"isCurrency":false,"isDefinitelyWritable":false,"isNullable":"NoNulls","isReadOnly":false,"isSearchable":true,"isSigned":false,"isWritable":true,"precision":2147483647,"scale":0,"tableName":"pg_type"} */
name: String,
Expand All @@ -53,7 +53,7 @@ object DomainsSqlRow {
implicit lazy val reads: Reads[DomainsSqlRow] = Reads[DomainsSqlRow](json => JsResult.fromTry(
Try(
DomainsSqlRow(
schema = json.\("schema").as(Reads.StringReads),
schema = json.\("schema").toOption.map(_.as(Reads.StringReads)),
name = json.\("name").as(Reads.StringReads),
`type` = json.\("type").as(Reads.StringReads),
collation = json.\("collation").toOption.map(_.as(Reads.StringReads)),
Expand All @@ -68,7 +68,7 @@ object DomainsSqlRow {
def rowParser(idx: Int): RowParser[DomainsSqlRow] = RowParser[DomainsSqlRow] { row =>
Success(
DomainsSqlRow(
schema = row(idx + 0)(Column.columnToString),
schema = row(idx + 0)(Column.columnToOption(Column.columnToString)),
name = row(idx + 1)(Column.columnToString),
`type` = row(idx + 2)(Column.columnToString),
collation = row(idx + 3)(Column.columnToOption(Column.columnToString)),
Expand All @@ -81,7 +81,7 @@ object DomainsSqlRow {
}
implicit lazy val writes: OWrites[DomainsSqlRow] = OWrites[DomainsSqlRow](o =>
new JsObject(ListMap[String, JsValue](
"schema" -> Writes.StringWrites.writes(o.schema),
"schema" -> Writes.OptionWrites(Writes.StringWrites).writes(o.schema),
"name" -> Writes.StringWrites.writes(o.name),
"type" -> Writes.StringWrites.writes(o.`type`),
"collation" -> Writes.OptionWrites(Writes.StringWrites).writes(o.collation),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import java.sql.Connection
class EnumsSqlRepoImpl extends EnumsSqlRepo {
override def apply()(implicit c: Connection): List[EnumsSqlRow] = {
val sql =
SQL"""select n.nspname as enum_schema,
SQL"""select n.nspname as "enum_schema?",
t.typname as enum_name,
e.enumsortorder as enum_sort_order,
e.enumlabel as enum_value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ import scala.util.Try
/** SQL file: custom/enums.sql */
case class EnumsSqlRow(
/** Points to [[pg_catalog.pg_namespace.PgNamespaceRow.nspname]]
debug: {"baseColumnName":"nspname","baseRelationName":"pg_catalog.pg_namespace","columnClassName":"java.lang.String","columnDisplaySize":2147483647,"parsedColumnName":{"name":"enum_schema","originalName":"enum_schema"},"columnName":"enum_schema","columnType":"VarChar","columnTypeName":"name","format":0,"isAutoIncrement":false,"isCaseSensitive":true,"isCurrency":false,"isDefinitelyWritable":false,"isNullable":"NoNulls","isReadOnly":false,"isSearchable":true,"isSigned":false,"isWritable":true,"precision":2147483647,"scale":0,"tableName":"pg_namespace"} */
enumSchema: String,
debug: {"baseColumnName":"nspname","baseRelationName":"pg_catalog.pg_namespace","columnClassName":"java.lang.String","columnDisplaySize":2147483647,"parsedColumnName":{"name":"enum_schema","originalName":"enum_schema?","nullability":"Nullable"},"columnName":"enum_schema?","columnType":"VarChar","columnTypeName":"name","format":0,"isAutoIncrement":false,"isCaseSensitive":true,"isCurrency":false,"isDefinitelyWritable":false,"isNullable":"NoNulls","isReadOnly":false,"isSearchable":true,"isSigned":false,"isWritable":true,"precision":2147483647,"scale":0,"tableName":"pg_namespace"} */
enumSchema: Option[String],
/** Points to [[pg_catalog.pg_type.PgTypeRow.typname]]
debug: {"baseColumnName":"typname","baseRelationName":"pg_catalog.pg_type","columnClassName":"java.lang.String","columnDisplaySize":2147483647,"parsedColumnName":{"name":"enum_name","originalName":"enum_name"},"columnName":"enum_name","columnType":"VarChar","columnTypeName":"name","format":0,"isAutoIncrement":false,"isCaseSensitive":true,"isCurrency":false,"isDefinitelyWritable":false,"isNullable":"NoNulls","isReadOnly":false,"isSearchable":true,"isSigned":false,"isWritable":true,"precision":2147483647,"scale":0,"tableName":"pg_type"} */
enumName: String,
Expand All @@ -42,7 +42,7 @@ object EnumsSqlRow {
implicit lazy val reads: Reads[EnumsSqlRow] = Reads[EnumsSqlRow](json => JsResult.fromTry(
Try(
EnumsSqlRow(
enumSchema = json.\("enum_schema").as(Reads.StringReads),
enumSchema = json.\("enum_schema").toOption.map(_.as(Reads.StringReads)),
enumName = json.\("enum_name").as(Reads.StringReads),
enumSortOrder = json.\("enum_sort_order").as(Reads.FloatReads),
enumValue = json.\("enum_value").as(Reads.StringReads)
Expand All @@ -53,7 +53,7 @@ object EnumsSqlRow {
def rowParser(idx: Int): RowParser[EnumsSqlRow] = RowParser[EnumsSqlRow] { row =>
Success(
EnumsSqlRow(
enumSchema = row(idx + 0)(Column.columnToString),
enumSchema = row(idx + 0)(Column.columnToOption(Column.columnToString)),
enumName = row(idx + 1)(Column.columnToString),
enumSortOrder = row(idx + 2)(Column.columnToFloat),
enumValue = row(idx + 3)(Column.columnToString)
Expand All @@ -62,7 +62,7 @@ object EnumsSqlRow {
}
implicit lazy val writes: OWrites[EnumsSqlRow] = OWrites[EnumsSqlRow](o =>
new JsObject(ListMap[String, JsValue](
"enum_schema" -> Writes.StringWrites.writes(o.enumSchema),
"enum_schema" -> Writes.OptionWrites(Writes.StringWrites).writes(o.enumSchema),
"enum_name" -> Writes.StringWrites.writes(o.enumName),
"enum_sort_order" -> Writes.FloatWrites.writes(o.enumSortOrder),
"enum_value" -> Writes.StringWrites.writes(o.enumValue)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import java.sql.Connection
class TableCommentsSqlRepoImpl extends TableCommentsSqlRepo {
override def apply()(implicit c: Connection): List[TableCommentsSqlRow] = {
val sql =
SQL"""SELECT n.nspname as schema,
SQL"""SELECT n.nspname as "schema?",
c.relname as name,
pg_catalog.obj_description(c.oid, 'pg_class') as description
FROM pg_catalog.pg_class c
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ import scala.util.Try
/** SQL file: custom/table_comments.sql */
case class TableCommentsSqlRow(
/** Points to [[pg_catalog.pg_namespace.PgNamespaceRow.nspname]]
debug: {"baseColumnName":"nspname","baseRelationName":"pg_catalog.pg_namespace","columnClassName":"java.lang.String","columnDisplaySize":2147483647,"parsedColumnName":{"name":"schema","originalName":"schema"},"columnName":"schema","columnType":"VarChar","columnTypeName":"name","format":0,"isAutoIncrement":false,"isCaseSensitive":true,"isCurrency":false,"isDefinitelyWritable":false,"isNullable":"NoNulls","isReadOnly":false,"isSearchable":true,"isSigned":false,"isWritable":true,"precision":2147483647,"scale":0,"tableName":"pg_namespace"} */
schema: String,
debug: {"baseColumnName":"nspname","baseRelationName":"pg_catalog.pg_namespace","columnClassName":"java.lang.String","columnDisplaySize":2147483647,"parsedColumnName":{"name":"schema","originalName":"schema?","nullability":"Nullable"},"columnName":"schema?","columnType":"VarChar","columnTypeName":"name","format":0,"isAutoIncrement":false,"isCaseSensitive":true,"isCurrency":false,"isDefinitelyWritable":false,"isNullable":"NoNulls","isReadOnly":false,"isSearchable":true,"isSigned":false,"isWritable":true,"precision":2147483647,"scale":0,"tableName":"pg_namespace"} */
schema: Option[String],
/** Points to [[pg_catalog.pg_class.PgClassRow.relname]]
debug: {"baseColumnName":"relname","baseRelationName":"pg_catalog.pg_class","columnClassName":"java.lang.String","columnDisplaySize":2147483647,"parsedColumnName":{"name":"name","originalName":"name"},"columnName":"name","columnType":"VarChar","columnTypeName":"name","format":0,"isAutoIncrement":false,"isCaseSensitive":true,"isCurrency":false,"isDefinitelyWritable":false,"isNullable":"NoNulls","isReadOnly":false,"isSearchable":true,"isSigned":false,"isWritable":true,"precision":2147483647,"scale":0,"tableName":"pg_class"} */
name: String,
Expand All @@ -38,7 +38,7 @@ object TableCommentsSqlRow {
implicit lazy val reads: Reads[TableCommentsSqlRow] = Reads[TableCommentsSqlRow](json => JsResult.fromTry(
Try(
TableCommentsSqlRow(
schema = json.\("schema").as(Reads.StringReads),
schema = json.\("schema").toOption.map(_.as(Reads.StringReads)),
name = json.\("name").as(Reads.StringReads),
description = json.\("description").toOption.map(_.as(Reads.StringReads))
)
Expand All @@ -48,15 +48,15 @@ object TableCommentsSqlRow {
def rowParser(idx: Int): RowParser[TableCommentsSqlRow] = RowParser[TableCommentsSqlRow] { row =>
Success(
TableCommentsSqlRow(
schema = row(idx + 0)(Column.columnToString),
schema = row(idx + 0)(Column.columnToOption(Column.columnToString)),
name = row(idx + 1)(Column.columnToString),
description = row(idx + 2)(Column.columnToOption(Column.columnToString))
)
)
}
implicit lazy val writes: OWrites[TableCommentsSqlRow] = OWrites[TableCommentsSqlRow](o =>
new JsObject(ListMap[String, JsValue](
"schema" -> Writes.StringWrites.writes(o.schema),
"schema" -> Writes.OptionWrites(Writes.StringWrites).writes(o.schema),
"name" -> Writes.StringWrites.writes(o.name),
"description" -> Writes.OptionWrites(Writes.StringWrites).writes(o.description)
))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/**
* File has been automatically generated by `typo` for internal use.
*
* IF YOU CHANGE THIS FILE YOUR CHANGES WILL BE OVERWRITTEN.
*
* (If you're developing `typo` and want to change it: run `bleep generate-sources`)
*/
package typo
package generated
package information_schema

import anorm.Column
import anorm.ParameterMetaData
import anorm.ToStatement
import java.sql.Types
import play.api.libs.json.Reads
import play.api.libs.json.Writes

/** Domain `information_schema.cardinal_number`
* Constraint: CHECK ((VALUE >= 0))
*/
case class CardinalNumber(value: Int)
object CardinalNumber {
implicit lazy val arrayColumn: Column[Array[CardinalNumber]] = Column.columnToArray(column, implicitly)
implicit lazy val arrayToStatement: ToStatement[Array[CardinalNumber]] = typo.generated.IntArrayToStatement.contramap(_.map(_.value))
implicit lazy val column: Column[CardinalNumber] = Column.columnToInt.map(CardinalNumber.apply)
implicit lazy val ordering: Ordering[CardinalNumber] = Ordering.by(_.value)
implicit lazy val parameterMetadata: ParameterMetaData[CardinalNumber] = new ParameterMetaData[CardinalNumber] {
override def sqlType: String = """"information_schema"."cardinal_number""""
override def jdbcType: Int = Types.OTHER
}
implicit lazy val reads: Reads[CardinalNumber] = Reads.IntReads.map(CardinalNumber.apply)
implicit lazy val text: Text[CardinalNumber] = new Text[CardinalNumber] {
override def unsafeEncode(v: CardinalNumber, sb: StringBuilder) = Text.intInstance.unsafeEncode(v.value, sb)
override def unsafeArrayEncode(v: CardinalNumber, sb: StringBuilder) = Text.intInstance.unsafeArrayEncode(v.value, sb)
}
implicit lazy val toStatement: ToStatement[CardinalNumber] = ToStatement.intToStatement.contramap(_.value)
implicit lazy val writes: Writes[CardinalNumber] = Writes.IntWrites.contramap(_.value)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/**
* File has been automatically generated by `typo` for internal use.
*
* IF YOU CHANGE THIS FILE YOUR CHANGES WILL BE OVERWRITTEN.
*
* (If you're developing `typo` and want to change it: run `bleep generate-sources`)
*/
package typo
package generated
package information_schema

import anorm.Column
import anorm.ParameterMetaData
import anorm.ToStatement
import java.sql.Types
import play.api.libs.json.Reads
import play.api.libs.json.Writes

/** Domain `information_schema.character_data`
* No constraint
*/
case class CharacterData(value: String)
object CharacterData {
implicit lazy val arrayColumn: Column[Array[CharacterData]] = Column.columnToArray(column, implicitly)
implicit lazy val arrayToStatement: ToStatement[Array[CharacterData]] = ToStatement.arrayToParameter(ParameterMetaData.StringParameterMetaData).contramap(_.map(_.value))
implicit lazy val column: Column[CharacterData] = Column.columnToString.map(CharacterData.apply)
implicit lazy val ordering: Ordering[CharacterData] = Ordering.by(_.value)
implicit lazy val parameterMetadata: ParameterMetaData[CharacterData] = new ParameterMetaData[CharacterData] {
override def sqlType: String = """"information_schema"."character_data""""
override def jdbcType: Int = Types.OTHER
}
implicit lazy val reads: Reads[CharacterData] = Reads.StringReads.map(CharacterData.apply)
implicit lazy val text: Text[CharacterData] = new Text[CharacterData] {
override def unsafeEncode(v: CharacterData, sb: StringBuilder) = Text.stringInstance.unsafeEncode(v.value, sb)
override def unsafeArrayEncode(v: CharacterData, sb: StringBuilder) = Text.stringInstance.unsafeArrayEncode(v.value, sb)
}
implicit lazy val toStatement: ToStatement[CharacterData] = ToStatement.stringToStatement.contramap(_.value)
implicit lazy val writes: Writes[CharacterData] = Writes.StringWrites.contramap(_.value)
}
Loading

0 comments on commit f21078a

Please sign in to comment.