Scala DSLs Dissecting Rogue

65
Konrad Malawski / @ktosopl GDG / PJUG / KSUG / SCKRK ScalaCamp 23.01.2012 Scala DSLs Dissecting Rogue Saturday, January 26, 13

Transcript of Scala DSLs Dissecting Rogue

Page 1: 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

Page 3: Scala DSLs Dissecting Rogue

Saturday, January 26, 13

Page 4: Scala DSLs Dissecting Rogue

DSL

Saturday, January 26, 13

Page 5: Scala DSLs Dissecting Rogue

DSL

Saturday, January 26, 13

Page 6: Scala DSLs Dissecting Rogue

DSL

Saturday, January 26, 13

Page 7: Scala DSLs Dissecting Rogue

omainDSL

Saturday, January 26, 13

Page 8: Scala DSLs Dissecting Rogue

omainpecific

DSL

Saturday, January 26, 13

Page 9: Scala DSLs Dissecting Rogue

omainpecificanguage

DSL

Saturday, January 26, 13

Page 10: Scala DSLs Dissecting Rogue

Domain Specific Language(internal)

list should contain (1)pet should equal ("Kapibara")

( ScalaTest )Saturday, January 26, 13

Page 11: Scala DSLs Dissecting Rogue

create random Client

create Client from Poland having PremiumSubscription

Domain Specific Language(internal? external?)

Saturday, January 26, 13

Page 12: Scala DSLs Dissecting Rogue

find all clients withMore than one negative comments

Domain Specific Language(internal? external?)

Saturday, January 26, 13

Page 13: Scala DSLs Dissecting Rogue

Domain Specific Language=

Saturday, January 26, 13

Page 14: Scala DSLs Dissecting Rogue

Domain Specific Language=

def internal = "defined within our programming language"

Saturday, January 26, 13

Page 15: Scala DSLs Dissecting Rogue

Domain Specific Language=

define External = /* AKA */ "let's write a parser"

def internal = "defined within our programming language"

Saturday, January 26, 13

Page 16: Scala DSLs Dissecting Rogue

Querying Mongo

Saturday, January 26, 13

Page 17: Scala DSLs Dissecting Rogue

Querying Mongo

Saturday, January 26, 13

Page 18: Scala DSLs Dissecting Rogue

Querying Mongo

Saturday, January 26, 13

Page 19: Scala DSLs Dissecting Rogue

QL = Plain JSON

Querying Mongo

Saturday, January 26, 13

Page 20: Scala DSLs Dissecting Rogue

QL = Plain JSONJavaScript Console

Querying Mongo

Saturday, January 26, 13

Page 21: Scala DSLs Dissecting Rogue

QL = Plain JSONJavaScript Console

Java Driver

Querying Mongo

Saturday, January 26, 13

Page 22: Scala DSLs Dissecting Rogue

QL = Plain JSONJavaScript Console

Java DriverCasbah = Scala Driver

Querying Mongo

Saturday, January 26, 13

Page 23: Scala DSLs Dissecting Rogue

QL = Plain JSONJavaScript Console

Java DriverCasbah = Scala Driver

... used by Rogue

Querying Mongo

Saturday, January 26, 13

Page 24: Scala DSLs Dissecting Rogue

Querying Mongo: JS

Console API

Saturday, January 26, 13

Page 25: Scala DSLs Dissecting Rogue

Querying Mongo: JS

db.inventory.find( {} )

Saturday, January 26, 13

Page 26: Scala DSLs Dissecting Rogue

Querying Mongo: JS

db.inventory.find( {} )

“find all”

Saturday, January 26, 13

Page 27: Scala DSLs Dissecting Rogue

Querying Mongo: JS

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

Saturday, January 26, 13

Page 28: Scala DSLs Dissecting Rogue

Querying Mongo: JS

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

"where qty = 20"

Saturday, January 26, 13

Page 29: Scala DSLs Dissecting Rogue

Querying Mongo: JS

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

Saturday, January 26, 13

Page 30: Scala DSLs Dissecting Rogue

Querying Mongo: JS

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

gt means >=

Saturday, January 26, 13

Page 31: Scala DSLs Dissecting Rogue

