Compare ZonedDateTime in ZIO Quill

439 Views Asked by At

I'm getting an error trying to filter based on ZonedDateTime using >. It works with ==.

I'm using scala 3.2.0 and Quill 4.6.0.

It seems it should work based on the Quill Docs. What could be missing?

case class Post(id: Long, createdAt: ZonedDateTime)

import io.getquill.*
import io.getquill.extras.ZonedDateTimeOps

def getUpdated(since: ZonedDateTime): Task[List[Post]] = {
    run {
      query[Post]
        .filter(_.createdAt > lift(since))
    }
      .provideEnvironment(ZEnvironment(dataSource))
  }

I'm getting the following error message.

[error]    |s"==== Tree cannot be parsed to 'Ast' ====
[error]    |  ZonedDateTimeOps(_$7.createdAt)
[error]    |==== Extractors ===
[error]    |  Apply(Ident("ZonedDateTimeOps"), List(Select(Ident("_$7"), "createdAt")))
[error]    |==== Stacktrace ===
[error]    |  java.base/java.lang.Thread.getStackTrace(Thread.java:1610)
[error]    |  io.getquill.parser.engine.failParse$.apply(failParse.scala:27)
[error]    |  io.getquill.parser.engine.failParse$.apply(failParse.scala:12)
[error]    |  io.getquill.parser.engine.Parser.error(Parser.scala:10)
[error]    |  io.getquill.parser.engine.Parser.error$(Parser.scala:7)
[error]    |  io.getquill.parser.engine.ParserChain$$anon$1.error(ParserChain.scala:15)
[error]    |  io.getquill.parser.engine.Parser.apply$$anonfun$1(Parser.scala:9)
[error]    |  scala.Option.getOrElse(Option.scala:201)
[error]    |  io.getquill.parser.engine.Parser.apply(Parser.scala:9)
[error]    |  io.getquill.parser.engine.Parser.apply$(Parser.scala:7)
[error]    |  io.getquill.parser.engine.ParserChain$$anon$1.apply(ParserChain.scala:15)
[error]    |  io.getquill.parser.OperationsParser$$anon$20.applyOrElse(Parser.scala:889)
[error]    |  io.getquill.parser.OperationsParser$$anon$20.applyOrElse(Parser.scala:875)
[error]    |  scala.PartialFunction$Lifted.apply(PartialFunction.scala:313)
[error]    |  scala.PartialFunction$Lifted.apply(PartialFunction.scala:309)
[error]    |  io.getquill.parser.engine.ParserChain$.io$getquill$parser$engine$ParserChain$OrElse$$anon$2$$_$$anonfun$1$$anonfun$1(ParserChain.scala:43)
[error]    |  scala.Option.orElse(Option.scala:477)
[error]    |  io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43)
[error]    |  scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338)
[error]    |  scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
[error]    |  io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43)
[error]    |  scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338)
[error]    |  scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
[error]    |  io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43)
[error]    |  scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338)
[error]    |  scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
[error]    |  io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43)
[error]    |  scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338)
[error]    |  scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
[error]    |  io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43)
[error]    |  scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338)
[error]    |  scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
[error]    |  io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43)
[error]    |  scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338)
[error]    |  scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
[error]    |  io.getquill.parser.engine.Parser.apply(Parser.scala:9)
[error]    |  io.getquill.parser.engine.Parser.apply$(Parser.scala:7)
[error]    |  io.getquill.parser.engine.ParserChain$$anon$1.apply(ParserChain.scala:15)
[error]    |  io.getquill.parser.QueryParser$$anon$13.applyOrElse(Parser.scala:540)
[error]    |  io.getquill.parser.QueryParser$$anon$13.applyOrElse(Parser.scala:520)
[error]    |  scala.PartialFunction$Lifted.apply(PartialFunction.scala:313)
[error]    |  scala.PartialFunction$Lifted.apply(PartialFunction.scala:309)
[error]    |  io.getquill.parser.engine.ParserChain$.io$getquill$parser$engine$ParserChain$OrElse$$anon$2$$_$$anonfun$1$$anonfun$1(ParserChain.scala:43)
[error]    |  scala.Option.orElse(Option.scala:477)
[error]    |  io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43)
[error]    |  scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338)
[error]    |  scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
[error]    |  io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43)
[error]    |  scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338)
[error]    |  scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
1

There are 1 best solutions below

0
On

I don't know if you solved this already, but replying here out of posterity.

Apparently you have to define your own inline compare functions, like this:

extension (inline date: ZonedDateTime)
    inline def >(inline other: ZonedDateTime) = quote { sql"$date > $other".as[Boolean] }
    inline def <(inline other: ZonedDateTime) = quote { sql"$date < $other".as[Boolean] }

See: https://github.com/zio/zio-protoquill/issues/208