Skip to content

Instantly share code, notes, and snippets.

@kmizu
Created August 15, 2011 17:07
Show Gist options
  • Save kmizu/1147209 to your computer and use it in GitHub Desktop.
Save kmizu/1147209 to your computer and use it in GitHub Desktop.
Result of diff -u applied to SqlManager.scala in mirage-scala.
--- SqlManager.scala.orig 2011-08-16 01:40:50.603000000 +0900
+++ SqlManager.scala 2011-08-16 02:04:16.069118600 +0900
@@ -8,10 +8,7 @@
/**
* SqlManager wrapper for Scala.
*/
-class SqlManager(sqlManager: jp.sf.amateras.mirage.SqlManagerImpl) {
-
- // TODO もう少しいい初期化の方法はないかなぁ
- BeanDescFactoryInitializer.initialize()
+class SqlManager private(sqlManager: SqlManagerImpl) {
def getSingleResult[T](clazz: Class[T], sql: SqlProvider, param: AnyRef = null): Option[T] = {
val node: Node = new SqlParserImpl(sql.getSql()).parse()
@@ -35,9 +32,7 @@
}
}
- def iterate[T, R](clazz: Class[T], sql: SqlProvider) (callback: (T) => R): R = iterate(clazz, sql, null) (callback)
-
- def iterate[T, R](clazz: Class[T], sql: SqlProvider, param: AnyRef) (callback: (T) => R): R = {
+ def iterate[T, R](clazz: Class[T], sql: SqlProvider, param: AnyRef = null) (callback: (T) => R): R = {
val node: Node = new SqlParserImpl(sql.getSql()).parse()
val context: SqlContext = prepareSqlContext(convertParam(param))
node.accept(context)
@@ -48,11 +43,11 @@
def iterate[T, R](clazz: Class[T], sql: SqlProvider, context: R) (callback: (T, R) => R): R = iterate(clazz, sql, null, context) (callback)
def iterate[T, R](clazz: Class[T], sql: SqlProvider, param: AnyRef, context: R) (callback: (T, R) => R): R = {
- val node: Node = new SqlParserImpl(sql.getSql()).parse()
- val sqlContext: SqlContext = prepareSqlContext(convertParam(param))
- node.accept(sqlContext)
-
- getSqlExecutor.iterate(clazz, new IterationCallbackAdapterWithContext(callback, context), sqlContext.getSql, sqlContext.getBindVariables)
+ var result = context
+ iterate(clazz, sql, param){t =>
+ result = callback(t, result)
+ result
+ }
}
def executeUpdate(sql: SqlProvider, param: AnyRef = null): Int = {
@@ -69,7 +64,7 @@
node.accept(context)
val countSql: String = sqlManager.getDialect.getCountSql(context.getSql);
- getSqlExecutor.getSingleResult(classOf[java.lang.Integer], countSql, context.getBindVariables).intValue
+ getSqlExecutor.getSingleResult(classOf[java.lang.Integer], countSql, context.getBindVariables).intValue
}
// TODO AnyじゃなくてObject?
@@ -80,7 +75,7 @@
* @return the entity. If the entity which corresponds to the given primary key is not found, this method returns None.
*/
def findEntity[T](clazz: Class[T], id: Any*): Option[T] = {
- Option(sqlManager.findEntity(clazz, id.map {e => e.asInstanceOf[java.lang.Object]}: _*))
+ Option(sqlManager.findEntity(clazz, id.map {_.asInstanceOf[AnyRef]}: _*))
}
/**
@@ -107,13 +102,10 @@
/**
* パラメータがScalaのMapだったらjava.util.Mapに変換します。
*/
- private def convertParam(param: AnyRef): AnyRef =
- if(param.isInstanceOf[Map[String, _]]){
- val map: java.util.Map[String, _] = param.asInstanceOf[Map[String, _]]
- map
- } else {
- param
- }
+ private def convertParam(param: AnyRef): AnyRef = param match {
+ case map: Map[String, _] => (map:java.util.Map[String, _])
+ case params => params
+ }
// TODO リフレクション以外に方法はない??
private def getSqlExecutor: SqlExecutor = {
@@ -123,7 +115,7 @@
}
// TODO やるならここもリフレクションにしたほうがいいかも
- // TODO SqlManagerImplを継承すればprepareSqlContext()を直接呼び出せるけど…
+ // TODO SqlManagerImplを継承すればprepareSqlContext()を直接呼び出せるけど…
private def prepareSqlContext(param: AnyRef): SqlContext = {
val method = classOf[SqlManagerImpl].getDeclaredMethod("prepareSqlContext", classOf[Object])
method.setAccessible(true)
@@ -136,15 +128,10 @@
private class IterationCallbackAdapter[T, R](val callback: (T) => R) extends IterationCallback[T, R] {
def iterate(entity: T): R = callback(entity)
}
+}
- /**
- * イテレーション検索で使用するコールバック関数のアダプタ(引数あり)。
- */
- private class IterationCallbackAdapterWithContext[T, R](val callback: (T, R) => R, var context: R) extends IterationCallback[T, R] {
- def iterate(entity: T): R = {
- context = callback(entity, context)
- return context
- }
- }
+object SqlManager {
+ BeanDescFactoryInitializer.initialize() //It is called only once.
+ def apply(sqlManager: SqlManagerImpl): SqlManager = new SqlManager(sqlManager)
+}
-}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment