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

org.scalaquery.ql.extended.ExtendedProfile.scala Maven / Gradle / Ivy

package org.scalaquery.ql.extended

import scala.math.{min, max}
import org.scalaquery.ql._
import org.scalaquery.ql.TypeMapper._
import org.scalaquery.ql.basic._
import org.scalaquery.session.Session
import org.scalaquery.util.NullaryNode

trait ExtendedProfile extends BasicProfile {
  type ImplicitT <: ExtendedImplicitConversions[_ <: ExtendedProfile]
}

trait ExtendedImplicitConversions[DriverType <: ExtendedProfile] extends BasicImplicitConversions[DriverType] {
  implicit def queryToExtendedQueryOps[E](q: Query[E]) = new ExtendedQueryOps(q)
  implicit def extendedQueryToDeleteInvoker[T](q: Query[ExtendedTable[T]]): BasicDeleteInvoker[T] = new BasicDeleteInvoker(q, scalaQueryDriver)
}

class ExtendedQueryOps[E](q: Query[E]) {
  import ExtendedQueryOps._

  def take(num: Int) = q.createOrReplaceSingularModifier[TakeDrop] {
    case Some(TakeDrop(Some(t), d)) => TakeDrop(Some(min(t, num)), d)
    case Some(TakeDrop(None, d)) => TakeDrop(Some(num), d)
    case _ => TakeDrop(Some(num), None)
  }
  def drop(num: Int) = q.createOrReplaceSingularModifier[TakeDrop] {
    case Some(TakeDrop(Some(t), None)) => TakeDrop(Some(max(0, t-num)), Some(num))
    case Some(TakeDrop(None, Some(d))) => TakeDrop(None, Some(d+num))
    case Some(TakeDrop(Some(t), Some(d))) => TakeDrop(Some(max(0, t-num)), Some(d+num))
    case _ => TakeDrop(None, Some(num))
  }
}

object ExtendedQueryOps {
  final case class TakeDrop(take: Option[Int], drop: Option[Int]) extends QueryModifier with NullaryNode
}

class ExtendedColumnOptions extends BasicColumnOptions {
  val AutoInc = ExtendedColumnOption.AutoInc
}

object ExtendedColumnOptions extends ExtendedColumnOptions

object ExtendedColumnOption {
  case object AutoInc extends ColumnOption[Nothing, ExtendedProfile]
}

abstract class AbstractExtendedTable[T](_tableName: String) extends AbstractBasicTable[T](_tableName) {

  type ProfileType <: ExtendedProfile
  override val O: ExtendedColumnOptions = ExtendedColumnOptions
}

abstract class ExtendedTable[T](_tableName: String) extends AbstractExtendedTable[T](_tableName) {
  type ProfileType = ExtendedProfile
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy