zio / zio-quill

Compile-time Language Integrated Queries for Scala
https://zio.dev/zio-quill
Apache License 2.0
2.15k stars 346 forks source link

scala.collection.immutable.$colon$colon cannot be cast to java.lang.Long #2111

Open david-bouyssie opened 3 years ago

david-bouyssie commented 3 years ago

Version: "io.getquill" %% "quill-jdbc" % "3.6.1" Scala Version: 2.11.12 Module: quill-jdbc Database: postgres 9.x

Expected behavior

Nested contains should work.

Actual behavior

Exception is thrown

Exception in thread "main" java.lang.ClassCastException: scala.collection.immutable.$colon$colon cannot be cast to java.lang.Long
    at scala.runtime.BoxesRunTime.unboxToLong(BoxesRunTime.java:105)
    at io.getquill.context.jdbc.Encoders$$anonfun$7$$anonfun$apply$3.apply(Encoders.scala:50)
    at io.getquill.context.jdbc.Encoders$$anonfun$encoder$2.apply(Encoders.scala:27)
    at io.getquill.context.jdbc.Encoders$$anonfun$encoder$2.apply(Encoders.scala:27)
    at io.getquill.context.jdbc.Encoders$$anonfun$encoder$1.apply(Encoders.scala:22)
    at io.getquill.context.jdbc.Encoders$$anonfun$encoder$1.apply(Encoders.scala:21)
    at io.getquill.context.jdbc.Encoders$JdbcEncoder.apply(Encoders.scala:17)
    at io.getquill.context.jdbc.Encoders$JdbcEncoder.apply(Encoders.scala:15)
    at io.getquill.context.Expand$$anonfun$4$$anonfun$5.apply(Expand.scala:34)
    at io.getquill.context.Expand$$anonfun$4$$anonfun$5.apply(Expand.scala:31)
    at scala.collection.LinearSeqOptimized$class.foldLeft(LinearSeqOptimized.scala:124)
    at scala.collection.immutable.List.foldLeft(List.scala:84)
    at io.getquill.context.Expand$$anonfun$4.apply(Expand.scala:31)
    at io.getquill.context.Expand$$anonfun$4.apply(Expand.scala:30)
    at io.getquill.context.jdbc.JdbcContextBase$$anonfun$executeQuery$1.apply(JdbcContextBase.scala:39)
    at io.getquill.context.jdbc.JdbcContextBase$$anonfun$executeQuery$1.apply(JdbcContextBase.scala:38)
    at io.getquill.context.jdbc.JdbcContextBase$$anonfun$withConnectionWrapped$1$$anonfun$apply$2.apply(JdbcContextBase.scala:28)
    at io.getquill.context.jdbc.JdbcContext$$anon$1.wrap(JdbcContext.scala:31)
    at io.getquill.context.jdbc.JdbcContextBase$$anonfun$withConnectionWrapped$1.apply(JdbcContextBase.scala:28)
    at io.getquill.context.jdbc.JdbcContextBase$$anonfun$withConnectionWrapped$1.apply(JdbcContextBase.scala:28)
    at io.getquill.context.jdbc.JdbcContext$$anonfun$withConnection$1.apply(JdbcContext.scala:61)
    at scala.Option.getOrElse(Option.scala:121)
    at io.getquill.context.jdbc.JdbcContext.withConnection(JdbcContext.scala:59)
    at io.getquill.context.jdbc.JdbcContextBase$class.withConnectionWrapped(JdbcContextBase.scala:28)
    at io.getquill.context.jdbc.JdbcContext.withConnectionWrapped(JdbcContext.scala:15)
    at io.getquill.context.jdbc.JdbcContextBase$class.executeQuery(JdbcContextBase.scala:38)
    at io.getquill.context.jdbc.JdbcContext.executeQuery(JdbcContext.scala:40)

Steps to reproduce the behavior

val q1 = quote {
  query[Person].filter(p => liftQuery(Set(1, 2)).contains(p.id)).map(_.id)
}

val q2 = quote {
  query[Address].filter(a => q1 .contains(a.fk))
}

Note: I didn't use this exact example but it is very similar. I put this example because it is aligned with the documentation.

deusaquilus commented 2 years ago

Do it like this:

val q1 = quote {
  query[Person].filter(p => liftQuery(Set(1, 2)).contains(p.id)).map(_.id)
}

val q2 = quote {
  query[Address].filter(a => q1.filter(id => id == a.fk).nonEmpty)
}

run(q2) 
// SELECT a.fk, a.street FROM Address a WHERE EXISTS (SELECT p.id FROM Person p WHERE p.id IN (?) AND p.id = a.fk)

Also see my response here: https://github.com/zio/zio-quill/issues/1792#issuecomment-1212707398. I either need to write a stateless-transform to get this kind of thing to work or remove/deprecate liftQuery(list).contains(column) in favor of column.inSet(list). I strongly prefer the latter but let me know what you think.

deusaquilus commented 2 years ago

Also, I'm making a Twitter poll on this issue to get a sense of where people are at. Everyone interested please have a look here: https://twitter.com/deusaquilus/status/1557949121612357634