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
- All
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( ... ) @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: Any): 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[_]
- 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( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @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