scala dsls dissecting rogue

Post on 12-Sep-2021

9 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related