Skip to content

Upserting with unique tuple refs fails #378

@ash14

Description

@ash14

Attempting an upsert to an entity using its unique tuple attribute does not work as expected.

Hope this example is clear:

(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}]))

Execution error (ClassCastException) at datascript.db/value-compare (db.cljc:339).
java.lang.String cannot be cast to java.lang.Number

Expecting a result like (= 3 (:game (d/entity @conn 3)))

I don't think this is related to #364?

Thanks. I'll try to open a PR for this if it's straightforward enough.

Edit: for what it's worth, here's the same example on Datomic 1.0.6202
@(d/transact conn [{:db/ident :player
                    :db/valueType :db.type/string
                    :db/unique :db.unique/identity
                    :db/cardinality :db.cardinality/one}

                   {:db/ident :home
                    :db/valueType :db.type/string
                    :db/cardinality :db.cardinality/one}

                   {:db/ident :away
                    :db/valueType :db.type/string
                    :db/cardinality :db.cardinality/one}

                   {:db/ident :players
                    :db/unique :db.unique/identity
                    :db/valueType :db.type/tuple
                    :db/tupleAttrs [:home :away]
                    :db/cardinality :db.cardinality/one}

                   {:db/ident :game
                    :db/valueType :db.type/long
                    :db/cardinality :db.cardinality/one}])

@(d/transact conn [[:db/add "p1" :player "Nadal"]
                   [:db/add "p2" :player "Federer"]
                   {:home "p1"
                    :away "p2"}])

@(d/transact conn [{:db/id "p1" :player "Nadal"}
                   {:db/id "p2" :player "Federer"}
                   {:db/id "match"
                    :players ["p1" "p2"]
                    :game 3}])

(d/pull (d/db conn) '[*] (:e (last (d/datoms (d/db conn) :eavt))))
; => {:db/id 17592186045420, :home "p1", :away "p2", :players ["p1" "p2"], :game 3}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions