Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
[jdbc-scala] Regex extractor for executed statement, usable with rich…
… pattern: ```scala e/* : QueryExecution */ match { case ~(ExecutedStatement("^SELECT"), (sql, parameters)) => // ... } ```
- Loading branch information
Showing
with
193 additions
and 106 deletions.
- +3 −35 jdbc-scala/src/main/scala/Acolyte.scala
- +53 −0 jdbc-scala/src/main/scala/Execution.scala
- +81 −0 jdbc-scala/src/test/scala/acolyte/ExecutionSpec.scala
- +7 −8 jdbc-scala/src/test/scala/acolyte/ScalaUseCases.scala
- +6 −1 project/Acolyte.scala
- +2 −3 project/JdbcDriver.scala
- +21 −46 project/JdbcScala.scala
- +3 −5 project/ScalacPlugin.scala
- +16 −7 readme.md
- +1 −1 scalac-plugin/readme.md
@@ -0,0 +1,53 @@ | ||
package acolyte | ||
|
||
import acolyte.ParameterMetaData.ParameterDef | ||
|
||
/** Execution information */ | ||
sealed trait Execution { | ||
/** Executed SQL */ | ||
def sql: String | ||
|
||
/** Execution parameters */ | ||
def parameters: List[ExecutedParameter] | ||
} | ||
|
||
case class QueryExecution( | ||
sql: String, parameters: List[ExecutedParameter] = Nil) extends Execution | ||
|
||
case class UpdateExecution( | ||
sql: String, parameters: List[ExecutedParameter] = Nil) extends Execution | ||
|
||
/** Statement extractor */ | ||
case class ExecutedStatement( | ||
/** Statement pattern */ | ||
val p: String) { | ||
|
||
val re = p.r | ||
|
||
def unapply(x: Execution): Option[(String, List[ExecutedParameter])] = | ||
re.findFirstIn(x.sql).map(_ ⇒ (x.sql -> x.parameters)) | ||
} | ||
|
||
sealed trait ExecutedParameter { def value: Any } | ||
|
||
/** Executed parameter companion */ | ||
object ExecutedParameter { | ||
def apply(v: Any): ExecutedParameter = | ||
new ExecutedParameter { val value = v } | ||
|
||
def unapply(p: ExecutedParameter): Option[Any] = Some(p.value) | ||
} | ||
|
||
/** Parameter along with its definition. */ | ||
case class DefinedParameter( | ||
value: Any, definition: ParameterDef) extends ExecutedParameter { | ||
|
||
override lazy val toString = s"Param($value, ${definition.sqlTypeName})" | ||
} | ||
|
||
/** Value extractor for execution parameter. */ | ||
@deprecated( | ||
message = "Use [[acolyte.ExecutedParameter]] extractor", since = "1.0.15") | ||
object ParameterVal { | ||
def unapply(p: ExecutedParameter): Option[Any] = ExecutedParameter.unapply(p) | ||
} |
@@ -0,0 +1,81 @@ | ||
package acolyte | ||
|
||
import acolyte.{ ExecutedParameter ⇒ XP } | ||
|
||
object ExecutionSpec extends org.specs2.mutable.Specification { | ||
"Execution" title | ||
|
||
"Query execution" >> { | ||
val (q1, q2) = ( | ||
QueryExecution("SELECT * FROM Test WHERE id = ?", XP("x") :: Nil), | ||
QueryExecution("EXEC reindex")) | ||
|
||
"Query #1" should { | ||
"match case class pattern" in { | ||
q1 aka "q1" must beLike { | ||
case QueryExecution("SELECT * FROM Test WHERE id = ?", | ||
XP("x") :: Nil) ⇒ ok | ||
} | ||
} | ||
|
||
"not match case class pattern" in { | ||
q1 aka "q1" must not(beLike { | ||
case QueryExecution("EXEC reindex", Nil) ⇒ ok | ||
}) | ||
} | ||
|
||
"match statement extractor #1" in { | ||
q1 aka "q1" must beLike { | ||
case ~(ExecutedStatement("FROM Test"), (sql, XP("x") :: Nil)) ⇒ | ||
sql aka "matching SQL" must_== "SELECT * FROM Test WHERE id = ?" | ||
} | ||
} | ||
|
||
"match statement extractor #2" in { | ||
q1 aka "q1" must beLike { | ||
case ~(ExecutedStatement("^SELECT"), (sql, _)) ⇒ ok | ||
} | ||
} | ||
|
||
"not match statement extractor" in { | ||
q1 aka "q1" must not(beLike { | ||
case ~(ExecutedStatement(" reindex$"), (_, XP("x") :: Nil)) ⇒ ok | ||
}) | ||
} | ||
} | ||
|
||
"Query #2" should { | ||
"match case class pattern" in { | ||
q2 aka "q2" must beLike { | ||
case QueryExecution("EXEC reindex", Nil) ⇒ ok | ||
} | ||
} | ||
|
||
"not match case class pattern" in { | ||
q2 aka "q2" must not(beLike { | ||
case QueryExecution("SELECT * FROM Test WHERE id = ?", | ||
XP("x") :: Nil) ⇒ ok | ||
}) | ||
} | ||
|
||
"match statement extractor #1" in { | ||
q2 aka "q2" must beLike { | ||
case ~(ExecutedStatement("EXEC"), (sql, Nil)) ⇒ | ||
sql aka "matching SQL" must_== "EXEC reindex" | ||
} | ||
} | ||
|
||
"match statement extractor #2" in { | ||
q2 aka "q2" must beLike { | ||
case ~(ExecutedStatement(" reindex$"), (sql, _)) ⇒ ok | ||
} | ||
} | ||
|
||
"not match statement extractor" in { | ||
q2 aka "q2" must not(beLike { | ||
case ~(ExecutedStatement("^SELECT"), (_, Nil)) ⇒ ok | ||
}) | ||
} | ||
} | ||
} | ||
} |
Oops, something went wrong.