New ScalaQuery Features
Monday, December 21st, 2009It’s been almost 3 months since my last summary of new features in ScalaQuery. I implemented some important changes in the following weeks but I only had little time to work on ScalaQuery after my extended one-month vacation ended in October.
Build system
Builds against newer versions of Scala 2.8 have been going well thanks to sbt 0.6 which separates the Scala version used by the build system from the version used by the project being built. You need to use at least version 0.6.7 of the new xsbt launcher to build ScalaQuery. Other dependencies are downloaded automatically by sbt. I wrote an implementation of sbt’s test interface for JUnit which you can find here (binaries are here on scala-tools.org). It allows you to run ScalaQuery’s JUnit test cases from sbt with the test command.
All published artifacts now contain the Scala version in the artifact ID. You can find the latest ScalaQuery snapshot in scala-tools.org’s snapshots repository as:
- groupId:
- com.novocode
- artifactId:
- scala-query_2.8.0.Beta1-RC4
- version:
- 1.0.0-SNAPSHOT
- String column concatenation (with the
++operator) and thestartsWithandendsWithmethods on String columns have been moved up toBasicProfile. - Escape characters for LIKE expressions are added to the queries.
- You can add other functions to be called with the
{fn ...}syntax throughSimpleScalarFunction()andSimpleScalarFunction.nullary(). - Various scalar functions are supported:
CONVERT,USER,DATABASE,CURDATE,CURTIME,PI,MOD,ABS,CEILING,FLOOR,SIGN,DEGREES,RADIANS,IFNULL,UCASE,LCASE,LTRIM,RTRIM. - Literals for
Date,TimeandTimestampvalues use the JDBC escape syntax. - Explicit inner, left outer, right outer and full outer joins are supported. For example:
- String columns are created as VARCHAR(254) by default (except in H2 where no size is needed).
- The operators
===and!=can be used instead of is and isNot. They have the proper precedence when used with other operators like&&and||.
JDBC escape syntax
ScalaQuery now uses JDBC escape syntax and scalar functions where possible for better portability between DB engines:
val q = for {
Join(c,p) <- Categories innerJoin Posts on (_.id is _.category)
_ <- Query orderBy p.id
} yield p.id ~ c.id ~ c.name ~ p.title
Complex inserts
Queries and columns can now be inserted into tables (using SQL’s INSERT...SELECT syntax). This allows you to use scalar functions when inserting individual records and to copy data produced by a query. For example:
val q2 = for(s <- Src1 if s.id <= 2) yield s Dst2.insert(q2)