Skip to content

Commit 0ac6cdf

Browse files
committed
Issue 339: Supprt: db/retract without value
- :db/retract with null value is treated as :db.fn/retractAttribute - Docstring for 'transact!' is modified to reflect the change
1 parent a769e0f commit 0ac6cdf

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

src/datascript/core.cljc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,9 @@
463463
464464
; retract single entity attribute
465465
(transact! conn [[:db.fn/retractAttribute 1 :name]])
466+
467+
; ... or equivalently (since Datomic changed its API to support this):
468+
(transact! conn [[:db/retract 1 :name]])
466469
467470
; retract all entity attributes (effectively deletes entity)
468471
(transact! conn [[:db.fn/retractEntity 1]])

src/datascript/db.cljc

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1231,7 +1231,8 @@
12311231
(= op :db/add)
12321232
(recur (transact-add report entity) entities)
12331233

1234-
(= op :db/retract)
1234+
(and (= op :db/retract)
1235+
v)
12351236
(if-some [e (entid db e)]
12361237
(let [v (if (ref? db a) (entid-strict db v) v)]
12371238
(validate-attr a entity)
@@ -1241,7 +1242,9 @@
12411242
(recur report entities)))
12421243
(recur report entities))
12431244

1244-
(= op :db.fn/retractAttribute)
1245+
(or (= op :db.fn/retractAttribute)
1246+
(and (= op :db/retract)
1247+
(nil? v)))
12451248
(if-some [e (entid db e)]
12461249
(let [_ (validate-attr a entity)
12471250
datoms (vec (-search db [e a]))]

test/datascript/test/transact.cljc

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,25 @@
111111
:where [2 ?a ?v]] db)
112112
#{[:name "Petr"] [:age 37]})))))
113113

114+
(deftest test-retract-without-value-339
115+
(let [db (-> (d/empty-db {:aka { :db/cardinality :db.cardinality/many }
116+
:friend { :db/valueType :db.type/ref }})
117+
(d/db-with [ { :db/id 1, :name "Ivan", :age 15, :aka ["X" "Y" "Z"], :friend 2 }
118+
{ :db/id 2, :name "Petr", :age 37 } ]))]
119+
(testing "Retract :name without providing v"
120+
(let [db (d/db-with db [[:db/retract 1 :name]])]
121+
(is (= (d/q '[:find ?a ?v
122+
:where [1 ?a ?v]]
123+
db)
124+
#{[:friend 2] [:age 15] [:aka "Z"] [:aka "Y"] [:aka "X"]}))))
125+
(testing "Retract :aka (cardinality many) without providing v"
126+
(let [db (d/db-with db [[:db/retract 1 :aka]])]
127+
(is (= (d/q '[:find ?a ?v
128+
:where [1 ?a ?v]]
129+
db)
130+
#{[:friend 2] [:age 15] [:name "Ivan"]}))))))
131+
132+
114133
(deftest test-retract-fns-not-found
115134
(let [db (-> (d/empty-db { :name { :db/unique :db.unique/identity } })
116135
(d/db-with [[:db/add 1 :name "Ivan"]]))
@@ -324,4 +343,4 @@
324343
(d/datom 2 :a1 1)
325344
(d/datom 2 :a2 2)
326345
(d/datom 2 :a3 3)]
327-
(:tx-data report)))))
346+
(:tx-data report)))))

0 commit comments

Comments
 (0)