Introducing Troy Scala IO 2016

22
Introducing Troy Schema-safe Cassandra Toolkit Tamer AbdulRadi Senior Software Engineer at Cake Solutions /tabdulradi abdulradi.com /troy /tabdulradi

Transcript of Introducing Troy Scala IO 2016

Page 1: Introducing Troy Scala IO 2016

Introducing TroySchema-safe Cassandra Toolkit

Tamer AbdulRadiSenior Software Engineer at Cake Solutions

/tabdulradi

abdulradi.com

/troy/tabdulradi

Page 2: Introducing Troy Scala IO 2016

/tabdulradi /tabdulradi /troy

Cassandra

• Distributed NoSQL Database

• Cassandra Query Language

Page 3: Introducing Troy Scala IO 2016

/tabdulradi /tabdulradi /troy

Data Modelling

Post Author

Post

authorId K

postId C

postBody

authorName SQueries

Page 4: Introducing Troy Scala IO 2016

/tabdulradi /tabdulradi /troy

CQL Shell

Page 5: Introducing Troy Scala IO 2016

/tabdulradi /tabdulradi /troy

Java Driverdef listByAuthor(authorId: String) = session.executeAsync( """ SELECT post_id, post_title FROM test.posts WHERE author_id = ? """, authorId)

Page 6: Introducing Troy Scala IO 2016

/tabdulradi /tabdulradi /troy

Enter Troyval listByAuthor = withSchema { (authorId: String) => cql""" SELECT post_id, post_title FROM test.posts WHERE author_id = $authorId; “""}

Page 7: Introducing Troy Scala IO 2016

/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])}

Page 8: Introducing Troy Scala IO 2016

/tabdulradi /tabdulradi /troy

Troy Codec

def param[S](value: S)

def as[C <: CDT](implicit codec: TroyCodec[S, C])

Page 9: Introducing Troy Scala IO 2016

/tabdulradi /tabdulradi /troy

Compile-time RegistryTroyCodec[String, CDT.Ascii]

TroyCodec[String, CDT.Text]

TroyCodec[UUID, CDT.Uuid]

TroyCodec[UUID, CDT.TimeUuid]

Page 10: Introducing Troy Scala IO 2016

/tabdulradi /tabdulradi /troy

Parsingcase class Post(id: UUID, title: String)

cql"SELECT post_id, post_title FROM test.posts;” .prepared .executeAsync .as(Post)

Page 11: Introducing Troy Scala IO 2016

/tabdulradi /tabdulradi /troy

Generated Code

(row: Row) => Post( column[UUID](0)(row).as[CDT.TimeUuid], column[String](1)(row).as[CDT.Text])

Page 12: Introducing Troy Scala IO 2016

/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]

Page 13: Introducing Troy Scala IO 2016

/tabdulradi /tabdulradi /troy

Collections• Seq[S] <—> list<C>

• Set[S] <—> set<C>

• Map[KS, VS] <—> map<KC, VC>

Page 14: Introducing Troy Scala IO 2016

/tabdulradi /tabdulradi /troy

Chaining methods cql"SELECT …" .prepared .setConsistencyLevel(QUORUM) .setFetchSize(100) .executeAsync .oneOption .as(Post)

Page 15: Introducing Troy Scala IO 2016

/tabdulradi /tabdulradi /troy

Schema Versioning

Page 16: Introducing Troy Scala IO 2016

/tabdulradi /tabdulradi /troy

Schema Versioning

Page 17: Introducing Troy Scala IO 2016

/tabdulradi /tabdulradi /troy

Schema Versioning

CREATE KEYSPACE test ...;CREATE TABLE test.posts ( ... );

resources/schema.cql

Page 18: Introducing Troy Scala IO 2016

/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 ( ... );

Page 19: Introducing Troy Scala IO 2016

/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)}

Page 20: Introducing Troy Scala IO 2016

/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

Page 21: Introducing Troy Scala IO 2016

/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)

Page 22: Introducing Troy Scala IO 2016

/tabdulradi /tabdulradi /troy

Github Contributors