Skip to content

Commit 4b5d232

Browse files
committed
Fixed regression when transient indexes were mutated and iterated during single tx (closes #294)
1 parent cb5a4a9 commit 4b5d232

8 files changed

Lines changed: 49 additions & 23 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,5 @@ dev/playground.clj
2323
TODO.txt
2424
.cljs_node_repl
2525
node_modules
26-
package-lock.json
26+
package-lock.json
27+
reading

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# WIP
2+
3+
- Fixed regression when transient indexes were mutated and iterated during single tx (#294)
4+
- Bumped persistent-sorted-set to 0.1.2 (throw if transient set is mutated and iterated at the same time)
5+
16
# 0.18.1
27

38
- Bumped persistent-sorted-set to 0.1.1 (Java 8 bytecode)

deps.edn

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
:deps {
3-
persistent-sorted-set {:mvn/version "0.1.0"}
3+
persistent-sorted-set {:mvn/version "0.1.2"}
44
}
55

66
:aliases {
@@ -19,24 +19,24 @@
1919
:dev {
2020
:extra-paths ["dev" "target/classes"]
2121
:extra-deps {
22-
org.clojure/clojurescript {:mvn/version "1.10.516"}
22+
org.clojure/clojurescript {:mvn/version "1.10.520"}
2323
org.clojure/tools.namespace {:mvn/version "0.2.11"}
2424
}
2525
}
2626

2727
:test {
2828
:extra-paths ["test"]
2929
:extra-deps {
30-
org.clojure/clojurescript {:mvn/version "1.10.516"}
30+
org.clojure/clojurescript {:mvn/version "1.10.520"}
3131
lambdaisland/kaocha {:mvn/version "0.0-389"}
32-
lambdaisland/kaocha-cljs {:mvn/version "0.0-16"}
32+
lambdaisland/kaocha-cljs {:mvn/version "0.0-21"}
3333
}
3434
}
3535

3636
:repl {
3737
:extra-deps {
38-
cider/cider-nrepl {:mvn/version "0.19.0"}
39-
nrepl/nrepl {:mvn/version "0.5.3"}
38+
cider/cider-nrepl {:mvn/version "0.21.1"}
39+
nrepl/nrepl {:mvn/version "0.6.0"}
4040
org.clojure/tools.namespace {:mvn/version "0.2.11"}
4141
}
4242
:main-opts [

dev/user.clj

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,13 @@
4646
(clojure.test/test-vars [var])
4747
@clojure.test/*report-counters*))
4848

49+
(defn retest-ns [ns]
50+
(clojure.tools.namespace.repl/refresh)
51+
(clojure.test/test-ns ns))
52+
4953
(defn retest-all []
5054
(clojure.tools.namespace.repl/refresh)
51-
(clojure.test/run-all-tests #"datascript\.test\."))
55+
(clojure.test/run-all-tests #"datascript\.test\..*"))
5256

5357
#_(retest-all)
5458

project.clj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99
:dependencies [
1010
[org.clojure/clojure "1.10.0" :scope "provided"]
11-
[org.clojure/clojurescript "1.10.516" :scope "provided"]
12-
[persistent-sorted-set "0.1.1"]
11+
[org.clojure/clojurescript "1.10.520" :scope "provided"]
12+
[persistent-sorted-set "0.1.2"]
1313
]
1414

1515
:plugins [
@@ -94,7 +94,7 @@
9494
:dependencies [[org.clojure/tools.nrepl "0.2.13"]
9595
[org.clojure/tools.namespace "0.2.11"]
9696
[lambdaisland/kaocha "0.0-389"]
97-
[lambdaisland/kaocha-cljs "0.0-16"]] }
97+
[lambdaisland/kaocha-cljs "0.0-21"]] }
9898
:aot { :aot [#"datascript\.(?!query-v3).*"]
9999
:jvm-opts ["-Dclojure.compiler.direct-linking=true"] }
100100
}

src/datascript/db.cljc

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@
9898
(->> form
9999
dedupe-interfaces
100100
(remove (fn [method]
101-
(when-let [impl (-> method get-sig impl-map)]
101+
(when-some [impl (-> method get-sig impl-map)]
102102
(not= method impl)))))
103103
form))
104104
body))))
@@ -860,7 +860,7 @@
860860
(defn validate-datom [db ^Datom datom]
861861
(when (and (datom-added datom)
862862
(is-attr? db (.-a datom) :db/unique))
863-
(when-let [found (not-empty (-datoms db :avet [(.-a datom) (.-v datom)]))]
863+
(when-some [found (not-empty (-datoms db :avet [(.-a datom) (.-v datom)]))]
864864
(raise "Cannot add " datom " because of unique constraint: " found
865865
{:error :transact/unique
866866
:attribute (.-a datom)
@@ -991,7 +991,7 @@
991991

992992

993993
(defn- upsert-eid [db entity]
994-
(when-let [idents (not-empty (-attrs-by db :db.unique/identity))]
994+
(when-some [idents (not-empty (-attrs-by db :db.unique/identity))]
995995
(->>
996996
(reduce-kv
997997
(fn [acc a v] ;; acc = [e a v]
@@ -1217,7 +1217,7 @@
12171217
ov (if (ref? db a) (entid-strict db ov) ov)
12181218
nv (if (ref? db a) (entid-strict db nv) nv)
12191219
_ (validate-val nv entity)
1220-
datoms (-search db [e a])]
1220+
datoms (vec (-search db [e a]))]
12211221
(if (multival? db a)
12221222
(if (some (fn [^Datom d] (= (.-v d) ov)) datoms)
12231223
(recur (transact-add report [:db/add e a nv]) entities)
@@ -1245,7 +1245,7 @@
12451245
(recur (allocate-eid report e eid) (cons [op eid a v] entities)))))
12461246

12471247
(and (ref? db a) (tempid? v))
1248-
(if-let [vid (get tempids v)]
1248+
(if-some [vid (get tempids v)]
12491249
(recur report (cons [op e a vid] entities))
12501250
(recur (allocate-eid report v (next-eid db)) es))
12511251

@@ -1263,18 +1263,18 @@
12631263
(recur report entities))
12641264

12651265
(= op :db.fn/retractAttribute)
1266-
(if-let [e (entid db e)]
1267-
(let [_ (validate-attr a entity)
1268-
datoms (-search db [e a])]
1266+
(if-some [e (entid db e)]
1267+
(let [_ (validate-attr a entity)
1268+
datoms (vec (-search db [e a]))]
12691269
(recur (reduce transact-retract-datom report datoms)
12701270
(concat (retract-components db datoms) entities)))
12711271
(recur report entities))
12721272

12731273
(or (= op :db.fn/retractEntity)
12741274
(= op :db/retractEntity))
1275-
(if-let [e (entid db e)]
1276-
(let [e-datoms (-search db [e])
1277-
v-datoms (mapcat (fn [a] (-search db [nil a e])) (-attrs-by db :db.type/ref))]
1275+
(if-some [e (entid db e)]
1276+
(let [e-datoms (vec (-search db [e]))
1277+
v-datoms (vec (mapcat (fn [a] (-search db [nil a e])) (-attrs-by db :db.type/ref)))]
12781278
(recur (reduce transact-retract-datom report (concat e-datoms v-datoms))
12791279
(concat (retract-components db e-datoms) entities)))
12801280
(recur report entities))

src/datascript/query.cljc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
(ns datascript.query
1+
(ns ^:no-doc datascript.query
22
(:require
33
[#?(:cljs cljs.reader :clj clojure.edn) :as edn]
44
[clojure.set :as set]

test/datascript/test/transact.cljc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,3 +299,19 @@
299299
(is (= tx-id (+ d/tx0 3)))
300300
(is (= (into {} (d/entity @conn tx-id))
301301
{:prop4 "prop4"})))))))
302+
303+
304+
(deftest test-transient-294
305+
"db.fn/retractEntity retracts attributes of adjacent entities https://github.com/tonsky/datascript/issues/294"
306+
(let [db (reduce #(d/db-with %1 [{:db/id %2 :a1 1 :a2 2 :a3 3}])
307+
(d/empty-db)
308+
(range 1 10))
309+
report (d/with db [[:db.fn/retractEntity 1]
310+
[:db.fn/retractEntity 2]])]
311+
(is (= [(d/datom 1 :a1 1)
312+
(d/datom 1 :a2 2)
313+
(d/datom 1 :a3 3)
314+
(d/datom 2 :a1 1)
315+
(d/datom 2 :a2 2)
316+
(d/datom 2 :a3 3)]
317+
(:tx-data report)))))

0 commit comments

Comments
 (0)