Querying Mongo: JS

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

Saturday, January 26, 13

Page 32: Scala DSLs Dissecting Rogue

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

Page 33: Scala DSLs Dissecting Rogue

Querying Mongo: Java

Java API(Morhpia)

Saturday, January 26, 13

Page 34: Scala DSLs Dissecting Rogue

Querying Mongo: Java

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

(morphia)Saturday, January 26, 13

Page 35: Scala DSLs Dissecting Rogue

Querying Mongo: Java

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

You call this typesafe!?

(morphia)Saturday, January 26, 13

Page 36: Scala DSLs Dissecting Rogue

Mongo with Rogue

Saturday, January 26, 13

Page 37: Scala DSLs Dissecting Rogue

Rogue in Action

import com.foursquare.rogue.Rogue._

Saturday, January 26, 13

Page 38: Scala DSLs Dissecting Rogue

Rogue in Action

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

Saturday, January 26, 13

Page 39: Scala DSLs Dissecting Rogue

Rogue in Action

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

Code Completion

Code Completion

Code Completion

Code Completion

Saturday, January 26, 13

Page 40: Scala DSLs Dissecting Rogue

Rogue in Action

Person where(_.age eqs “Bazinga”) fetch()

Saturday, January 26, 13

Page 41: Scala DSLs Dissecting Rogue

Rogue in Action

Person where(_.age eqs “Bazinga”) fetch()

Won’t compile - age is IntField

eqs means ==

Saturday, January 26, 13

Page 42: Scala DSLs Dissecting Rogue

Rogue in Action

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

Saturday, January 26, 13

Page 43: Scala DSLs Dissecting Rogue

Rogue in Action

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

OK!

Saturday, January 26, 13

Page 44: Scala DSLs Dissecting Rogue

Rogue in Action

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

Saturday, January 26, 13

Page 45: Scala DSLs Dissecting Rogue

Rogue in Action

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

Limit

Saturday, January 26, 13

Page 46: Scala DSLs Dissecting Rogue

Rogue in Action

val _: List[String] = Person where(_.age gte 18) select(_.name) fetch()

Saturday, January 26, 13

Page 47: Scala DSLs Dissecting Rogue

Rogue in Action

val _: List[String] = Person where(_.age gte 18) select(_.name) fetch()

Type Safe!Type Safe!

Saturday, January 26, 13

Page 48: Scala DSLs Dissecting Rogue

Rogue in Action

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

Saturday, January 26, 13

Page 49: Scala DSLs Dissecting Rogue

Rogue in Action

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

foreach found person

Saturday, January 26, 13

Page 50: Scala DSLs Dissecting Rogue

people foreach { }

Saturday, January 26, 13

Page 51: Scala DSLs Dissecting Rogue

Rogue in Action

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

Saturday, January 26, 13

Page 52: Scala DSLs Dissecting Rogue

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

Page 53: Scala DSLs Dissecting Rogue

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

Page 54: Scala DSLs Dissecting Rogue

Live Hacking

Saturday, January 26, 13

Page 55: Scala DSLs Dissecting Rogue

Live Hacking

Saturday, January 26, 13

Page 56: Scala DSLs Dissecting Rogue

Live Hacking

Saturday, January 26, 13

Page 57: Scala DSLs Dissecting Rogue

Live Hacking with ŁukaszDubiel

Saturday, January 26, 13

Page 58: Scala DSLs Dissecting Rogue

Advanced Stuff.

Live Hacking with ŁukaszDubiel

Saturday, January 26, 13

Page 59: Scala DSLs Dissecting Rogue

Advanced Stuff.Fast.

Live Hacking with ŁukaszDubiel

Saturday, January 26, 13

Page 60: Scala DSLs Dissecting Rogue

Advanced Stuff.Fast.

Ask Questions!

Live Hacking with ŁukaszDubiel

Saturday, January 26, 13

Page 61: Scala DSLs Dissecting Rogue

Saturday, January 26, 13

Page 62: Scala DSLs Dissecting 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

Saturday, January 26, 13

Page 63: Scala DSLs Dissecting 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!

Saturday, January 26, 13