Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Scala DSLs: Dissecting (and reimplementing) Rogue

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Scala DSLs: Dissecting (and reimplementing) Rogue

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.

Avatar for Konrad Malawski

Konrad Malawski

December 26, 2012
Tweet

Other Decks in Programming

Transcript

  1. Konrad Malawski / @ktosopl GDG / PJUG / KSUG /

    SCKRK ScalaCamp 23.01.2012 Scala DSLs Dissecting Rogue Wednesday, December 26, 12
  2. QL = Plain JSON JavaScript Console Java Driver Casbah =

    Scala Driver Querying Mongo Wednesday, December 26, 12
  3. QL = Plain JSON JavaScript Console Java Driver Casbah =

    Scala Driver ... used by Rogue Querying Mongo Wednesday, December 26, 12
  4. Querying Mongo: JS db.inventory.find( { qty: { $gt: 20 }

    } ) gt means >= Wednesday, December 26, 12
  5. Querying Mongo: JS db.pople.find( { age: { $gte: 20 },

    $or: [ { name: “Ken” }, { name: “Kenshiro” }, { city: “Tokyo” }, ... ] } ) Wednesday, December 26, 12
  6. 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
  7. Rogue in Action Person where(_.age gte 18) limit(100) fetch() Code

    Completion Code Completion Code Completion Code Completion Wednesday, December 26, 12
  8. Rogue in Action Person where(_.age gte “Bazinga”) limit(100) fetch() Won’t

    compile - age is IntField Wednesday, December 26, 12
  9. Rogue in Action Person where(_.age gte 18) limit(100) foreach {

    p => println(”Name: ” + p.firstName) } Wednesday, December 26, 12
  10. Rogue in Action Person where(_.age gte 18) limit(100) foreach {

    p => println(”Name: ” + p.firstName) } gte means >= Wednesday, December 26, 12
  11. Rogue in Action Person or( _.where(_.name eqs "Ken"), _.where(_.name eqs

    "ken") _.whereOpt(Option("Kenshiro")(_.name eqs _)) ) get() Wednesday, December 26, 12
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. Konrad Malawski / @ktosopl GDG / PJUG / KSUG /

    SCKRK ScalaCamp 23.01.2012 Thanks! Dziękuję! ͋Γ͕ͱ͏ʂ Wednesday, December 26, 12
  18. I love feedback! <3 Konrad Malawski / @ktosopl GDG /

    PJUG / KSUG / SCKRK ScalaCamp 23.01.2012 Thanks! Dziękuję! ͋Γ͕ͱ͏ʂ Wednesday, December 26, 12