The Wayback Machine - https://web.archive.org/web/20210123112203/https://github.com/getquill/quill/issues/1925
Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NamingStrategy$ cannot be cast to NamingStrategy #1925

Open
DenisNovac opened this issue Aug 7, 2020 · 0 comments
Open

NamingStrategy$ cannot be cast to NamingStrategy #1925

DenisNovac opened this issue Aug 7, 2020 · 0 comments

Comments

@DenisNovac
Copy link

@DenisNovac DenisNovac commented Aug 7, 2020

Version: 3.5.1
Module: quill-core
Database: postgresql

Expected behavior

Hi everyone, I want to use default name strategy if schema is public and default + special name strategy if schema is provided:

class SchemaNamingStrategy(schema: String) extends NamingStrategy {
  override def table(s: String): String   = s"$schema.$s"
  override def default(s: String): String = s
}

private val schemaNamingStrategy = employeeSchema match {
    case "public" =>
      defaultNamingStrategy  // snake case, single naming strategy

    case schema =>
      NamingStrategy(defaultNamingStrategy, new SchemaNamingStrategy(schema))  // composite naming strategy of type CompositeNamingStrategy2
}

CompositeNamingStrategy extends NamingStrategy just like SnakeCase do so schemaNamingStrategy should be of type NamingStrategy.

Actual behavior

[error] exception during macro expansion: 
[error] java.lang.ClassCastException: class io.getquill.NamingStrategy$ cannot be cast to class io.getquill.NamingStrategy (io.getquill.NamingStrategy$ and io.getquill.NamingStrategy are in unnamed module of loader scala.reflect.internal.util.ScalaClassLoader$URLClassLoader @400441f3)
[error]         at scala.collection.LinearSeqOptimized.foldLeft(LinearSeqOptimized.scala:126)
[error]         at scala.collection.LinearSeqOptimized.foldLeft$(LinearSeqOptimized.scala:122)
[error]         at scala.collection.immutable.List.foldLeft(List.scala:89)
[error]         at io.getquill.CompositeNamingStrategy.table(NamingStrategy.scala:16)
[error]         at io.getquill.CompositeNamingStrategy.table$(NamingStrategy.scala:15)
[error]         at io.getquill.NamingStrategy$$anon$1.table(NamingStrategy.scala:64)
[error]         at io.getquill.context.sql.idiom.SqlIdiom.tokenizeTable(SqlIdiom.scala:171)
[error]         at io.getquill.context.sql.idiom.SqlIdiom.tokenizeTable$(SqlIdiom.scala:168)
[error]         at io.getquill.PostgresDialect$.tokenizeTable(PostgresDialect.scala:43)
[error]         at io.getquill.context.sql.idiom.SqlIdiom.$anonfun$entityTokenizer$1(SqlIdiom.scala:491)
[error]         at io.getquill.idiom.StatementInterpolator$Tokenizer$$anon$1.token(StatementInterpolator.scala:17)
[error]         at io.getquill.idiom.StatementInterpolator$TokenImplicit.token(StatementInterpolator.scala:27)
[error]         at io.getquill.context.sql.idiom.SqlIdiom.$anonfun$sourceTokenizer$1(SqlIdiom.scala:253)
[error]         at io.getquill.idiom.StatementInterpolator$Tokenizer$$anon$1.token(StatementInterpolator.scala:17)
[error]         at io.getquill.idiom.StatementInterpolator$TokenImplicit.token(StatementInterpolator.scala:27)
[error]         at io.getquill.context.sql.idiom.SqlIdiom$FlattenSqlQueryTokenizerHelper.withFrom(SqlIdiom.scala:123)
[error]         at io.getquill.context.sql.idiom.SqlIdiom$FlattenSqlQueryTokenizerHelper.withWhere(SqlIdiom.scala:136)
[error]         at io.getquill.context.sql.idiom.SqlIdiom$FlattenSqlQueryTokenizerHelper.withGroupBy(SqlIdiom.scala:140)
[error]         at io.getquill.context.sql.idiom.SqlIdiom$FlattenSqlQueryTokenizerHelper.withOrderBy(SqlIdiom.scala:145)
[error]         at io.getquill.context.sql.idiom.SqlIdiom$FlattenSqlQueryTokenizerHelper.withLimitOffset(SqlIdiom.scala:148)
[error]         at io.getquill.context.sql.idiom.SqlIdiom$FlattenSqlQueryTokenizerHelper.apply(SqlIdiom.scala:150)
[error]         at io.getquill.context.sql.idiom.SqlIdiom.$anonfun$sqlQueryTokenizer$1(SqlIdiom.scala:155)
[error]         at io.getquill.idiom.StatementInterpolator$Tokenizer$$anon$1.token(StatementInterpolator.scala:17)
[error]         at io.getquill.idiom.StatementInterpolator$TokenImplicit.token(StatementInterpolator.scala:27)
[error]         at io.getquill.context.sql.idiom.SqlIdiom.translate(SqlIdiom.scala:46)
[error]         at io.getquill.context.sql.idiom.SqlIdiom.translate$(SqlIdiom.scala:33)
[error]         at io.getquill.PostgresDialect$.translate(PostgresDialect.scala:43)
[error]         at io.getquill.context.ContextMacro.translateStatic(ContextMacro.scala:51)
[error]         at io.getquill.context.ContextMacro.translate(ContextMacro.scala:37)
[error]         at io.getquill.context.ContextMacro.expand(ContextMacro.scala:24)
[error]         at io.getquill.context.ContextMacro.expand$(ContextMacro.scala:21)
[error]         at io.getquill.context.QueryMacro.expand(QueryMacro.scala:8)
[error]         at io.getquill.context.QueryMacro.expandQueryWithMeta(QueryMacro.scala:184)
[error]         at io.getquill.context.QueryMacro.expandQuery(QueryMacro.scala:51)
[error]         at io.getquill.context.QueryMacro.runQuery(QueryMacro.scala:34)
[error]     run {

Workaround

I use SchemaNamingStrategy with default schema to produce the CompositeNamingStrategy2 at every output.

private val schemaNamingStrategy = employeeSchema match {
    case "public" =>
      NamingStrategy(defaultNamingStrategy, new SchemaNamingStrategy("public"))

    case schema =>
      NamingStrategy(defaultNamingStrategy, new SchemaNamingStrategy(schema)) 
  }

@getquill/maintainers

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
1 participant