Scala dsls-dissecting-and-implementing-rogue

45
Konrad Malawski / @ktosopl GDG / PJUG / KSUG / SCKRK ScalaCamp 23.01.2012 Scala DSLs Dissecting Rogue Wednesday, December 26, 12

description

Just a few simple slides for a presentation at Kraków's Scala User Group. The rest of the session is live coding where we reimplement a tiny subset of Rogue, Foursquares MongoDB DSL.

Transcript of Scala dsls-dissecting-and-implementing-rogue

Page 2: Scala dsls-dissecting-and-implementing-rogue

Wednesday, December 26, 12

Page 3: Scala dsls-dissecting-and-implementing-rogue

Querying Mongo

Wednesday, December 26, 12

Page 4: Scala dsls-dissecting-and-implementing-rogue

Querying Mongo

Wednesday, December 26, 12

Page 5: Scala dsls-dissecting-and-implementing-rogue

Querying Mongo

Wednesday, December 26, 12

Page 6: Scala dsls-dissecting-and-implementing-rogue

QL = Plain JSON

Querying Mongo

Wednesday, December 26, 12

Page 7: Scala dsls-dissecting-and-implementing-rogue

QL = Plain JSONJavaScript Console

Querying Mongo

Wednesday, December 26, 12

Page 8: Scala dsls-dissecting-and-implementing-rogue

QL = Plain JSONJavaScript Console

Java Driver

Querying Mongo

Wednesday, December 26, 12

Page 9: Scala dsls-dissecting-and-implementing-rogue

QL = Plain JSONJavaScript Console

Java DriverCasbah = Scala Driver

Querying Mongo

Wednesday, December 26, 12

Page 10: Scala dsls-dissecting-and-implementing-rogue

QL = Plain JSONJavaScript Console

Java DriverCasbah = Scala Driver

... used by Rogue

Querying Mongo

Wednesday, December 26, 12

Page 11: Scala dsls-dissecting-and-implementing-rogue

Querying Mongo: JS

Console API

Wednesday, December 26, 12

Page 12: Scala dsls-dissecting-and-implementing-rogue

Querying Mongo: JS

db.inventory.find( {} )

Wednesday, December 26, 12

Page 13: Scala dsls-dissecting-and-implementing-rogue

Querying Mongo: JS

db.inventory.find( {} )

“find all”

Wednesday, December 26, 12

Page 14: Scala dsls-dissecting-and-implementing-rogue

Querying Mongo: JS

db.inventory.find( { qty: { $gt: 20 } } )

Wednesday, December 26, 12

Page 15: Scala dsls-dissecting-and-implementing-rogue

Querying Mongo: JS

db.inventory.find( { qty: { $gt: 20 } } )

gt means >=

Wednesday, December 26, 12

Page 16: Scala dsls-dissecting-and-implementing-rogue

Querying Mongo: JS

db.pople.find( { age: { $gte: 20 }, $or: [ { name: “Ken” }, { name: “Kenshiro” }, { city: “Tokyo” }, ... ] } )

Wednesday, December 26, 12

Page 17: Scala dsls-dissecting-and-implementing-rogue

Querying Mongo: JS

db.pople.find( { age: { $gte: 20 }, $or: [ { name: “Ken” }, { name: “Kenshiro” }, { city: “Tokyo” }, ... ] } )

$or may contain any clause

Wednesday, December 26, 12

Page 18: Scala dsls-dissecting-and-implementing-rogue

Querying Mongo: Java

Java API(Morhpia)

Wednesday, December 26, 12

Page 19: Scala dsls-dissecting-and-implementing-rogue

Querying Mongo: Java

ds.find(Employee.class).field("manager").equal(null).get();

Wednesday, December 26, 12

Page 20: Scala dsls-dissecting-and-implementing-rogue

Querying Mongo: Java

ds.find(Employee.class).field("manager").equal(null).get();

You call this typesafe!?

Wednesday, December 26, 12

Page 21: Scala dsls-dissecting-and-implementing-rogue

Mongo with Rogue

Wednesday, December 26, 12

Page 22: Scala dsls-dissecting-and-implementing-rogue

Rogue in Action

import com.foursquare.rogue.Rogue._

Wednesday, December 26, 12

Page 23: Scala dsls-dissecting-and-implementing-rogue

Rogue in Action

Person where(_.age gte 18) limit(100) fetch()

Wednesday, December 26, 12

Page 24: Scala dsls-dissecting-and-implementing-rogue

Rogue in Action

Person where(_.age gte 18) limit(100) fetch()

Code Completion

Code Completion

Code Completion

Code Completion

