class ComposeableTraitsJdbcCodegen extends JdbcGeneratorBase
This generator generates a query schema trait which can be composed with a custom context that you create in your client code (called MySchemaExtensions below because it extends and existing quill context with your query schemas). Here is what that looks like:
case class Person(firstName:String, lastName:String, age:Int)
case class Address(...)
trait PublicExtensions[+Idiom <: io.getquill.idiom.Idiom, Naming <:
io.getquill.NamingStrategy] { this:io.getquill.context.Context[Idiom, Naming]
=>
object PersonDao { def query = querySchema[Person](...) object AddressDao {
def query = querySchema[Address](...) } }
// Then when declaring your context: import io.getquill._ object
MyCustomContext extends SqlMirrorContext[H2Dialect, Literal](H2Dialect,
Literal) with PublicExtensions[H2Dialect, Literal]
}
A Note on Stereotyping
Stereotyping using the ComposeableTraitsGen
is done in the following manner. Firstly, extend a ComposeableTraitsGen and
add the Namespacer of your choice. Let's take the alpha and
bravo namespaces and combine them into a common
namespace. Also be sure to set the memberNamer correctly so that the
different querySchemas generated won't all be called '.query' in the
Common object.
class MyStereotypingGen(...) extends ComposeableTraitsGen(...) {
override def namespacer: Namespacer = ts=> if(ts.tableSchema == "alpha" ||
ts.tableSchema == "bravo") "common" else ts.tableSchema
override def memberNamer: MemberNamer = ts => ts.tableName.snakeToLowerCamel
}
The following schema should result:
trait CommonExtensions[+Idiom <:
io.getquill.idiom.Idiom, Naming <: io.getquill.NamingStrategy] {
this:io.getquill.context.Context[Idiom, Naming] =>
object PersonDao { // you don't want each of these to be called 'query' so
choose an appropriate memberNamer def alphaPerson = querySchema[Person](...)
def bravoPerson = querySchema[Person](...) } }
trait PublicExtensions[+Idiom <: io.getquill.idiom.Idiom, Naming <:
io.getquill.NamingStrategy] { this:io.getquill.context.Context[Idiom, Naming]
\=>
object AddressDao { def publicAddress = querySchema[Address](...) } }
When DAO Objects Collide
Now when you are trying to generate schemas which are not being stereotyped but have equivalent table names for example:
trait AlphaExtensions[+Idiom <: io.getquill.idiom.Idiom, Naming <:
io.getquill.NamingStrategy] { this:io.getquill.context.Context[Idiom, Naming]
\=>
object PersonDao { def query = querySchema[Person](...) } }
trait BravoExtensions[+Idiom <: io.getquill.idiom.Idiom, Naming <:
io.getquill.NamingStrategy] { this:io.getquill.context.Context[Idiom, Naming]
\=>
object PersonDao { def query = querySchema[Person](...) } }
// Invalid because MyCustomContext has a PersonDao from AlphaExtensions and
and a PersonDao from BravoExtensions which collide. object MyCustomContext
extends SqlMirrorContext[H2Dialect, Literal](H2Dialect, Literal) with
AlphaExtensions[H2Dialect, Literal] with BravoExtensions[H2Dialect, Literal]
You will not be able to append these two traits to the same quill context
because the PersonDao inside alpha and bravo will collide inside of
MyCustomContext. Use the parameter nestedTrait=true in order to
get around this.
trait AlphaExtensions[+Idiom <: io.getquill.idiom.Idiom, Naming <:
io.getquill.NamingStrategy] { this:io.getquill.context.Context[Idiom, Naming]
\=>
trait AlphaSchema { object PersonDao { def query = querySchema[Person](...) }
} }
trait BravoExtensions[+Idiom <: io.getquill.idiom.Idiom, Naming <:
io.getquill.NamingStrategy] { this:io.getquill.context.Context[Idiom, Naming]
\=>
trait BravoSchema { object PersonDao { def query = querySchema[Person](...) }
} }
// Since PersonDao is inside MyCustomContext.alpha and MyCustomContext.bravo
as opposed to MyCustomContext // there will be no collision. object
MyCustomContext extends SqlMirrorContext[H2Dialect, Literal](H2Dialect,
Literal) with AlphaExtensions[H2Dialect, Literal] with
BravoExtensions[H2Dialect, Literal]
- Alphabetic
- By Inheritance
- ComposeableTraitsJdbcCodegen
- JdbcGeneratorBase
- JdbcStereotyper
- Stereotyper
- JdbcCodeGeneratorComponents
- CodeGeneratorComponents
- QuerySchemaNaming
- HasBasicMeta
- JdbcGenerator
- Generator
- AnyRef
- Any
- Hide All
- Show All
- Public
- Protected
Instance Constructors
- new ComposeableTraitsJdbcCodegen(connectionMaker: JdbcConnectionMaker, packagePrefix: String)
- new ComposeableTraitsJdbcCodegen(configPrefix: String, packagePrefix: String, nestedTrait: Boolean)
- new ComposeableTraitsJdbcCodegen(config: Config, packagePrefix: String, nestedTrait: Boolean)
- new ComposeableTraitsJdbcCodegen(config: JdbcContextConfig, packagePrefix: String, nestedTrait: Boolean)
- new ComposeableTraitsJdbcCodegen(dataSource: DataSource, packagePrefix: String, nestedTrait: Boolean)
Simple convenience constructor in the case there is a single datasource.
Simple convenience constructor in the case there is a single datasource. Useful in order to not have to construct the datasource over and over again.
- new ComposeableTraitsJdbcCodegen(connectionMaker: JdbcConnectionMaker, packagePrefix: String, nestedTrait: Boolean)
- new ComposeableTraitsJdbcCodegen(connectionMakers: Seq[JdbcConnectionMaker], packagePrefix: String = "", nestedTrait: Boolean = false)
Type Members
- class CodeEmitter extends AbstractCodeEmitter with PackageGen
- Definition Classes
- Generator
- type ColumnGetter = (ColumnMeta) => String
- Definition Classes
- CodeGeneratorComponents
- type ColumnMeta = JdbcColumnMeta
- Definition Classes
- JdbcGeneratorBase → JdbcStereotyper → JdbcCodeGeneratorComponents → HasBasicMeta
- type ConnectionMaker = () => Connection
- Definition Classes
- JdbcCodeGeneratorComponents → CodeGeneratorComponents
- class ContextifiedUnitGenerator extends CodeEmitter
- type JdbcStereotypingFunction = (Seq[RawSchema[JdbcTableMeta, JdbcColumnMeta]]) => Seq[TableStereotype[JdbcTableMeta, JdbcColumnMeta]]
- Definition Classes
- JdbcStereotyper
- class MultiGeneratorFactory[Emitter <: CodeEmitter] extends AnyRef
- Definition Classes
- Generator
- type QuerySchemaNaming = (JdbcTableMeta) => String
- Definition Classes
- JdbcCodeGeneratorComponents → CodeGeneratorComponents
- type SchemaReader = (JdbcConnectionMaker) => Seq[RawSchema[JdbcTableMeta, JdbcColumnMeta]]
- Definition Classes
- JdbcCodeGeneratorComponents → CodeGeneratorComponents
- type SingleGeneratorFactory[Emitter <: CodeEmitter] = (EmitterSettings[TableMeta, ColumnMeta]) => Emitter
- Definition Classes
- Generator
- type TableMeta = JdbcTableMeta
- Definition Classes
- JdbcGeneratorBase → JdbcStereotyper → JdbcCodeGeneratorComponents → HasBasicMeta
- type TypeInfo = JdbcTypeInfo
- Definition Classes
- JdbcCodeGeneratorComponents → CodeGeneratorComponents
- type Typer = (JdbcTypeInfo) => Option[ClassTag[_]]
- Definition Classes
- JdbcCodeGeneratorComponents → CodeGeneratorComponents
- class JdbcStereotypingHelper extends JdbcStereotypingFunction
- Definition Classes
- JdbcStereotyper
Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##: Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native()
- val columnGetter: (ComposeableTraitsJdbcCodegen.ColumnMeta) => String
- Definition Classes
- JdbcGenerator
- val connectionMakers: Seq[JdbcConnectionMaker]
- Definition Classes
- ComposeableTraitsJdbcCodegen → JdbcGeneratorBase → JdbcGenerator → Generator
- val databaseType: DatabaseType
- Definition Classes
- JdbcGenerator
- def defaultExcludedSchemas: Set[String]
- Definition Classes
- JdbcCodeGeneratorComponents → CodeGeneratorComponents
- def defaultNamespace: String
- Definition Classes
- CodeGeneratorComponents
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- def expresser: Expresser[JdbcTableMeta, JdbcColumnMeta]
- Definition Classes
- JdbcStereotyper
- def filter(tc: RawSchema[JdbcTableMeta, JdbcColumnMeta]): Boolean
- Definition Classes
- JdbcGenerator → Generator
- def fuser: Fuser[JdbcTableMeta, JdbcColumnMeta]
- Definition Classes
- JdbcStereotyper
- def generatorMaker: SingleGeneratorFactory[ContextifiedUnitGenerator]
- Definition Classes
- ComposeableTraitsJdbcCodegen → Generator
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- def makeGenerators: Seq[ContextifiedUnitGenerator]
- Definition Classes
- ComposeableTraitsJdbcCodegen → Generator
- def nameParser: NameParser
- Definition Classes
- JdbcCodeGeneratorComponents → CodeGeneratorComponents
- def namespacer: Namespacer[ComposeableTraitsJdbcCodegen.TableMeta]
- Definition Classes
- JdbcGenerator
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- val nestedTrait: Boolean
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- def numericPreference: NumericPreference
When the Jdbc Typer sees a
NUMERICjdbc column, should it use int/long instead ofBigIntegerif the scale allows?When the Jdbc Typer sees a
NUMERICjdbc column, should it use int/long instead ofBigIntegerif the scale allows?- Definition Classes
- JdbcCodeGeneratorComponents
- val packagePrefix: String
- Definition Classes
- ComposeableTraitsJdbcCodegen → JdbcGeneratorBase → JdbcCodeGeneratorComponents → Generator
- def packagingStrategy: PackagingStrategy
- Definition Classes
- ComposeableTraitsJdbcCodegen → JdbcCodeGeneratorComponents → CodeGeneratorComponents
- def querySchemaImports: String
- Definition Classes
- CodeGeneratorComponents
- def querySchemaNaming: ComposeableTraitsJdbcCodegen.QuerySchemaNaming
- Definition Classes
- CodeGeneratorComponents
- val renderMembers: Boolean
- Definition Classes
- Generator
- def schemaReader: SchemaReader
- Definition Classes
- JdbcCodeGeneratorComponents → CodeGeneratorComponents
- def stereotype(schemas: Seq[RawSchema[JdbcTableMeta, JdbcColumnMeta]]): Seq[TableStereotype[JdbcTableMeta, JdbcColumnMeta]]
- Definition Classes
- JdbcStereotyper → Stereotyper
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- AnyRef → Any
- def typer: Typer
- Definition Classes
- JdbcCodeGeneratorComponents → CodeGeneratorComponents
- def unrecognizedTypeStrategy: UnrecognizedTypeStrategy
When the Jdbc Typer tries to figure out which Scala/Java objects to use for which JDBC type (e.g.
When the Jdbc Typer tries to figure out which Scala/Java objects to use for which JDBC type (e.g. use String for Varchar(...), Long for bigint etc...), what do we do when we discover a JDBC type which we cannot translate (e.g. blob which is currently not supported by quill). The simplest thing to do is to skip the column.
- Definition Classes
- JdbcCodeGeneratorComponents → CodeGeneratorComponents
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()
- def writeAllFiles(location: String): Future[Seq[Path]]
- Definition Classes
- Generator
- def writeFiles(location: String): Seq[Future[Path]]
- Definition Classes
- Generator
- def writeStrings: Seq[String]
- Definition Classes
- Generator