ryoakg
8/13/2017 - 5:01 AM

cupboard.clj

(boot.core/set-env! :dependencies '[[cupboard "1.0beta1"]])

(require '[cupboard.core :as cb]
         '[clojure.string :as str]
         '[clojure.java.io :as io])
;; cupboard.utils は特に必用ない

(cb/open-cupboard! "cupboard-test")
;; (cb/open-cupboard (io/file "cupboard-test"))

(cb/defpersist book
  ((:isbn :index :unique)
   (:title :index :any)
   (:author :index :any)))

(do book)
;; => #object[clojure.lang.PersistentStructMap$Def 0x724a2097 "clojure.lang.PersistentStructMap$Def@724a2097"]


(doto book
  (cb/make-instance ["0393039854", "The First Folio", "Shakespeare, William"])
  (cb/make-instance ["0393925870", "The Canterbury Tales", "Chaucer"])
  (cb/make-instance ["143851557X", "Troilus and Criseyde", "Chaucer"])
  (cb/make-instance ["019280619X", "Paradise Lost", "Milton, John"]))


;;; cb/query automatically replaces Keywords with getting attributes.
(cb/query (str/starts-with? :isbn "039"))
;; => ({:isbn "0393039854", :title "The First Folio", :author "Shakespeare, William"} {:isbn "0393925870", :title "The Canterbury Tales", :author "Chaucer"})

[(->> (cb/query (= :author "Chaucer"))
      (map class) distinct)
 (->> (cb/query (= :author "Chaucer") :struct book)
      (map class) distinct)]
;; => [(clojure.lang.PersistentArrayMap) (clojure.lang.PersistentStructMap)]


;;; Update
(cb/query (= :author "Chaucer"))
;; => ({:isbn "0393925870", :title "The Canterbury Tales", :author "Chaucer"} {:isbn "143851557X", :title "Troilus and Criseyde", :author "Chaucer"})
(cb/query (= :author "Chaucer")
             :callback #(cb/passoc! % :author "Chaucer, Geoffrey"))
;; => ({:isbn "0393925870", :title "The Canterbury Tales", :author "Chaucer, Geoffrey"} {:isbn "143851557X", :title "Troilus and Criseyde", :author "Chaucer, Geoffrey"})
(cb/query (str/starts-with? :author "Chaucer"))
;; => ({:isbn "0393925870", :title "The Canterbury Tales", :author "Chaucer, Geoffrey"} {:isbn "143851557X", :title "Troilus and Criseyde", :author "Chaucer, Geoffrey"})


;;; 数値やベクタも入る
(cb/make-instance book ["1438515yyX", 5, "aaa"])
(cb/query (= :isbn "1438515yyX"))

(cb/make-instance book ["1438515yyZ", [5], "aaa"])
(cb/query (= :isbn "1438515yyZ"))


;;; etc
(->> (cb/query (str/starts-with? :isbn "039"))
     (map meta))
;; => ({:primary-key #uuid "38a92bcb-17c7-4bf6-ba81-5ad5f94c8fd0", :index-uniques #{:isbn}, :index-anys #{:title :author}} {:primary-key #uuid "27f1ff86-e1db-49c3-8578-a2a69787af6e", :index-uniques #{:isbn}, :index-anys #{:title :author}})


;;; cupboard > shelf  という構造になっているみたい
(cb/list-shelves)
;; => ("_default")
(do cupboard.core/*default-shelf-name*)
;; => "_default"


;;; delete all the data but the db itself.
(cb/clear-shelf)

;;;
(cb/close-cupboard!)
;; (cb/open-cupboard (io/file "cupboard-test"))