Skip to content

Instantly share code, notes, and snippets.

@jdkealy
Created August 16, 2016 17:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jdkealy/4d8da9c5bbb37df19978c45256ea1856 to your computer and use it in GitHub Desktop.
Save jdkealy/4d8da9c5bbb37df19978c45256ea1856 to your computer and use it in GitHub Desktop.
; datomic func
[{:db/id #db/id [:db.part/user]
:db/ident :person/namer
:db/doc "ensures unique name"
:db/fn #db/fn {:lang "clojure"
:params [db oid name]
:code "(let [ e (datomic.api/q
'[:find ?e
:in $ ?oid ?name
:where
[?e :person/name ?name]
[?e :person/organization ?oid]]
db oid name )]
(when-not (ffirst e )
(let [id (datomic.api/tempid :db.part/user)]
[[:db/add id :person/name name]
[:db/add id :person/organization oid]])))" }}]
; clojure func
(defn get-or-create-person [oid name]
(let [unique-name @(d/transact @db/conn [[:person/namer oid name]])
person-ent (d/q
'[:find ?e
:in $ ?oid ?name
:where
[?e :person/name ?name]
[?e :person/organization ?oid]]
(db/_d) oid name) ]
(ffirst person-ent)))
; test
(deftest it-has-a-thread-safe-get-or-create
(let [{:keys [user req]} (stub-it)
name "John Reilly"
params (map
(fn [_]
[(:db/id user) name])
(range 10))
tx (pmap (fn [param]
(people/get-or-create-person (:db/id user) name)
) params)]
(is (apply = tx))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment