From 860549be1c59befc1da8dc8d342791356090c63a Mon Sep 17 00:00:00 2001 From: Ash <4038586-ash14@users.noreply.gitlab.com> Date: Thu, 17 Dec 2020 18:32:19 +0800 Subject: [PATCH 1/2] Fix upserts containing tempids in tuples --- src/datascript/db.cljc | 9 ++++++--- test/datascript/test/tuples.cljc | 23 ++++++++++++++++++++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/datascript/db.cljc b/src/datascript/db.cljc index ed4c1193..2b54946c 100644 --- a/src/datascript/db.cljc +++ b/src/datascript/db.cljc @@ -1100,10 +1100,13 @@ :email {\"ivan@\" 2} :alias {\"abc\" 3 \"def\" 4}}}" - [db entity] + [db entity tempids] (if-some [idents (not-empty (-attrs-by db :db.unique/identity))] (let [resolve (fn [a v] - (:e (first (-datoms db :avet [a v])))) + (let [v (if (coll? v) + (mapv #(get tempids % %) v) + v)] + (:e (first (-datoms db :avet [a v]))))) split (fn [a vs] (reduce (fn [acc v] @@ -1350,7 +1353,7 @@ (cons (assoc entity :db/id id) entities))) ;; upserted => explode | error - :let [[entity' upserts] (resolve-upserts db entity) + :let [[entity' upserts] (resolve-upserts db entity tempids) upserted-eid (validate-upserts entity' upserts)] (some? upserted-eid) diff --git a/test/datascript/test/tuples.cljc b/test/datascript/test/tuples.cljc index 1e8e43e0..d242ad21 100644 --- a/test/datascript/test/tuples.cljc +++ b/test/datascript/test/tuples.cljc @@ -183,7 +183,28 @@ [2 :b "b"] [2 :a+b ["a" "b"]] [2 :c "c"]} - (tdc/all-datoms (d/db conn)))))) + (tdc/all-datoms (d/db conn))))) + + (testing "#378" + (let [conn (d/create-conn {:player {:db/unique :db.unique/identity} + :home {:db/valueType :db.type/ref} + :away {:db/valueType :db.type/ref} + :players {:db/unique :db.unique/identity + :db/tupleAttrs [:home :away]}})] + (d/transact! conn [[:db/add -1 :player "Nadal"] + [:db/add -2 :player "Federer"] + {:home -1 + :away -2}]) + (d/transact! conn [{:db/id "p1" + :player "Nadal"} + {:db/id "p2" + :player "Federer"} + {:db/id "match" + :players ["p1" "p2"] + :game 3}]) + + (is (= 3 (:game (d/entity @conn 3))) + "Upsert successful")))) (deftest test-lookup-refs (let [conn (d/create-conn {:a+b {:db/tupleAttrs [:a :b] From 92b580a153fdbd328e55375b78d23cd6795f28e3 Mon Sep 17 00:00:00 2001 From: Ash <4038586-ash14@users.noreply.gitlab.com> Date: Mon, 21 Dec 2020 17:31:46 +0800 Subject: [PATCH 2/2] Revert last change, update tests --- src/datascript/db.cljc | 9 +++------ test/datascript/test/tuples.cljc | 10 +++++----- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/datascript/db.cljc b/src/datascript/db.cljc index 2b54946c..ed4c1193 100644 --- a/src/datascript/db.cljc +++ b/src/datascript/db.cljc @@ -1100,13 +1100,10 @@ :email {\"ivan@\" 2} :alias {\"abc\" 3 \"def\" 4}}}" - [db entity tempids] + [db entity] (if-some [idents (not-empty (-attrs-by db :db.unique/identity))] (let [resolve (fn [a v] - (let [v (if (coll? v) - (mapv #(get tempids % %) v) - v)] - (:e (first (-datoms db :avet [a v]))))) + (:e (first (-datoms db :avet [a v])))) split (fn [a vs] (reduce (fn [acc v] @@ -1353,7 +1350,7 @@ (cons (assoc entity :db/id id) entities))) ;; upserted => explode | error - :let [[entity' upserts] (resolve-upserts db entity tempids) + :let [[entity' upserts] (resolve-upserts db entity) upserted-eid (validate-upserts entity' upserts)] (some? upserted-eid) diff --git a/test/datascript/test/tuples.cljc b/test/datascript/test/tuples.cljc index d242ad21..53bf0291 100644 --- a/test/datascript/test/tuples.cljc +++ b/test/datascript/test/tuples.cljc @@ -195,13 +195,13 @@ [:db/add -2 :player "Federer"] {:home -1 :away -2}]) - (d/transact! conn [{:db/id "p1" + (d/transact! conn [{:db/id "match" + :players ["p1" "p2"] + :game 3} + {:db/id "p1" :player "Nadal"} {:db/id "p2" - :player "Federer"} - {:db/id "match" - :players ["p1" "p2"] - :game 3}]) + :player "Federer"}]) (is (= 3 (:game (d/entity @conn 3))) "Upsert successful"))))