Wednesday, December 26, 12

Page 25: Scala dsls-dissecting-and-implementing-rogue

Rogue in Action

Person where(_.age gte “Bazinga”) limit(100) fetch()

Wednesday, December 26, 12

Page 26: Scala dsls-dissecting-and-implementing-rogue

Rogue in Action

Person where(_.age gte “Bazinga”) limit(100) fetch()

Won’t compile - age is IntField

Wednesday, December 26, 12

Page 27: Scala dsls-dissecting-and-implementing-rogue

Rogue in Action

Person where(_.age gte 18) limit(100) fetch()

Wednesday, December 26, 12

Page 28: Scala dsls-dissecting-and-implementing-rogue

Rogue in Action

Person where(_.age gte 18) limit(100) fetch()

Limit

Wednesday, December 26, 12

Page 29: Scala dsls-dissecting-and-implementing-rogue

Rogue in Action

Person where(_.age gte 18) limit(100) foreach { p => println(”Name: ” + p.firstName)}

Wednesday, December 26, 12

Page 30: Scala dsls-dissecting-and-implementing-rogue

Rogue in Action

Person where(_.age gte 18) limit(100) foreach { p => println(”Name: ” + p.firstName)}

gte means >=

Wednesday, December 26, 12

Page 31: Scala dsls-dissecting-and-implementing-rogue

Rogue in Action

Person or( _.where(_.name eqs "Ken"), _.where(_.name eqs "ken") _.whereOpt(Option("Kenshiro")(_.name eqs _))) get()

Wednesday, December 26, 12

Page 32: Scala dsls-dissecting-and-implementing-rogue

Rogue in Action

Person or( _.where(_.name eqs "Ken"), _.where(_.name eqs "ken") _.whereOpt(Option("Kenshiro")(_.name eqs _))) get()

eqs means Equals

Wednesday, December 26, 12

Page 33: Scala dsls-dissecting-and-implementing-rogue

Rogue in Action

Person or( _.where(_.name eqs "Ken"), _.where(_.name eqs "ken") _.whereOpt(Option("Kenshiro")(_.name eqs _))) get()

Get me one Person.

eqs means Equals

Wednesday, December 26, 12

Page 34: Scala dsls-dissecting-and-implementing-rogue

Rogue in Action

Person or( _.where(_.name eqs "Ken"), _.where(_.name eqs "ken") _.whereOpt(Option("Kenshiro")(_.name eqs _))) get()

Get me one Person.

eqs means Equals

Issue #69: fix in my pull req

Wednesday, December 26, 12

Page 35: Scala dsls-dissecting-and-implementing-rogue

Live Hacking

Wednesday, December 26, 12

Page 36: Scala dsls-dissecting-and-implementing-rogue

Live Hacking

Wednesday, December 26, 12

Page 37: Scala dsls-dissecting-and-implementing-rogue

Live Hacking

Wednesday, December 26, 12

Page 38: Scala dsls-dissecting-and-implementing-rogue

Advanced Stuff.

Live Hacking

Wednesday, December 26, 12

Page 39: Scala dsls-dissecting-and-implementing-rogue

Advanced Stuff.Fast.

Live Hacking

Wednesday, December 26, 12

Page 40: Scala dsls-dissecting-and-implementing-rogue

Advanced Stuff.Fast.

Ask Questions!

Live Hacking

Wednesday, December 26, 12

Page 41: Scala dsls-dissecting-and-implementing-rogue

Wednesday, December 26, 12

Page 42: Scala dsls-dissecting-and-implementing-rogue

def links = • Scala Lang http://www.scala-lang.org/

• Scala Koans http://www.scalakoans.org

• Blog.Project13.pl - http://www.blog.project13.pl

•MongoDB ref - docs.mongodb.org/manual/reference/operators/

• Foursquare Rogue - https://github.com/foursquare/rogue

• Java Morphia - http://code.google.com/p/morphia/

• Kraków Scala UG - http://krakowscala.pl / http://scalacamp.pl

Wednesday, December 26, 12

Page 43: Scala dsls-dissecting-and-implementing-rogue

def links = • Scala Lang http://www.scala-lang.org/

• Scala Koans http://www.scalakoans.org

• Blog.Project13.pl - http://www.blog.project13.pl

•MongoDB ref - docs.mongodb.org/manual/reference/operators/

• Foursquare Rogue - https://github.com/foursquare/rogue

• Java Morphia - http://code.google.com/p/morphia/

• Kraków Scala UG - http://krakowscala.pl / http://scalacamp.pl

Mailing lists rock!

Wednesday, December 26, 12