Class

io.getquill.codegen.jdbc

ComposeableTraitsJdbcCodegen

Related Doc: package jdbc

Permalink

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.tableSchem == "alpha" || ts.tableSchem == "bravo") "common" else ts.tableSchem

    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 AlphaExtnsions[H2Dialect, Literal] with BravoExtensions[H2Dialect, Literal]

Linear Supertypes
JdbcGeneratorBase, JdbcStereotyper, Stereotyper, JdbcCodeGeneratorComponents, CodeGeneratorComponents, gen.QuerySchemaNaming, HasBasicMeta, JdbcGenerator, Generator, AnyRef, Any
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. ComposeableTraitsJdbcCodegen
  2. JdbcGeneratorBase
  3. JdbcStereotyper
  4. Stereotyper
  5. JdbcCodeGeneratorComponents
  6. CodeGeneratorComponents
  7. QuerySchemaNaming
  8. HasBasicMeta
  9. JdbcGenerator
  10. Generator
  11. AnyRef
  12. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. All

Instance Constructors

  1. new ComposeableTraitsJdbcCodegen(connectionMaker: JdbcConnectionMaker, packagePrefix: String)

    Permalink
  2. new ComposeableTraitsJdbcCodegen(configPrefix: String, packagePrefix: String, nestedTrait: Boolean)

    Permalink
  3. new ComposeableTraitsJdbcCodegen(config: Config, packagePrefix: String, nestedTrait: Boolean)

    Permalink
  4. new ComposeableTraitsJdbcCodegen(config: JdbcContextConfig, packagePrefix: String, nestedTrait: Boolean)

    Permalink
  5. new ComposeableTraitsJdbcCodegen(dataSource: DataSource, packagePrefix: String, nestedTrait: Boolean)

    Permalink

    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.

  6. new ComposeableTraitsJdbcCodegen(connectionMaker: JdbcConnectionMaker, packagePrefix: String, nestedTrait: Boolean)

    Permalink
  7. new ComposeableTraitsJdbcCodegen(connectionMakers: Seq[JdbcConnectionMaker], packagePrefix: String = "", nestedTrait: Boolean = false)

    Permalink

Type Members

  1. class CodeEmitter extends AbstractCodeEmitter with PackageGen

    Permalink
    Definition Classes
    Generator
  2. type ColumnGetter = (ColumnMeta) ⇒ String

    Permalink
    Definition Classes
    CodeGeneratorComponents
  3. type ColumnMeta = JdbcColumnMeta

    Permalink
    Definition Classes
    JdbcGeneratorBaseJdbcStereotyperJdbcCodeGeneratorComponents → HasBasicMeta
  4. type ConnectionMaker = () ⇒ Connection

    Permalink
    Definition Classes
    JdbcCodeGeneratorComponents → CodeGeneratorComponents
  5. class ContextifiedUnitGenerator extends CodeEmitter

    Permalink
  6. type JdbcStereotypingFunction = (Seq[RawSchema[JdbcTableMeta, JdbcColumnMeta]]) ⇒ Seq[TableStereotype[JdbcTableMeta, JdbcColumnMeta]]

    Permalink
    Definition Classes
    JdbcStereotyper
  7. class JdbcStereotypingHelper extends JdbcStereotypingFunction

    Permalink
    Definition Classes
    JdbcStereotyper
  8. class MultiGeneratorFactory[Emitter <: CodeEmitter] extends AnyRef

    Permalink
    Definition Classes
    Generator
  9. type QuerySchemaNaming = (JdbcTableMeta) ⇒ String

    Permalink
    Definition Classes
    JdbcCodeGeneratorComponents → CodeGeneratorComponents
  10. type SchemaReader = (JdbcConnectionMaker) ⇒ Seq[RawSchema[JdbcTableMeta, JdbcColumnMeta]]

    Permalink
    Definition Classes
    JdbcCodeGeneratorComponents → CodeGeneratorComponents
  11. type SingleGeneratorFactory[Emitter <: CodeEmitter] = (EmitterSettings[TableMeta, ColumnMeta]) ⇒ Emitter

    Permalink
    Definition Classes
    Generator
  12. type TableMeta = JdbcTableMeta

    Permalink
    Definition Classes
    JdbcGeneratorBaseJdbcStereotyperJdbcCodeGeneratorComponents → HasBasicMeta
  13. type TypeInfo = JdbcTypeInfo

    Permalink
    Definition Classes
    JdbcCodeGeneratorComponents → CodeGeneratorComponents
  14. type Typer = (JdbcTypeInfo) ⇒ Option[ClassTag[_]]

    Permalink
    Definition Classes
    JdbcCodeGeneratorComponents → CodeGeneratorComponents

