51
Writing CouchDB Views using ClojureScript Chas Emerick @cemerick http://cemerick.com http://snowtide.com Tuesday, October 11, 2011

Writing CouchDB Views using ClojureScript

Embed Size (px)

DESCRIPTION

Write your views/filters/validators in Clojure(Script), run the results in CouchDB/Couchbase/Cloudant — no special view servers, no special configuration, no JavaScript!More info: http://wp.me/p10OJi-bL

Citation preview

Page 1: Writing CouchDB Views using ClojureScript

Writing CouchDB Views using

ClojureScript

Chas Emerick

@cemerick http://cemerick.comhttp://snowtide.com

Tuesday, October 11, 2011

Page 2: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

@cemerick

Tuesday, October 11, 2011

Page 3: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

@cemerickFounded Snowtide in 2001

Tuesday, October 11, 2011

Page 4: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

@cemerickFounded Snowtide in 2001

Clojure full-time since 2008

Tuesday, October 11, 2011

Page 5: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

@cemerickFounded Snowtide in 2001

Clojure full-time since 2008

Contributor to Clojure language & libraries

Tuesday, October 11, 2011

Page 6: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

@cemerickFounded Snowtide in 2001

Clojure full-time since 2008

Contributor to Clojure language & libraries

CouchDB user since 2009?

Tuesday, October 11, 2011

Page 7: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

@cemerickFounded Snowtide in 2001

Clojure full-time since 2008

Contributor to Clojure language & libraries

CouchDB user since 2009?

O’Reilly author

Tuesday, October 11, 2011

Page 8: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

CouchDB in 1 minute

Tuesday, October 11, 2011

Page 9: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

CouchDB in 1 minute• Document-oriented data store

Tuesday, October 11, 2011

Page 10: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

CouchDB in 1 minute• Document-oriented data store

• (Primary) key => JSON object

Tuesday, October 11, 2011

Page 11: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

CouchDB in 1 minute• Document-oriented data store

• (Primary) key => JSON object

• HTTP API

Tuesday, October 11, 2011

Page 12: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

CouchDB in 1 minute• Document-oriented data store

• (Primary) key => JSON object

• HTTP API

• Secondary indexes / queries provided by ‘views’

Tuesday, October 11, 2011

Page 13: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

CouchDB in 1 minute• Document-oriented data store

• (Primary) key => JSON object

• HTTP API

• Secondary indexes / queries provided by ‘views’

• viz. materialized views in SQL-land

Tuesday, October 11, 2011

Page 14: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

CouchDB in 1 minute• Document-oriented data store

• (Primary) key => JSON object

• HTTP API

• Secondary indexes / queries provided by ‘views’

• viz. materialized views in SQL-land

• Defined by Javascript functions applied within a flavour of map/reduce

Tuesday, October 11, 2011

Page 15: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

CouchDB in 1 minute• Document-oriented data store

• (Primary) key => JSON object

• HTTP API

• Secondary indexes / queries provided by ‘views’

• viz. materialized views in SQL-land

• Defined by Javascript functions applied within a flavour of map/reduce

• Same mechanism used elsewhere (filters, validation, etc)

Tuesday, October 11, 2011

Page 16: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Clutch

Tuesday, October 11, 2011

Page 17: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Clutch

• CouchDB library for Clojure

Tuesday, October 11, 2011

Page 18: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Clutch

• CouchDB library for Clojure

• (Javascript) view creation and querying support:

Tuesday, October 11, 2011

Page 19: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Clutch

• CouchDB library for Clojure

• (Javascript) view creation and querying support:

(save-­‐view  "count"  :number-­‐of-­‐players    {:map  "function(d){for  (var  k  in  d.players)  {emit(d.players[k],1);}}"      :reduce  "function  (keys,  values)  {  return  sum(values);  }"})

Tuesday, October 11, 2011

Page 20: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

“Javascript sucks”

Tuesday, October 11, 2011

Page 21: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

“Javascript sucks”

Q.E.D.

Tuesday, October 11, 2011

Page 22: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Clutch: Clojure view server

Tuesday, October 11, 2011

Page 23: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Clutch: Clojure view server

• Use Clojure to write view functions:

Tuesday, October 11, 2011

Page 24: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Clutch: Clojure view server

• Use Clojure to write view functions:

