Scala DSLs Dissecting Rogue
Transcript of Scala DSLs Dissecting Rogue
Konrad Malawski / @ktosoplGDG / PJUG / KSUG / SCKRK
ScalaCamp 23.01.2012
Scala DSLsDissecting Rogue
Łukasz Dubiel@bambuchaAdm
Hackerspace KrakówSaturday, January 26, 13
Konrad Malawski / @ktosoplGDG / PJUG / KSUG / SCKRK
ScalaCamp 23.01.2012
Scala DSLsDissecting Rogue
Łukasz Dubiel@bambuchaAdm
Hackerspace KrakówSaturday, January 26, 13
Saturday, January 26, 13
DSL
Saturday, January 26, 13
DSL
Saturday, January 26, 13
DSL
Saturday, January 26, 13
omainDSL
Saturday, January 26, 13
omainpecific
DSL
Saturday, January 26, 13
omainpecificanguage
DSL
Saturday, January 26, 13
Domain Specific Language(internal)
list should contain (1)pet should equal ("Kapibara")
( ScalaTest )Saturday, January 26, 13
create random Client
create Client from Poland having PremiumSubscription
Domain Specific Language(internal? external?)
Saturday, January 26, 13
find all clients withMore than one negative comments
Domain Specific Language(internal? external?)
Saturday, January 26, 13
Domain Specific Language=
Saturday, January 26, 13
Domain Specific Language=
def internal = "defined within our programming language"
Saturday, January 26, 13
Domain Specific Language=
define External = /* AKA */ "let's write a parser"
def internal = "defined within our programming language"
Saturday, January 26, 13
Querying Mongo
Saturday, January 26, 13
Querying Mongo
Saturday, January 26, 13
Querying Mongo
Saturday, January 26, 13
QL = Plain JSON
Querying Mongo
Saturday, January 26, 13
QL = Plain JSONJavaScript Console
Querying Mongo
Saturday, January 26, 13
QL = Plain JSONJavaScript Console
Java Driver
Querying Mongo
Saturday, January 26, 13
QL = Plain JSONJavaScript Console
Java DriverCasbah = Scala Driver
Querying Mongo
Saturday, January 26, 13
QL = Plain JSONJavaScript Console
Java DriverCasbah = Scala Driver
... used by Rogue
Querying Mongo
Saturday, January 26, 13
Querying Mongo: JS
Console API
Saturday, January 26, 13
Querying Mongo: JS
db.inventory.find( {} )
Saturday, January 26, 13
Querying Mongo: JS
db.inventory.find( {} )
“find all”
Saturday, January 26, 13
Querying Mongo: JS
db.inventory.find( { qty: 20 } )
Saturday, January 26, 13
Querying Mongo: JS
db.inventory.find( { qty: 20 } )
"where qty = 20"
Saturday, January 26, 13
Querying Mongo: JS
db.inventory.find( { qty: { $gt: 20 } } )
Saturday, January 26, 13
Querying Mongo: JS
db.inventory.find( { qty: { $gt: 20 } } )
gt means >=
Saturday, January 26, 13
Querying Mongo: JS
db.pople.find( { age: { $gte: 20 }, $or: [ { name: “Ken” }, { name: “Kenshiro” }, { city: “Tokyo” }, ... ] } )
Saturday, January 26, 13
Querying Mongo: JS
db.pople.find( { age: { $gte: 20 }, $or: [ { name: “Ken” }, { name: “Kenshiro” }, { city: “Tokyo” }, ... ] } )
$or may contain any clause
Saturday, January 26, 13
Querying Mongo: Java
Java API(Morhpia)
Saturday, January 26, 13
Querying Mongo: Java
ds.find(Employee.class).field("manager").equal(null).get();
(morphia)Saturday, January 26, 13
Querying Mongo: Java
ds.find(Employee.class).field("manager").equal(null).get();
You call this typesafe!?
(morphia)Saturday, January 26, 13
Mongo with Rogue
Saturday, January 26, 13
Rogue in Action
import com.foursquare.rogue.Rogue._
Saturday, January 26, 13
Rogue in Action
Person where(_.age gte 18) limit(100) fetch()
Saturday, January 26, 13
Rogue in Action
Person where(_.age gte 18) limit(100) fetch()
Code Completion
Code Completion
Code Completion
Code Completion
Saturday, January 26, 13
Rogue in Action
Person where(_.age eqs “Bazinga”) fetch()
Saturday, January 26, 13
Rogue in Action
Person where(_.age eqs “Bazinga”) fetch()
Won’t compile - age is IntField
eqs means ==
Saturday, January 26, 13
Rogue in Action
Person where(_.age gte 18) fetch()
Saturday, January 26, 13
Rogue in Action
Person where(_.age gte 18) fetch()
OK!
Saturday, January 26, 13
Rogue in Action
Person where(_.age gte 18) limit() fetch()
Saturday, January 26, 13
Rogue in Action
Person where(_.age gte 18) limit() fetch()
Limit
Saturday, January 26, 13
Rogue in Action
val _: List[String] = Person where(_.age gte 18) select(_.name) fetch()
Saturday, January 26, 13
Rogue in Action
val _: List[String] = Person where(_.age gte 18) select(_.name) fetch()
Type Safe!Type Safe!
Saturday, January 26, 13
Rogue in Action
Person where(_.age gte 18) limit(100) foreach { p => println(s”Name: ${p.firstName}”)}
Saturday, January 26, 13
Rogue in Action
Person where(_.age gte 18) limit(100) foreach { p => println(s”Name: ${p.firstName}”)}
foreach found person
Saturday, January 26, 13
people foreach { }
Saturday, January 26, 13
Rogue in Action
Person or( _.where(_.name eqs "Ken"), _.where(_.name eqs "ken") _.whereOpt(Option("Kenshiro")(_.name eqs _))) get()
Saturday, January 26, 13
Rogue in Action
Person or( _.where(_.name eqs "Ken"), _.where(_.name eqs "ken") _.whereOpt(Option("Kenshiro")(_.name eqs _))) get()
Get me one Person.
Saturday, January 26, 13
Rogue in Action
Person or( _.where(_.name eqs "Ken"), _.where(_.name eqs "ken") _.whereOpt(Option("Kenshiro")(_.name eqs _))) get()
Get me one Person.
Issue #69: fix in my pull req
Saturday, January 26, 13
Live Hacking
Saturday, January 26, 13
Live Hacking
Saturday, January 26, 13
Live Hacking
Saturday, January 26, 13
Live Hacking with ŁukaszDubiel
Saturday, January 26, 13
Advanced Stuff.
Live Hacking with ŁukaszDubiel
Saturday, January 26, 13
Advanced Stuff.Fast.
Live Hacking with ŁukaszDubiel
Saturday, January 26, 13
Advanced Stuff.Fast.
Ask Questions!
Live Hacking with ŁukaszDubiel
Saturday, January 26, 13
Saturday, January 26, 13
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
Saturday, January 26, 13
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!
Saturday, January 26, 13
Konrad Malawski / @ktosoplGDG / PJUG / KSUG / SCKRK
ScalaCamp 23.01.2012
Thanks! Dziękuję!ありがとう!
Łukasz Dubiel@bambuchaAdm
Hackerspace KrakówSaturday, January 26, 13
I love feedback! <3 Konrad Malawski / @ktosoplGDG / PJUG / KSUG / SCKRK
ScalaCamp 23.01.2012
Thanks! Dziękuję!ありがとう!
Łukasz Dubiel@bambuchaAdm
Hackerspace KrakówSaturday, January 26, 13