SlideShare a Scribd company logo
Writing CouchDB
                              Views using
                             ClojureScript
                                 Chas Emerick

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

Tuesday, October 11, 2011
@cemerick




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
@cemerick
                Founded Snowtide in 2001




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
@cemerick
                Founded Snowtide in 2001

                Clojure full-time since 2008




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
@cemerick
                Founded Snowtide in 2001

                Clojure full-time since 2008

                Contributor to Clojure
                language & libraries




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
@cemerick
                Founded Snowtide in 2001

                Clojure full-time since 2008

                Contributor to Clojure
                language & libraries

                CouchDB user since 2009?




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
@cemerick
                Founded Snowtide in 2001

                Clojure full-time since 2008

                Contributor to Clojure
                language & libraries

                CouchDB user since 2009?

                O’Reilly author


   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
CouchDB in 1 minute




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
CouchDB in 1 minute
                    •       Document-oriented data store




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
CouchDB in 1 minute
                    •       Document-oriented data store
                            •   (Primary) key => JSON object




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
CouchDB in 1 minute
                    •       Document-oriented data store
                            •   (Primary) key => JSON object
                    •       HTTP API




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
CouchDB in 1 minute
                    •       Document-oriented data store
                            •   (Primary) key => JSON object
                    •       HTTP API
                    •       Secondary indexes / queries provided by ‘views’




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
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




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
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



   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
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)
   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Clutch




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Clutch
                    •       CouchDB library for Clojure




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Clutch
                    •       CouchDB library for Clojure
                    •       (Javascript) view creation and querying
                            support:




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
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);  }"})




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
“Javascript sucks”




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
“Javascript sucks”


                                            Q.E.D.




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Clutch: Clojure view
                                   server




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Clutch: Clojure view
                                   server
                    • Use Clojure to write view functions:




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
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))}))




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
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:



   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
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


   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
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
   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
ClojureScript




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
ClojureScript
                    • Clojure : JVM :: ClojureScript : JavaScript




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
ClojureScript
                    • Clojure : JVM :: ClojureScript : JavaScript
                    • Ahead-of-time compilation (no eval)




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
ClojureScript
                    • Clojure : JVM :: ClojureScript : JavaScript
                    • Ahead-of-time compilation (no eval)
                    • (Optionally) uses Google Closure’s
                            optimizing compiler




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
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!


   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Demo


   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Language Mapping




                     Thankfully, you don’t need to do much if any
                                   interop in views…
   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Language Mapping
                        Javascript




                     Thankfully, you don’t need to do much if any
                                   interop in views…
   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Language Mapping
                        Javascript
                        emit([doc.a,  doc.b],  doc.c);




                     Thankfully, you don’t need to do much if any
                                   interop in views…
   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Language Mapping
                        Javascript
                        emit([doc.a,  doc.b],  doc.c);

                       ClojureScript




                     Thankfully, you don’t need to do much if any
                                   interop in views…
   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Language Mapping
                        Javascript
                        emit([doc.a,  doc.b],  doc.c);

                       ClojureScript
                       (js/emit




                     Thankfully, you don’t need to do much if any
                                   interop in views…
   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Language Mapping
                        Javascript
                        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…
   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Language Mapping
                        Javascript
                        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…
   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Language Mapping
                        Javascript
                        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…
   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Current issues




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Current issues
                    • ClojureScript is not a library (yet!)




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Current issues
                    • ClojureScript is not a library (yet!)
                     • Cannot be depended upon in Leiningen/
                            Maven




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
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)




   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
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

   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Thank you!



                                                             snipe book
                   Chas Emerick
            @cemerick http://cemerick.com
                http://snowtide.com


   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Thank you!
             • CouchDB: http://couchdb.apache.org




                                                             snipe book
                   Chas Emerick
            @cemerick http://cemerick.com
                http://snowtide.com


   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Thank you!
             • CouchDB: http://couchdb.apache.org
             • Clutch: http://github.com/ashafa/clutch




                                                             snipe book
                   Chas Emerick
            @cemerick http://cemerick.com
                http://snowtide.com


   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Thank you!
             • CouchDB: http://couchdb.apache.org
             • Clutch: http://github.com/ashafa/clutch
             • ClojureScript: https://github.com/clojure/
                clojurescript




                                                             snipe book
                   Chas Emerick
            @cemerick http://cemerick.com
                http://snowtide.com


   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011
Thank you!
             • CouchDB: http://couchdb.apache.org
             • Clutch: http://github.com/ashafa/clutch
             • ClojureScript: https://github.com/clojure/
                clojurescript
             • Clutch-ClojureScript: http://github.com/
                cemerick/clutch-clojurescript

                                                             snipe book
                   Chas Emerick
            @cemerick http://cemerick.com
                http://snowtide.com


   Chas Emerick: Writing CouchDB Views using ClojureScript
Tuesday, October 11, 2011

More Related Content