(save-­‐view  "count"  :number-­‐of-­‐players    (with-­‐clj-­‐view-­‐server        {:map  (fn  [doc]  (map  #(vector  %  1)  (:players  doc)))          :reduce  (fn  [keys  values  _]  (reduce  +  values))}))

Tuesday, October 11, 2011

Page 25: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Clutch: Clojure view server

• Use Clojure to write view functions:

(save-­‐view  "count"  :number-­‐of-­‐players    (with-­‐clj-­‐view-­‐server        {:map  (fn  [doc]  (map  #(vector  %  1)  (:players  doc)))          :reduce  (fn  [keys  values  _]  (reduce  +  values))}))

• Better, but:

Tuesday, October 11, 2011

Page 26: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Clutch: Clojure view server

• Use Clojure to write view functions:

(save-­‐view  "count"  :number-­‐of-­‐players    (with-­‐clj-­‐view-­‐server        {:map  (fn  [doc]  (map  #(vector  %  1)  (:players  doc)))          :reduce  (fn  [keys  values  _]  (reduce  +  values))}))

• Better, but:

• Increases operational complexity

Tuesday, October 11, 2011

Page 27: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Clutch: Clojure view server

• Use Clojure to write view functions:

(save-­‐view  "count"  :number-­‐of-­‐players    (with-­‐clj-­‐view-­‐server        {:map  (fn  [doc]  (map  #(vector  %  1)  (:players  doc)))          :reduce  (fn  [keys  values  _]  (reduce  +  values))}))

• Better, but:

• Increases operational complexity

• Won’t work on hosted platforms, e.g. Cloudant

Tuesday, October 11, 2011

Page 28: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

ClojureScript

Tuesday, October 11, 2011

Page 29: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

ClojureScript

• Clojure : JVM :: ClojureScript : JavaScript

Tuesday, October 11, 2011

Page 30: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

ClojureScript

• Clojure : JVM :: ClojureScript : JavaScript

• Ahead-of-time compilation (no eval)

Tuesday, October 11, 2011

Page 31: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

ClojureScript

• Clojure : JVM :: ClojureScript : JavaScript

• Ahead-of-time compilation (no eval)

• (Optionally) uses Google Closure’s optimizing compiler

Tuesday, October 11, 2011

Page 32: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

ClojureScript

• Clojure : JVM :: ClojureScript : JavaScript

• Ahead-of-time compilation (no eval)

• (Optionally) uses Google Closure’s optimizing compiler

• Eliminate need for Clojure/Clutch view server & need to write views in JavaScript!

Tuesday, October 11, 2011

Page 33: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Demo

Tuesday, October 11, 2011

Page 34: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Language Mapping

Thankfully, you don’t need to do much if any interop in views…

Tuesday, October 11, 2011

Page 35: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Language MappingJavascript

Thankfully, you don’t need to do much if any interop in views…

Tuesday, October 11, 2011

Page 36: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Language MappingJavascript

emit([doc.a,  doc.b],  doc.c);

Thankfully, you don’t need to do much if any interop in views…

Tuesday, October 11, 2011

Page 37: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Language MappingJavascript

emit([doc.a,  doc.b],  doc.c);

ClojureScript

Thankfully, you don’t need to do much if any interop in views…

Tuesday, October 11, 2011

Page 38: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Language MappingJavascript

emit([doc.a,  doc.b],  doc.c);

ClojureScript

(js/emit

Thankfully, you don’t need to do much if any interop in views…

Tuesday, October 11, 2011

Page 39: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Language MappingJavascript

emit([doc.a,  doc.b],  doc.c);

ClojureScript

(js/emit

   (array  (aget  doc  “a”)

Thankfully, you don’t need to do much if any interop in views…

Tuesday, October 11, 2011

Page 40: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Language MappingJavascript

emit([doc.a,  doc.b],  doc.c);

ClojureScript

(js/emit

   (array  (aget  doc  “a”)

                 (aget  doc  “b”))

Thankfully, you don’t need to do much if any interop in views…

Tuesday, October 11, 2011

Page 41: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Language MappingJavascript

emit([doc.a,  doc.b],  doc.c);

ClojureScript

(js/emit

   (array  (aget  doc  “a”)

                 (aget  doc  “b”))

   (aget  doc  “c”))

Thankfully, you don’t need to do much if any interop in views…

Tuesday, October 11, 2011

Page 42: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Current issues

Tuesday, October 11, 2011

Page 43: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Current issues

• ClojureScript is not a library (yet!)

Tuesday, October 11, 2011

Page 44: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Current issues

• ClojureScript is not a library (yet!)

• Cannot be depended upon in Leiningen/Maven

Tuesday, October 11, 2011

Page 45: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Current issues

• ClojureScript is not a library (yet!)

• Cannot be depended upon in Leiningen/Maven

• Cannot target / test against particular versions (there aren’t any)

Tuesday, October 11, 2011

Page 46: Writing CouchDB Views using ClojureScript

Chas Emerick: Writing CouchDB Views using ClojureScript

Current issues

• ClojureScript is not a library (yet!)

• Cannot be depended upon in Leiningen/Maven

• Cannot target / test against particular versions (there aren’t any)

• Incomplete optimization: lots of code generated to define the simplest view

Tuesday, October 11, 2011