__PACKAGE__

import io.getquill.NamingStrategy
__SQL_IDIOM_IMPORT__
__MONAD_IMPORT__
__BEAN_CLASS_IMPORT__
__ID_CLASS_IMPORT__
__REPOSITORY_TRAIT_IMPORT__
__REPOSITORY_MACRO_TRAIT_IMPORT__
__REPOSITORY_IMPORT__
__EXECUTION_CONTEXT_IMPORT__
__CONNECTION_IMPORT__

final class __REPOSITORY_NAME__[__ALIAS_GENERIC_DECLARATION__](
    protected val context: __CONTEXT_ALIAS__[__GENERIC_DECLARATION__],
    protected val tableName: String = "__TABLE_NAME__"
)
  extends __REPOSITORY_TRAIT_SIMPLE_NAME__ {

  protected def dynamicSchema: context.DynamicEntityQuery[__BEAN__] = dSchema

  private implicit val dSchema: context.DynamicEntityQuery[__BEAN__] = {
      __IMPORT_CONTEXT__
      context.dynamicQuerySchema[__BEAN__](tableName__COLUMN_MAPPING__)
  }

  override def all__EXECUTION_CONTEXT__: __MONAD__[Seq[__BEAN__]] =
   __TRY_START__
      context.all[__BEAN__]__IMPLICIT_PARAMETERS__
   __TRY_END__

  override def create(entity: __BEAN__, generateId: Boolean = true)__EXECUTION_CONTEXT__: __MONAD__[__ID__] =
   __TRY_START__
    __CONTEXT_TRANSACTION_START__
      if (generateId) {
        context.createAndGenerateId[__ID__, __BEAN__](entity)__IMPLICIT_PARAMETERS__
      } else {
        context.create[__ID__, __BEAN__](entity)__IMPLICIT_PARAMETERS__
      }
    __CONTEXT_TRANSACTION_END__
   __TRY_END__

  override def createAndRead(entity: __BEAN__, generateId: Boolean = true)__EXECUTION_CONTEXT__: __MONAD__[__BEAN__] =
   __TRY_START__
    __CONTEXT_TRANSACTION_START__
      if (generateId) {
        context.createWithGenerateIdAndRead[__ID__, __BEAN__](entity)__IMPLICIT_TRANSACTION_PARAMETERS__
      } else {
        context.createAndRead[__ID__, __BEAN__](entity)__IMPLICIT_TRANSACTION_PARAMETERS__
      }
    __CONTEXT_TRANSACTION_END__
   __TRY_END__

  override def createOrUpdate(entity: __BEAN__, generateId: Boolean = true)__EXECUTION_CONTEXT__: __MONAD__[__ID__] =
   __TRY_START__
    __CONTEXT_TRANSACTION_START__
        if (generateId) {
          context.createAndGenerateIdOrUpdate[__ID__, __BEAN__](entity)__IMPLICIT_TRANSACTION_PARAMETERS__
        } else {
           context.createOrUpdate[__ID__, __BEAN__](entity)__IMPLICIT_TRANSACTION_PARAMETERS__
        }
    __CONTEXT_TRANSACTION_END__
   __TRY_END__

  override def createOrUpdateAndRead(entity: __BEAN__, generateId: Boolean = true)__EXECUTION_CONTEXT__: __MONAD__[__BEAN__] =
  __TRY_START__
    __CONTEXT_TRANSACTION_START__
      if (generateId) {
        context.createWithGenerateIdOrUpdateAndRead[__ID__, __BEAN__](entity)__IMPLICIT_TRANSACTION_PARAMETERS__
      } else {
         context.createOrUpdateAndRead[__ID__, __BEAN__](entity)__IMPLICIT_TRANSACTION_PARAMETERS__
      }
    __CONTEXT_TRANSACTION_END__
   __TRY_END__

  override def read(id: __ID__)__EXECUTION_CONTEXT__: __MONAD__[Option[__BEAN__]] =
   __TRY_START__
      context.read[__ID__, __BEAN__](id)__IMPLICIT_PARAMETERS__
   __TRY_END__

  override def readUnsafe(id: __ID__)__EXECUTION_CONTEXT__: __MONAD__[__BEAN__] =
   __TRY_START__
        context.readUnsafe[__ID__, __BEAN__](id)__IMPLICIT_PARAMETERS__
   __TRY_END__

  override def update(entity: __BEAN__)__EXECUTION_CONTEXT__: __MONAD__[__UPDATE__] =
   __TRY_START__
    __CONTEXT_TRANSACTION_START__
        context.update[__ID__, __BEAN__](entity)__IMPLICIT_PARAMETERS__
    __CONTEXT_TRANSACTION_END__
   __TRY_END__

  override def updateAndRead(entity: __BEAN__)__EXECUTION_CONTEXT__: __MONAD__[__BEAN__] =
   __TRY_START__
    __CONTEXT_TRANSACTION_START__
        context.updateAndRead[__ID__, __BEAN__](entity)__IMPLICIT_TRANSACTION_PARAMETERS__
    __CONTEXT_TRANSACTION_END__
   __TRY_END__

  override def delete(id: __ID__)__EXECUTION_CONTEXT__: __MONAD__[__UPDATE__] =
   __TRY_START__
    __CONTEXT_TRANSACTION_START__
        context.delete[__ID__, __BEAN__](id)__IMPLICIT_PARAMETERS__
    __CONTEXT_TRANSACTION_END__
   __TRY_END__

  override def deleteAll__EXECUTION_CONTEXT__: __MONAD__[__UPDATE__] =
   __TRY_START__
    __CONTEXT_TRANSACTION_START__
         context.deleteAll__IMPLICIT_PARAMETERS__
    __CONTEXT_TRANSACTION_END__
   __TRY_END__

}
