Skip to content

Instantly share code, notes, and snippets.

@cvogt
Created May 17, 2014 20:04
  • Star 9 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save cvogt/d9049c63fc395654c4b4 to your computer and use it in GitHub Desktop.
This code implements a facility for Slick 2.0 to inject custom SQL instead of the Slick produced SQL to be used when running a query
import scala.slick.lifted.{TableQuery => _}
import scala.slick.ast._
import scala.slick.driver._
import scala.language.implicitConversions
/** Extends QueryInvoker to allow overriding used SQL statement when executing a query */
trait OverridingInvoker extends JdbcDriver{
// get the extended QueryInvoker into the .simple._ implicits
override val Implicit: Implicits = new Implicits
override val simple: Implicits with SimpleQL = new Implicits with SimpleQL
class Implicits extends super.Implicits {
override implicit def queryToAppliedQueryInvoker[U](q: Query[_,U])
= super.queryToAppliedQueryInvoker(q: Query[_,U]).asInstanceOf[UnitQueryInvoker[U]]
}
override def createUnitQueryInvoker[R](tree: Node): UnitQueryInvoker[R] = new UnitQueryInvoker[R](tree)
// extended QueryInvoker
class UnitQueryInvoker[R](n: Node) extends super.UnitQueryInvoker[R](n) {
def overrideSql(sql: String) = new PatchedUnitQueryInvoker[R](sql,n)
}
// QueryInvokers that patch the used SQL
class PatchedUnitQueryInvoker[U](sql:String, n: Node) extends UnitQueryInvoker[U](n){
override def getStatement = sql
}
}
// Create a custom MySQL driver patching in the Overriding invoker
object CustomMySQLDriver extends MySQLDriver with OverridingInvoker
object Main extends App{
// Import stuff from the patched driver instead of the default
import CustomMySQLDriver.simple._
// please fill in jdbc connection url and driver
Database.forURL("...", driver = "...") withSession {
// tamper with SQL statement
val munged = Query(Suppliers).selectStatement + " where SUP_ID = 49"
// inject munged version
println(Query(Suppliers).overrideSql(munged).list)
}
}
@Maiakov
Copy link

Maiakov commented Jul 9, 2018

why not present in slick 3+ ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment