Download - Introducing Troy Scala IO 2016
Introducing TroySchema-safe Cassandra Toolkit
Tamer AbdulRadiSenior Software Engineer at Cake Solutions
/tabdulradi
abdulradi.com
/troy/tabdulradi
/tabdulradi /tabdulradi /troy
Cassandra
• Distributed NoSQL Database
• Cassandra Query Language
/tabdulradi /tabdulradi /troy
Data Modelling
Post Author
Post
authorId K
postId C
postBody
authorName SQueries
/tabdulradi /tabdulradi /troy
CQL Shell
/tabdulradi /tabdulradi /troy
Java Driverdef listByAuthor(authorId: String) = session.executeAsync( """ SELECT post_id, post_title FROM test.posts WHERE author_id = ? """, authorId)
/tabdulradi /tabdulradi /troy
Enter Troyval listByAuthor = withSchema { (authorId: String) => cql""" SELECT post_id, post_title FROM test.posts WHERE author_id = $authorId; “""}
/tabdulradi /tabdulradi /troy
Generated Codeval listByAuthor = { val stmt = session.prepare( """SELECT post_id, post_title FROM test.posts WHERE author_id = ?""") (authorId: String) => bind(stmt, param(authorId).as[CDT.Text])}
/tabdulradi /tabdulradi /troy
Troy Codec
def param[S](value: S)
def as[C <: CDT](implicit codec: TroyCodec[S, C])
/tabdulradi /tabdulradi /troy
Compile-time RegistryTroyCodec[String, CDT.Ascii]
TroyCodec[String, CDT.Text]
TroyCodec[UUID, CDT.Uuid]
TroyCodec[UUID, CDT.TimeUuid]
/tabdulradi /tabdulradi /troy
Parsingcase class Post(id: UUID, title: String)
cql"SELECT post_id, post_title FROM test.posts;” .prepared .executeAsync .as(Post)
/tabdulradi /tabdulradi /troy
Generated Code
(row: Row) => Post( column[UUID](0)(row).as[CDT.TimeUuid], column[String](1)(row).as[CDT.Text])
/tabdulradi /tabdulradi /troy
Optional Columnscase class Post( id: UUID, title: Option[String])
implicit def optionCodec[S, C]( implicit inner: TroyCodec[S, C]): TroyCodec[Option[S], C]
/tabdulradi /tabdulradi /troy
Collections• Seq[S] <—> list<C>
• Set[S] <—> set<C>
• Map[KS, VS] <—> map<KC, VC>
/tabdulradi /tabdulradi /troy
Chaining methods cql"SELECT …" .prepared .setConsistencyLevel(QUORUM) .setFetchSize(100) .executeAsync .oneOption .as(Post)
/tabdulradi /tabdulradi /troy
Schema Versioning
/tabdulradi /tabdulradi /troy
Schema Versioning
/tabdulradi /tabdulradi /troy
Schema Versioning
CREATE KEYSPACE test ...;CREATE TABLE test.posts ( ... );
resources/schema.cql
/tabdulradi /tabdulradi /troy
ALTER TABLE test.posts ADD blah text;
Schema Versioningresources/schema/01.cql
resources/schema/02.cql
CREATE KEYSPACE test ...;CREATE TABLE test.posts ( ... );
/tabdulradi /tabdulradi /troy
Checked CompatibilitywithSchema.minVersion(1) { (authorId: String) => cql""" SELECT post_id, post_title FROM test.posts WHERE author_id = $authorId; """.prepared.as(Post)}
/tabdulradi /tabdulradi /troy
Road Map
• Release 1.0 by the end of the year.
• Few missing CQL features
• Post 1.0
• Shapeless
• New style macro
/tabdulradi /tabdulradi /troy
Meta + Paradise@withSchema def list(authorId: UUID) = cql""" SELECT post_id, post_title FROM test.posts where author_id = $authorId; """ .prepared .executeAsync .all .as[UUID, String, String, Int, Post](Post)
/tabdulradi /tabdulradi /troy
Github Contributors