diff --git a/src/datascript/core.cljs b/src/datascript/core.cljs index a9c8000c..12805f54 100644 --- a/src/datascript/core.cljs +++ b/src/datascript/core.cljs @@ -178,7 +178,7 @@ (defn- explode [db entity] (let [eid (:db/id entity)] (for [[a vs] (dissoc entity :db/id) - v (if (and (sequential? vs) + v (if (and (coll? vs) (multival? db a)) vs [vs])] [:db/add eid a v]))) diff --git a/test/test/datascript.cljs b/test/test/datascript.cljs index 467ba581..fa62f82b 100644 --- a/test/test/datascript.cljs +++ b/test/test/datascript.cljs @@ -231,23 +231,27 @@ (deftest test-explode - (let [conn (d/create-conn { :aka { :db/cardinality :db.cardinality/many } - :also { :db/cardinality :db.cardinality/many} })] - (d/transact! conn [{:db/id -1 - :name "Ivan" - :age 16 - :aka ["Devil" "Tupen"] - :also "ok"}]) - (is (= (d/q '[:find ?n ?a - :where [1 :name ?n] - [1 :age ?a]] @conn) - #{["Ivan" 16]})) - (is (= (d/q '[:find ?v - :where [1 :also ?v]] @conn) - #{["ok"]})) - (is (= (d/q '[:find ?v - :where [1 :aka ?v]] @conn) - #{["Devil"] ["Tupen"]})))) + ;;Test that explode works properly with vectors, sets, and lists. + (doseq [coll [["Devil" "Tupen"] + #{"Devil" "Tupen"} + '("Devil" "Tupen")]] + (let [conn (d/create-conn { :aka { :db/cardinality :db.cardinality/many } + :also { :db/cardinality :db.cardinality/many} })] + (d/transact! conn [{:db/id -1 + :name "Ivan" + :age 16 + :aka coll + :also "ok"}]) + (is (= (d/q '[:find ?n ?a + :where [1 :name ?n] + [1 :age ?a]] @conn) + #{["Ivan" 16]})) + (is (= (d/q '[:find ?v + :where [1 :also ?v]] @conn) + #{["ok"]})) + (is (= (d/q '[:find ?v + :where [1 :aka ?v]] @conn) + #{["Devil"] ["Tupen"]}))))) (deftest test-joins