Value Members

  1. final def !=(arg0: Any): Boolean

    Permalink
    Definition Classes
    AnyRef → Any
  2. final def ##(): Int

    Permalink
    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean

    Permalink
    Definition Classes
    AnyRef → Any
  4. final def asInstanceOf[T0]: T0

    Permalink
    Definition Classes
    Any
  5. def clone(): AnyRef

    Permalink
    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  6. val columnGetter: (ComposeableTraitsJdbcCodegen.ColumnMeta) ⇒ String

    Permalink
    Definition Classes
    JdbcGenerator
  7. val connectionMakers: Seq[JdbcConnectionMaker]

    Permalink
    Definition Classes
    ComposeableTraitsJdbcCodegenJdbcGeneratorBaseJdbcGenerator → Generator
  8. val databaseType: DatabaseType

    Permalink
    Definition Classes
    JdbcGenerator
  9. def defaultExcludedSchemas: Set[String]

    Permalink
    Definition Classes
    JdbcCodeGeneratorComponents → CodeGeneratorComponents
  10. def defaultNamespace: String

    Permalink
    Definition Classes
    CodeGeneratorComponents
  11. final def eq(arg0: AnyRef): Boolean

    Permalink
    Definition Classes
    AnyRef
  12. def equals(arg0: Any): Boolean

    Permalink
    Definition Classes
    AnyRef → Any
  13. def expresser: Expresser[JdbcTableMeta, JdbcColumnMeta]

    Permalink
    Definition Classes
    JdbcStereotyper
  14. def filter(tc: RawSchema[JdbcTableMeta, JdbcColumnMeta]): Boolean

    Permalink
    Definition Classes
    JdbcGenerator → Generator
  15. def finalize(): Unit

    Permalink
    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( classOf[java.lang.Throwable] )
  16. def fuser: Fuser[JdbcTableMeta, JdbcColumnMeta]

    Permalink
    Definition Classes
    JdbcStereotyper
  17. def generatorMaker: SingleGeneratorFactory[ContextifiedUnitGenerator]

    Permalink
    Definition Classes
    ComposeableTraitsJdbcCodegen → Generator
  18. final def getClass(): Class[_]

    Permalink
    Definition Classes
    AnyRef → Any
  19. def hashCode(): Int

    Permalink
    Definition Classes
    AnyRef → Any
  20. final def isInstanceOf[T0]: Boolean

    Permalink
    Definition Classes
    Any
  21. def makeGenerators: Seq[ContextifiedUnitGenerator]

    Permalink
    Definition Classes
    ComposeableTraitsJdbcCodegen → Generator
  22. def nameParser: NameParser

    Permalink
    Definition Classes
    JdbcCodeGeneratorComponents → CodeGeneratorComponents
  23. def namespacer: Namespacer[ComposeableTraitsJdbcCodegen.TableMeta]

    Permalink
    Definition Classes
    JdbcGenerator
  24. final def ne(arg0: AnyRef): Boolean

    Permalink
    Definition Classes
    AnyRef
  25. val nestedTrait: Boolean

    Permalink
  26. final def notify(): Unit

    Permalink
    Definition Classes
    AnyRef
  27. final def notifyAll(): Unit

    Permalink
    Definition Classes
    AnyRef
  28. def numericPreference: NumericPreference

    Permalink

    When the Jdbc Typer sees a NUMERIC jdbc column, should it use int/long instead of BigInteger if the scale allows?

    When the Jdbc Typer sees a NUMERIC jdbc column, should it use int/long instead of BigInteger if the scale allows?

    Definition Classes
    JdbcCodeGeneratorComponents
  29. val packagePrefix: String

    Permalink
  30. def packagingStrategy: PackagingStrategy

    Permalink
    Definition Classes
    ComposeableTraitsJdbcCodegenJdbcCodeGeneratorComponents → CodeGeneratorComponents
  31. def querySchemaImports: String

    Permalink
    Definition Classes
    CodeGeneratorComponents
  32. def querySchemaNaming: ComposeableTraitsJdbcCodegen.QuerySchemaNaming

    Permalink
    Definition Classes
    CodeGeneratorComponents
  33. val renderMembers: Boolean

    Permalink
    Definition Classes
    Generator
  34. def schemaReader: SchemaReader

    Permalink
    Definition Classes
    JdbcCodeGeneratorComponents → CodeGeneratorComponents
  35. def stereotype(schemas: Seq[RawSchema[JdbcTableMeta, JdbcColumnMeta]]): Seq[TableStereotype[JdbcTableMeta, JdbcColumnMeta]]

    Permalink
    Definition Classes
    JdbcStereotyper → Stereotyper
  36. final def synchronized[T0](arg0: ⇒ T0): T0

    Permalink
    Definition Classes
    AnyRef
  37. def toString(): String

    Permalink
    Definition Classes
    AnyRef → Any
  38. def typer: Typer

    Permalink
    Definition Classes
    JdbcCodeGeneratorComponents → CodeGeneratorComponents
  39. def unrecognizedTypeStrategy: UnrecognizedTypeStrategy

    Permalink

    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
  40. final def wait(): Unit

    Permalink
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  41. final def wait(arg0: Long, arg1: Int): Unit

    Permalink
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  42. final def wait(arg0: Long): Unit

    Permalink
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  43. def writeAllFiles(localtion: String): Future[Seq[Path]]

    Permalink
    Definition Classes
    Generator
  44. def writeFiles(location: String): Seq[Future[Path]]

    Permalink
    Definition Classes
    Generator
  45. def writeStrings: Seq[String]

    Permalink
    Definition Classes
    Generator

Inherited from JdbcGeneratorBase

Inherited from JdbcStereotyper

Inherited from Stereotyper

Inherited from CodeGeneratorComponents

Inherited from gen.QuerySchemaNaming

Inherited from HasBasicMeta

Inherited from JdbcGenerator

Inherited from Generator

Inherited from AnyRef

Inherited from Any

Ungrouped