(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"))