PDF
Realm: Building a mobile database
PDF
Google App Engine With Java And Groovy
PDF
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代
PDF
iPhone Memory Management
PDF
"Searching with Solr" - Tyler Harms, South Dakota Code Camp 2012
PPS
Historia Procesorów
PPTX
Misconception of biology student
PPTX
Misconception of biology student
Realm: Building a mobile database
Google App Engine With Java And Groovy
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代
iPhone Memory Management
"Searching with Solr" - Tyler Harms, South Dakota Code Camp 2012
Historia Procesorów
Misconception of biology student
Misconception of biology student

Viewers also liked (20)

PDF
Acquisition policy and business models of research libraries in a digital era...
PPSX
Wish you were here before!' Who Gains from Collaboration between Computer Sci...
PDF
งานนำเสนอ1
PDF
Open science and scholarly publishing practices by Daphne Duin
PPSX
Working Together on the Web, Working Well?
PPT
e Twinning star
PDF
Global References index to Biodiversity (GRIB), a bibliographic index of EDIT...
PPTX
What they missed the moment they crossed Slovenia?
PDF
Common book
PPS
Współczesne procesory
PPT
Pro and con in smart school1
PPTX
Assessing the built environment's contribuition to sustainable development
PDF
A Digitalization Partnership: Sharing human and material resources by Larissa...
PPTX
Building development trajectories
PPT
Optosem presentation
PDF
Scientific Publishing Network after EDIT by Michele Ballinger & Isabelle Gerard
PDF
ソーシャルテレビカンファレンス2013 基礎講座 深田パート
PPTX
Abbi sw 180 chatroom project
PPT
E twinning star
PPS
Współczesne procesory
Acquisition policy and business models of research libraries in a digital era...
Wish you were here before!' Who Gains from Collaboration between Computer Sci...
งานนำเสนอ1
Open science and scholarly publishing practices by Daphne Duin
Working Together on the Web, Working Well?
e Twinning star
Global References index to Biodiversity (GRIB), a bibliographic index of EDIT...
What they missed the moment they crossed Slovenia?
Common book
Współczesne procesory
Pro and con in smart school1
Assessing the built environment's contribuition to sustainable development
A Digitalization Partnership: Sharing human and material resources by Larissa...
Building development trajectories
Optosem presentation
Scientific Publishing Network after EDIT by Michele Ballinger & Isabelle Gerard
ソーシャルテレビカンファレンス2013 基礎講座 深田パート
Abbi sw 180 chatroom project
E twinning star
Współczesne procesory
Ad

Similar to Writing CouchDB Views using ClojureScript (17)

PDF
Node at artsy
PDF
Intro to HTML5 Game Programming
PDF
node.js for front-end developers
PPTX
Kubernetes Intro @HaufeDev
PPTX
Kubernetes Introduction
PPTX
LowlaDB intro March 2015
PDF
Pocket Knife JS
PDF
A Taste of Clojure
PDF
Modern javascript
PPTX
RethinkDB - the open-source database for the realtime web
PDF
Clojurian Conquest
PDF
JRubyConf 2009
PDF
eZ Publish nextgen
PDF
Ensuring Quality in Data Lakes (D&D Meetup Feb 22)
PPTX
Dockercompose
PDF
Electron, databases, and RxDB
PPTX
Docker, Atomic Host and Kubernetes.
Node at artsy
Intro to HTML5 Game Programming
node.js for front-end developers
Kubernetes Intro @HaufeDev
Kubernetes Introduction
LowlaDB intro March 2015
Pocket Knife JS
A Taste of Clojure
Modern javascript
RethinkDB - the open-source database for the realtime web
Clojurian Conquest
JRubyConf 2009
eZ Publish nextgen
Ensuring Quality in Data Lakes (D&D Meetup Feb 22)
Dockercompose
Electron, databases, and RxDB
Docker, Atomic Host and Kubernetes.
Ad

Recently uploaded (20)

PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
WOOl fibre morphology and structure.pdf for textiles
PDF
A comparative study of natural language inference in Swahili using monolingua...
PDF
A novel scalable deep ensemble learning framework for big data classification...
PDF
Hybrid model detection and classification of lung cancer
PDF
Encapsulation theory and applications.pdf
PPTX
Tartificialntelligence_presentation.pptx
PDF
Microsoft Solutions Partner Drive Digital Transformation with D365.pdf
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PDF
August Patch Tuesday
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Enhancing emotion recognition model for a student engagement use case through...
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
From MVP to Full-Scale Product A Startup’s Software Journey.pdf
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
DP Operators-handbook-extract for the Mautical Institute
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
A comparative analysis of optical character recognition models for extracting...
PDF
Web App vs Mobile App What Should You Build First.pdf
Digital-Transformation-Roadmap-for-Companies.pptx
WOOl fibre morphology and structure.pdf for textiles
A comparative study of natural language inference in Swahili using monolingua...
A novel scalable deep ensemble learning framework for big data classification...
Hybrid model detection and classification of lung cancer
Encapsulation theory and applications.pdf
Tartificialntelligence_presentation.pptx
Microsoft Solutions Partner Drive Digital Transformation with D365.pdf
SOPHOS-XG Firewall Administrator PPT.pptx
August Patch Tuesday
Programs and apps: productivity, graphics, security and other tools
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Enhancing emotion recognition model for a student engagement use case through...
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
From MVP to Full-Scale Product A Startup’s Software Journey.pdf
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
DP Operators-handbook-extract for the Mautical Institute
Unlocking AI with Model Context Protocol (MCP)
A comparative analysis of optical character recognition models for extracting...
Web App vs Mobile App What Should You Build First.pdf

