Funktionen höherer Ordnung mit Scala Slick für DRY goodness

Ich habe eine Idee, wie meine Datenzugriffsebene mit Scala Slick aussehen soll, bin mir aber nicht sicher, ob dies wirklich möglich ist.

Nehmen wir an, ich habe eine Benutzertabelle mit den üblichen Feldern wie ID, E-Mail, Passwort usw.

  object Users extends Table[(String, String, Option[String], Boolean)]("User") {
    def id = column[String]("id", O.PrimaryKey)
    def email = column[String]("email")
    def password = column[String]("password")
    def active = column[Boolean]("active")
    def * = id ~ email ~ password.? ~ active
  }

Und ich möchte sie auf verschiedene Arten abfragen. Derzeit ist es hässlich, eine neue Datenbanksitzung zu haben, das zu verstehen und dann verschiedene if-Anweisungen auszuführen, um das zu erreichen, was ich will.

z.B.

  def getUser(email: String, password: String): Option[User] = {
    database withSession { implicit session: Session =>
      val queryUser = (for {
        user <- Users
          if user.email === email &&
             user.password === password &&
             user.active === true
      } //yield and map to user class, etc...
  }

  def getUser(identifier: String): Option[User] = {
    database withSession { implicit session: Session =>
      val queryUser = (for {
        user <- Users
        if user.id === identifier &&
           user.active === true
      } //yield and map to user class, etc...
  }

Ich würde es vorziehen, eine private Methode für die Abfrage und dann öffentliche Methoden zu haben, die Abfragen nach dem Muster von definieren

type UserQuery = User => Boolean

private def getUserByQuery(whereQuery: UserQuery): Option[User] = {
  database withSession { implicit session: Session =>
      val queryUser = (for {
        user <- Users
          somehow run whereQuery here to filter
      } // yield and boring stuff
  }

def getUserByEmailAndPassword(email, pass){ ... define by query and call getUserByQuery ...}

getUserById(id){….}

getUserByFoo{….} 

Auf diese Weise ist die Abfragelogik in den relevanten öffentlichen Funktionen gekapselt und das tatsächliche Abfragen und Zuordnen zum Benutzerobjekt ist eine wiederverwendbare Funktion, mit der sich andere Personen nicht befassen müssen.

Das Problem, das ich habe, ist der Versuch, das "Wo" -Bit in Funktionen umzugestalten, die ich weitergeben kann. Der Versuch, Dinge wie diese in Intellij auszuwählen und das Refactoring zu verwenden, führt zu ziemlich verrückten Tippvorgängen.

Hat jemand Beispiele, die nahe an dem liegen, was ich erreichen möchte?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage