Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add an Hook that converts user defined types to JDBC primitive types #423

Merged
merged 1 commit into from Apr 20, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 10 additions & 5 deletions project/Build.scala
Expand Up @@ -121,6 +121,7 @@ object ScalikeJDBCProjects extends Build {
libraryDependencies ++= {
Seq(
// scope: compile
"org.scala-lang" % "scala-reflect" % scalaVersion.value,
"org.apache.commons" % "commons-dbcp2" % "2.1.1" % "compile",
"org.slf4j" % "slf4j-api" % _slf4jApiVersion % "compile",
"joda-time" % "joda-time" % "2.9.2" % "compile",
Expand All @@ -136,9 +137,17 @@ object ScalikeJDBCProjects extends Build {
) ++ (CrossVersion.partialVersion(scalaVersion.value) match {
case Some((2, scalaMajor)) if scalaMajor >= 11 =>
Seq("org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.4" % "compile")
case Some((2, 10)) =>
libraryDependencies.value ++ Seq(
compilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full),
"org.scalamacros" %% "quasiquotes" % "2.1.0" cross CrossVersion.binary)
case _ =>
Nil
}) ++ scalaTestDependenciesInTestScope(scalatestVersion.value) ++ jdbcDriverDependenciesInTestScope
},
unmanagedSourceDirectories in Compile <+= (scalaVersion, sourceDirectory in Compile){(v, dir) =>
if (v.startsWith("2.10")) dir / "scala2.10"
else dir / "scala2.11"
}
)
)
Expand Down Expand Up @@ -275,17 +284,13 @@ object ScalikeJDBCProjects extends Build {
"ch.qos.logback" % "logback-classic" % _logbackVersion % "test",
"org.hibernate" % "hibernate-core" % _hibernateVersion % "test"
) ++ scalaTestDependenciesInTestScope(scalatestVersion.value) ++ jdbcDriverDependenciesInTestScope ++ macroDependenciesInCompileScope(scalaVersion.value)
},
unmanagedSourceDirectories in Compile <+= (scalaVersion, sourceDirectory in Compile){(v, dir) =>
if (v.startsWith("2.10")) dir / "scala2.10"
else dir / "scala2.11"
}
)
) dependsOn(scalikejdbcLibrary)

def macroDependenciesInCompileScope(scalaVersion: String) = {
if (scalaVersion.startsWith("2.10")) Seq(
"org.scalamacros" %% "quasiquotes" % "2.1.0" % "compile",
"org.scalamacros" % "quasiquotes_2.10" % "2.1.0" % "compile",
compilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)
) else Seq()
}
Expand Down
40 changes: 20 additions & 20 deletions project/GenerateOneToManies.scala
Expand Up @@ -80,27 +80,27 @@ s" to$i.map(t => Vector(t)).getOrElse(Vector.empty)"

class OneToManies${n}SQL[A, $bs, E <: WithExtractor, Z](
override val statement: String,
override val parameters: Seq[Any])(one: WrappedResultSet => A)($resultSetToOptions)(extractor: (A, $seq) => Z)
extends SQL[Z, E](statement, parameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toManies(RS => Option[B1]...)) is specified, use #map((A,B) =>Z) instead."))
override private[scalikejdbc] val rawParameters: Seq[Any])(one: WrappedResultSet => A)($resultSetToOptions)(extractor: (A, $seq) => Z)
extends SQL[Z, E](statement, rawParameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toManies(RS => Option[B1]...)) is specified, use #map((A,B) =>Z) instead."))
with AllOutputDecisionsUnsupported[Z, E] {

def map(extractor: (A, $seq) => Z): OneToManies${n}SQL[A, $bs, HasExtractor, Z] = {
new OneToManies${n}SQL(statement, parameters)(one)($to)(extractor)
new OneToManies${n}SQL(statement, rawParameters)(one)($to)(extractor)
}
override def toTraversable(): OneToManies${n}SQLToTraversable[A, $bs, E, Z] = {
new OneToManies${n}SQLToTraversable[A, $bs, E, Z](statement, parameters)(one)($to)(extractor)
new OneToManies${n}SQLToTraversable[A, $bs, E, Z](statement, rawParameters)(one)($to)(extractor)
}
override def toList(): OneToManies${n}SQLToList[A, $bs, E, Z] = {
new OneToManies${n}SQLToList[A, $bs, E, Z](statement, parameters)(one)($to)(extractor)
new OneToManies${n}SQLToList[A, $bs, E, Z](statement, rawParameters)(one)($to)(extractor)
}
override def toOption(): OneToManies${n}SQLToOption[A, $bs, E, Z] = {
new OneToManies${n}SQLToOption[A, $bs, E, Z](statement, parameters)(one)($to)(extractor)(true)
new OneToManies${n}SQLToOption[A, $bs, E, Z](statement, rawParameters)(one)($to)(extractor)(true)
}
override def headOption(): OneToManies${n}SQLToOption[A, $bs, E, Z] = {
new OneToManies${n}SQLToOption[A, $bs, E, Z](statement, parameters)(one)($to)(extractor)(false)
new OneToManies${n}SQLToOption[A, $bs, E, Z](statement, rawParameters)(one)($to)(extractor)(false)
}
override def toCollection: OneToManies${n}SQLToCollection[A, $bs, E, Z] = {
new OneToManies${n}SQLToCollection[A, ${bs}, E, Z](statement, parameters)(one)($to)(extractor)
new OneToManies${n}SQLToCollection[A, ${bs}, E, Z](statement, rawParameters)(one)($to)(extractor)
}

override def single(): OneToManies${n}SQLToOption[A, $bs, E, Z] = toOption()
Expand All @@ -112,16 +112,16 @@ class OneToManies${n}SQL[A, $bs, E <: WithExtractor, Z](

class OneToManies${n}SQLToList[A, $bs, E <: WithExtractor, Z](
override val statement: String,
override val parameters: Seq[Any])(one: WrappedResultSet => A)($resultSetToOptions)(extractor: (A, $seq) => Z)
extends SQL[Z, E](statement, parameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toManies(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
override private[scalikejdbc] val rawParameters: Seq[Any])(one: WrappedResultSet => A)($resultSetToOptions)(extractor: (A, $seq) => Z)
extends SQL[Z, E](statement, rawParameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toManies(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
with SQLToList[Z, E]
with AllOutputDecisionsUnsupported[Z, E]
with OneToManies${n}Extractor[A, $bs, E, Z] {

import GeneralizedTypeConstraintsForWithExtractor._

override def apply()(implicit session: DBSession, context: ConnectionPoolContext = NoConnectionPoolContext, hasExtractor: ThisSQL =:= SQLWithExtractor): List[Z] = {
executeQuery[List](session, (session: DBSession) => toTraversable(session, statement, parameters, extractor).toList)
executeQuery[List](session, (session: DBSession) => toTraversable(session, statement, rawParameters, extractor).toList)
}

$extractOne
Expand All @@ -131,16 +131,16 @@ $transform

final class OneToManies${n}SQLToCollection[A, $bs, E <: WithExtractor, Z] private[scalikejdbc](
override val statement: String,
override val parameters: Seq[Any])(one: WrappedResultSet => A)($resultSetToOptions)(extractor: (A, $seq) => Z)
extends SQL[Z, E](statement, parameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toManies(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
override private[scalikejdbc] val rawParameters: Seq[Any])(one: WrappedResultSet => A)($resultSetToOptions)(extractor: (A, $seq) => Z)
extends SQL[Z, E](statement, rawParameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toManies(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
with SQLToCollection[Z, E]
with AllOutputDecisionsUnsupported[Z, E]
with OneToManies${n}Extractor[A, $bs, E, Z] {

import GeneralizedTypeConstraintsForWithExtractor._

override def apply[C[_]]()(implicit session: DBSession, context: ConnectionPoolContext = NoConnectionPoolContext, hasExtractor: ThisSQL =:= SQLWithExtractor, cbf: CanBuildFrom[Nothing, Z, C[Z]]): C[Z] = {
executeQuery(session, (session: DBSession) => toTraversable(session, statement, parameters, extractor).to[C])
executeQuery(session, (session: DBSession) => toTraversable(session, statement, rawParameters, extractor).to[C])
}

$extractOne
Expand All @@ -150,16 +150,16 @@ $transform

class OneToManies${n}SQLToTraversable[A, $bs, E <: WithExtractor, Z](
override val statement: String,
override val parameters: Seq[Any])(one: WrappedResultSet => A)($resultSetToOptions)(extractor: (A, $seq) => Z)
extends SQL[Z, E](statement, parameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toMany(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
override private[scalikejdbc] val rawParameters: Seq[Any])(one: WrappedResultSet => A)($resultSetToOptions)(extractor: (A, $seq) => Z)
extends SQL[Z, E](statement, rawParameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toMany(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
with SQLToTraversable[Z, E]
with AllOutputDecisionsUnsupported[Z, E]
with OneToManies${n}Extractor[A, $bs, E, Z] {

import GeneralizedTypeConstraintsForWithExtractor._

override def apply()(implicit session: DBSession, context: ConnectionPoolContext = NoConnectionPoolContext, hasExtractor: ThisSQL =:= SQLWithExtractor): Traversable[Z] = {
executeQuery[Traversable](session, (session: DBSession) => toTraversable(session, statement, parameters, extractor))
executeQuery[Traversable](session, (session: DBSession) => toTraversable(session, statement, rawParameters, extractor))
}

$extractOne
Expand All @@ -169,15 +169,15 @@ $transform

class OneToManies${n}SQLToOption[A, $bs, E <: WithExtractor, Z](
override val statement: String,
override val parameters: Seq[Any])(one: WrappedResultSet => A)($resultSetToOptions)(extractor: (A, $seq) => Z)(protected val isSingle: Boolean = true)
extends SQL[Z, E](statement, parameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toMany(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
override private[scalikejdbc] val rawParameters: Seq[Any])(one: WrappedResultSet => A)($resultSetToOptions)(extractor: (A, $seq) => Z)(protected val isSingle: Boolean = true)
extends SQL[Z, E](statement, rawParameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toMany(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
with SQLToOption[Z, E]
with AllOutputDecisionsUnsupported[Z, E]
with OneToManies${n}Extractor[A, $bs, E, Z] {

import GeneralizedTypeConstraintsForWithExtractor._
override def apply()(implicit session: DBSession, context: ConnectionPoolContext = NoConnectionPoolContext, hasExtractor: ThisSQL =:= SQLWithExtractor): Option[Z] = {
executeQuery[Option](session, (session: DBSession) => toSingle(toTraversable(session, statement, parameters, extractor)))
executeQuery[Option](session, (session: DBSession) => toSingle(toTraversable(session, statement, rawParameters, extractor)))
}

$extractOne
Expand Down
42 changes: 21 additions & 21 deletions scalikejdbc-core/src/main/scala/scalikejdbc/OneToManies2SQL.scala
Expand Up @@ -30,7 +30,7 @@ private[scalikejdbc] trait OneToManies2Extractor[A, B1, B2, E <: WithExtractor,
}

private[scalikejdbc] def toTraversable(session: DBSession, sql: String, params: Seq[_], extractor: (A, Seq[B1], Seq[B2]) => Z): Traversable[Z] = {
session.foldLeft(statement, parameters: _*)(LinkedHashMap[A, (Seq[B1], Seq[B2])]())(processResultSet).map {
session.foldLeft(statement, rawParameters: _*)(LinkedHashMap[A, (Seq[B1], Seq[B2])]())(processResultSet).map {
case (one, (t1, t2)) => extractor(one, t1, t2)
}
}
Expand All @@ -39,28 +39,28 @@ private[scalikejdbc] trait OneToManies2Extractor[A, B1, B2, E <: WithExtractor,

class OneToManies2SQL[A, B1, B2, E <: WithExtractor, Z](
override val statement: String,
override val parameters: Seq[Any]
override private[scalikejdbc] val rawParameters: Seq[Any]
)(one: WrappedResultSet => A)(to1: WrappedResultSet => Option[B1], to2: WrappedResultSet => Option[B2])(extractor: (A, Seq[B1], Seq[B2]) => Z)
extends SQL[Z, E](statement, parameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toMany(RS => Option[B])) is specified, use #map((A,B) =>Z) instead."))
extends SQL[Z, E](statement, rawParameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toMany(RS => Option[B])) is specified, use #map((A,B) =>Z) instead."))
with AllOutputDecisionsUnsupported[Z, E] {

def map(extractor: (A, Seq[B1], Seq[B2]) => Z): OneToManies2SQL[A, B1, B2, HasExtractor, Z] = {
new OneToManies2SQL(statement, parameters)(one)(to1, to2)(extractor)
new OneToManies2SQL(statement, rawParameters)(one)(to1, to2)(extractor)
}
override def toTraversable(): OneToManies2SQLToTraversable[A, B1, B2, E, Z] = {
new OneToManies2SQLToTraversable[A, B1, B2, E, Z](statement, parameters)(one)(to1, to2)(extractor)
new OneToManies2SQLToTraversable[A, B1, B2, E, Z](statement, rawParameters)(one)(to1, to2)(extractor)
}
override def toList(): OneToManies2SQLToList[A, B1, B2, E, Z] = {
new OneToManies2SQLToList[A, B1, B2, E, Z](statement, parameters)(one)(to1, to2)(extractor)
new OneToManies2SQLToList[A, B1, B2, E, Z](statement, rawParameters)(one)(to1, to2)(extractor)
}
override def toOption(): OneToManies2SQLToOption[A, B1, B2, E, Z] = {
new OneToManies2SQLToOption[A, B1, B2, E, Z](statement, parameters)(one)(to1, to2)(extractor)(true)
new OneToManies2SQLToOption[A, B1, B2, E, Z](statement, rawParameters)(one)(to1, to2)(extractor)(true)
}
override def toCollection: OneToManies2SQLToCollection[A, B1, B2, E, Z] = {
new OneToManies2SQLToCollection[A, B1, B2, E, Z](statement, parameters)(one)(to1, to2)(extractor)
new OneToManies2SQLToCollection[A, B1, B2, E, Z](statement, rawParameters)(one)(to1, to2)(extractor)
}
override def headOption(): OneToManies2SQLToOption[A, B1, B2, E, Z] = {
new OneToManies2SQLToOption[A, B1, B2, E, Z](statement, parameters)(one)(to1, to2)(extractor)(false)
new OneToManies2SQLToOption[A, B1, B2, E, Z](statement, rawParameters)(one)(to1, to2)(extractor)(false)
}
override def single(): OneToManies2SQLToOption[A, B1, B2, E, Z] = toOption()
override def first(): OneToManies2SQLToOption[A, B1, B2, E, Z] = headOption()
Expand All @@ -72,16 +72,16 @@ class OneToManies2SQL[A, B1, B2, E <: WithExtractor, Z](

class OneToManies2SQLToList[A, B1, B2, E <: WithExtractor, Z](
override val statement: String,
override val parameters: Seq[Any]
override private[scalikejdbc] val rawParameters: Seq[Any]
)(one: WrappedResultSet => A)(to1: WrappedResultSet => Option[B1], to2: WrappedResultSet => Option[B2])(extractor: (A, Seq[B1], Seq[B2]) => Z)
extends SQL[Z, E](statement, parameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toMany(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
extends SQL[Z, E](statement, rawParameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toMany(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
with SQLToList[Z, E]
with OneToManies2Extractor[A, B1, B2, E, Z] {

import GeneralizedTypeConstraintsForWithExtractor._

override def apply()(implicit session: DBSession, context: ConnectionPoolContext = NoConnectionPoolContext, hasExtractor: ThisSQL =:= SQLWithExtractor): List[Z] = {
executeQuery[List](session, (session: DBSession) => toTraversable(session, statement, parameters, extractor).toList)
executeQuery[List](session, (session: DBSession) => toTraversable(session, statement, rawParameters, extractor).toList)
}

private[scalikejdbc] def extractOne: WrappedResultSet => A = one
Expand All @@ -92,16 +92,16 @@ class OneToManies2SQLToList[A, B1, B2, E <: WithExtractor, Z](

final class OneToManies2SQLToCollection[A, B1, B2, E <: WithExtractor, Z] private[scalikejdbc] (
override val statement: String,
override val parameters: Seq[Any]
override private[scalikejdbc] val rawParameters: Seq[Any]
)(one: WrappedResultSet => A)(to1: WrappedResultSet => Option[B1], to2: WrappedResultSet => Option[B2])(extractor: (A, Seq[B1], Seq[B2]) => Z)
extends SQL[Z, E](statement, parameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toMany(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
extends SQL[Z, E](statement, rawParameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toMany(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
with SQLToCollection[Z, E]
with OneToManies2Extractor[A, B1, B2, E, Z] {

import GeneralizedTypeConstraintsForWithExtractor._

override def apply[C[_]]()(implicit session: DBSession, context: ConnectionPoolContext = NoConnectionPoolContext, hasExtractor: ThisSQL =:= SQLWithExtractor, cbf: CanBuildFrom[Nothing, Z, C[Z]]): C[Z] = {
executeQuery(session, (session: DBSession) => toTraversable(session, statement, parameters, extractor).to[C])
executeQuery(session, (session: DBSession) => toTraversable(session, statement, rawParameters, extractor).to[C])
}

private[scalikejdbc] def extractOne: WrappedResultSet => A = one
Expand All @@ -112,17 +112,17 @@ final class OneToManies2SQLToCollection[A, B1, B2, E <: WithExtractor, Z] privat

class OneToManies2SQLToTraversable[A, B1, B2, E <: WithExtractor, Z](
override val statement: String,
override val parameters: Seq[Any]
override private[scalikejdbc] val rawParameters: Seq[Any]
)(val one: WrappedResultSet => A)(to1: WrappedResultSet => Option[B1], to2: WrappedResultSet => Option[B2])(extractor: (A, Seq[B1], Seq[B2]) => Z)
extends SQL[Z, E](statement, parameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toMany(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
extends SQL[Z, E](statement, rawParameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toMany(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
with SQLToTraversable[Z, E]
with AllOutputDecisionsUnsupported[Z, E]
with OneToManies2Extractor[A, B1, B2, E, Z] {

import GeneralizedTypeConstraintsForWithExtractor._

override def apply()(implicit session: DBSession, context: ConnectionPoolContext = NoConnectionPoolContext, hasExtractor: ThisSQL =:= SQLWithExtractor): Traversable[Z] = {
executeQuery[Traversable](session, (session: DBSession) => toTraversable(session, statement, parameters, extractor))
executeQuery[Traversable](session, (session: DBSession) => toTraversable(session, statement, rawParameters, extractor))
}

private[scalikejdbc] def extractOne: WrappedResultSet => A = one
Expand All @@ -133,16 +133,16 @@ class OneToManies2SQLToTraversable[A, B1, B2, E <: WithExtractor, Z](

class OneToManies2SQLToOption[A, B1, B2, E <: WithExtractor, Z](
override val statement: String,
override val parameters: Seq[Any]
override private[scalikejdbc] val rawParameters: Seq[Any]
)(one: WrappedResultSet => A)(to1: WrappedResultSet => Option[B1], to2: WrappedResultSet => Option[B2])(extractor: (A, Seq[B1], Seq[B2]) => Z)(protected val isSingle: Boolean = true)
extends SQL[Z, E](statement, parameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toMany(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
extends SQL[Z, E](statement, rawParameters)(SQL.noExtractor[Z]("one-to-many extractor(one(RS => A).toMany(RS => Option[B1])) is specified, use #map((A,B) =>Z) instead."))
with SQLToOption[Z, E]
with AllOutputDecisionsUnsupported[Z, E]
with OneToManies2Extractor[A, B1, B2, E, Z] {

import GeneralizedTypeConstraintsForWithExtractor._
override def apply()(implicit session: DBSession, context: ConnectionPoolContext = NoConnectionPoolContext, hasExtractor: ThisSQL =:= SQLWithExtractor): Option[Z] = {
executeQuery[Option](session, (session: DBSession) => toSingle(toTraversable(session, statement, parameters, extractor)))
executeQuery[Option](session, (session: DBSession) => toSingle(toTraversable(session, statement, rawParameters, extractor)))
}

private[scalikejdbc] def extractOne: WrappedResultSet => A = one
Expand Down