-
Notifications
You must be signed in to change notification settings - Fork 0
/
entity.clj
90 lines (82 loc) · 2.33 KB
/
entity.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
(ns datomic-helper.entity
(:require [clojure.walk :as walk]
[datomic.api :as d]
[clojure.set :as cset])
(:use clojure.pprint))
(def database-context
{:q d/q
:transact d/transact
:db d/db})
(defn- transform-nested-out
[result]
(if (map? result)
(dissoc result :db/id)
result))
(defn transform-out
[result-seq]
(let [transformed (walk/prewalk transform-nested-out result-seq)]
(if (and (map? transformed)
(empty? transformed))
nil
transformed)))
(defn find-by-id
([dcontext conn id-ks id]
(let [db ((:db dcontext) conn)
q '[:find (pull ?e [*]) .
:in $ ?id-ks ?id
:where [?e ?id-ks ?id]]]
(->> id
((:q dcontext) q db id-ks)
(transform-out))))
([conn id-ks id]
(find-by-id database-context conn id-ks id)))
(defn find-all
([dcontext conn id-ks]
(let [db ((:db dcontext) conn)
q '[:find [(pull ?e [*]) ...]
:in $ ?id-ks
:where [?e ?id-ks]]]
(->> id-ks
((:q dcontext) q db)
(transform-out))))
([conn id-ks]
(find-all database-context conn id-ks)))
(defn update!
([dcontext
conn
id-ks
id
found-entity
to-be-saved]
(let [attr-old (set (keys found-entity))
attr-partial (set (keys to-be-saved))
intersect (disj (cset/intersection attr-old attr-partial) id-ks)
txs (map (fn [attr]
[:db/cas
[id-ks id]
attr
(get found-entity attr)
(get to-be-saved attr)])
intersect)]
((:transact dcontext) conn txs)))
([conn
id-ks
id
found-entity
to-be-saved]
(update! database-context conn id-ks id found-entity to-be-saved)))
(defn insert!
([dcontext
conn
to-be-saved]
((:transact dcontext) conn [to-be-saved]))
([conn to-be-saved]
(insert! database-context conn to-be-saved)))
(defn upsert!
([dcontext conn [id-ks id] to-be-saved]
(let [found-entity (find-by-id dcontext conn id-ks id)]
(cond found-entity
(update! dcontext conn id-ks id found-entity to-be-saved)
:else (insert! dcontext conn to-be-saved))))
([conn [id-ks id] to-be-saved]
(upsert! database-context conn [id-ks id] to-be-saved)))