[FIXED] ZIO Quill: Wie kann man Operationen verallgemeinern, die von verschiedenen Entitäten geteilt werden?

Ausgabe

Nehmen wir an, wir haben zwei folgende Fallklassen:

case class Person(name:String, age:Int, createdAt:LocalDate, lastModified:LocalDate)
case class Address(street:String, zip:Int, createdAt:LocalDate, lastModified:LocalDate)

Ich möchte folgendes können:

for {
    p <- query[Person]
           .changedAfter(lift(LocalDate.of(2022,1,1)))
    a <- query[Address].join(a => a.ownerId == p.id)
            .changedAfter(lift(LocalDate.of(2022,1,1)))
} yield (p, a)

Where .changedAfter()funktioniert für jede Entität, die Felder createdAtund enthält.lastModified

Wie würde ich weitermachen, um eine solche Modifikation zu erstellen?

Lösung

Sie können eine solche Erweiterungsmethode erstellen.

import io.getquill._
import java.time._

val ctx = new SqlMirrorContext(PostgresDialect, SnakeCase)

import ctx._

trait EntityLike {
  val createAt: LocalDate
  val lastModified: LocalDate
}

case class Person(name: String, age: Int, createAt: LocalDate, lastModified: LocalDate) extends EntityLike


implicit class EntityOps[A <: EntityLike](q: Query[A]) {
  val changeAfter = quote { (d: LocalDate) =>
    q.filter(e => infix"${e.createAt} < ${d}".as[Boolean])
  }
}
val d = LocalDate.of(2000, 1, 1)
val m = ctx.run(query[Person].changeAfter(lift(d)))

println(m)


Beantwortet von –
jilen


Antwort geprüft von –
Willingham (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like

[FIXED] Long zu HexString

Ausgabe Ich habe das folgende Scala-Snippet: someLong.formatted("%016x") Als Ergebnis erhalte ich den Hex-String. Ich musste jedoch die Scala-Version…