Writing CouchDB Views using ClojureScript

  • 1. Writing CouchDB Views using ClojureScript Chas Emerick @cemerick http://cemerick.com http://snowtide.com Tuesday, October 11, 2011
  • 2. @cemerick Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 3. @cemerick Founded Snowtide in 2001 Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 4. @cemerick Founded Snowtide in 2001 Clojure full-time since 2008 Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 5. @cemerick Founded Snowtide in 2001 Clojure full-time since 2008 Contributor to Clojure language & libraries Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 6. @cemerick Founded Snowtide in 2001 Clojure full-time since 2008 Contributor to Clojure language & libraries CouchDB user since 2009? Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 7. @cemerick Founded Snowtide in 2001 Clojure full-time since 2008 Contributor to Clojure language & libraries CouchDB user since 2009? O’Reilly author Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 8. CouchDB in 1 minute Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 9. CouchDB in 1 minute • Document-oriented data store Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 10. CouchDB in 1 minute • Document-oriented data store • (Primary) key => JSON object Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 11. CouchDB in 1 minute • Document-oriented data store • (Primary) key => JSON object • HTTP API Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 12. CouchDB in 1 minute • Document-oriented data store • (Primary) key => JSON object • HTTP API • Secondary indexes / queries provided by ‘views’ Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 13. 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 Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 14. 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 Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 15. 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) Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 16. Clutch Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 17. Clutch • CouchDB library for Clojure Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 18. Clutch • CouchDB library for Clojure • (Javascript) view creation and querying support: Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 19. 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);  }"}) Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 20. “Javascript sucks” Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 21. “Javascript sucks” Q.E.D. Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 22. Clutch: Clojure view server Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 23. Clutch: Clojure view server • Use Clojure to write view functions: Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 24. 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))})) Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 25. 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: Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 26. 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 Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 27. 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 Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 28. ClojureScript Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 29. ClojureScript • Clojure : JVM :: ClojureScript : JavaScript Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 30. ClojureScript • Clojure : JVM :: ClojureScript : JavaScript • Ahead-of-time compilation (no eval) Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 31. ClojureScript • Clojure : JVM :: ClojureScript : JavaScript • Ahead-of-time compilation (no eval) • (Optionally) uses Google Closure’s optimizing compiler Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 32. 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! Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 33. Demo Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 34. Language Mapping Thankfully, you don’t need to do much if any interop in views… Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 35. Language Mapping Javascript Thankfully, you don’t need to do much if any interop in views… Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 36. Language Mapping Javascript emit([doc.a,  doc.b],  doc.c); Thankfully, you don’t need to do much if any interop in views… Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 37. Language Mapping Javascript emit([doc.a,  doc.b],  doc.c); ClojureScript Thankfully, you don’t need to do much if any interop in views… Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 38. Language Mapping Javascript emit([doc.a,  doc.b],  doc.c); ClojureScript (js/emit Thankfully, you don’t need to do much if any interop in views… Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 39. Language Mapping Javascript 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… Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 40. Language Mapping Javascript 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… Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 41. Language Mapping Javascript 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… Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 42. Current issues Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 43. Current issues • ClojureScript is not a library (yet!) Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 44. Current issues • ClojureScript is not a library (yet!) • Cannot be depended upon in Leiningen/ Maven Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 45. 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) Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 46. 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 Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 47. Thank you! snipe book Chas Emerick @cemerick http://cemerick.com http://snowtide.com Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 48. Thank you! • CouchDB: http://couchdb.apache.org snipe book Chas Emerick @cemerick http://cemerick.com http://snowtide.com Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 49. Thank you! • CouchDB: http://couchdb.apache.org • Clutch: http://github.com/ashafa/clutch snipe book Chas Emerick @cemerick http://cemerick.com http://snowtide.com Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 50. Thank you! • CouchDB: http://couchdb.apache.org • Clutch: http://github.com/ashafa/clutch • ClojureScript: https://github.com/clojure/ clojurescript snipe book Chas Emerick @cemerick http://cemerick.com http://snowtide.com Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011
  • 51. Thank you! • CouchDB: http://couchdb.apache.org • Clutch: http://github.com/ashafa/clutch • ClojureScript: https://github.com/clojure/ clojurescript • Clutch-ClojureScript: http://github.com/ cemerick/clutch-clojurescript snipe book Chas Emerick @cemerick http://cemerick.com http://snowtide.com Chas Emerick: Writing CouchDB Views using ClojureScript Tuesday, October 11, 2011