All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.scalaquery.ql.Case.scala Maven / Gradle / Ivy

package org.scalaquery.ql

import org.scalaquery.util.{Node, BinaryNode}

object Case {

  class WhenNode(val left: Node, val right: Node) extends BinaryNode

  abstract class CaseColumn[T : TypeMapper](val clauses: List[WhenNode], val elseClause: Node) extends Column[T] {
    def nodeChildren = elseClause :: clauses
  }

  def when[C <: Column[_] : CanBeQueryCondition](cond: C) = new UntypedWhen(Node(cond))

  class UntypedWhen(cond: Node) {
    def then[B : BaseTypeMapper](res: Column[B]) = new TypedCase[B,B](new WhenNode(cond, Node(res)) :: Nil)
    def then[B](res: Column[Option[B]]) = res.typeMapper match {
      case tmt: OptionTypeMapper[_] =>
        new TypedCase[B,Option[B]](new WhenNode(cond, Node(res)) :: Nil)(tmt.base, tmt)
    }
  }

  class TypedCase[B : TypeMapper, T : TypeMapper](clauses: List[WhenNode])
  extends CaseColumn[Option[B]](clauses, ConstColumn.NULL) {
    def when[C <: Column[_] : CanBeQueryCondition](cond: C) = new TypedWhen[B,T](cond, this)
    def otherwise(res: Column[T]): Column[T] = new TypedCaseWithElse[T](clauses, Node(res))
  }

  class TypedWhen[B : TypeMapper, T : TypeMapper](cond: Node, parent: TypedCase[B,T]) {
    def then(res: Column[T]) = new TypedCase[B,T](new WhenNode(cond, Node(res)) :: parent.clauses)
  }

  class TypedCaseWithElse[T : TypeMapper](clauses: List[WhenNode], elseClause: Node) extends CaseColumn[T](clauses, elseClause)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy