Skip to content

Instantly share code, notes, and snippets.

@mbossenbroek
Created April 6, 2016 22:17
Show Gist options
  • Save mbossenbroek/979339752415f1a30dad71a4b5c6d921 to your computer and use it in GitHub Desktop.
Save mbossenbroek/979339752415f1a30dad71a4b5c6d921 to your computer and use it in GitHub Desktop.
Datomic or-join binding
(let [uri (str "datomic:mem://" (d/squuid))
_ (d/create-database uri)
conn (d/connect uri)
schema [
{:db/id #db/id[:db.part/db]
:db/ident :a/id
:db/valueType :db.type/uuid
:db/cardinality :db.cardinality/one
:db.install/_attribute :db.part/db}
{:db/id #db/id[:db.part/db]
:db/ident :b/as
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many
:db.install/_attribute :db.part/db}
{:db/id #db/id[:db.part/db]
:db/ident :b/id
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db.install/_attribute :db.part/db}
{:db/id #db/id[:db.part/db]
:db/ident :c/b-id
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db.install/_attribute :db.part/db}
]
data [
{:db/id (d/tempid :db.part/user -1)
:a/id (d/squuid)}
{:db/id (d/tempid :db.part/user -2)
:b/as #{(d/tempid :db.part/user -1)}
:b/id "abc"}
{:db/id (d/tempid :db.part/user -3)
:c/b-id "abc"}
]
]
@(d/transact conn schema)
@(d/transact conn data)
(let [db (d/db conn)
?a (->> (d/datoms db :aevt :a/id)
(map :e)
first)]
(is (=
;; normal query
(d/q '{:find [[?c ...]]
:in [$ ?a]
:where [[?b :b/as ?a]
[?b :b/id ?data-id]
[?c :c/b-id ?data-id]]}
(d/db conn) ?a)
;; query with or-join
(d/q '{:find [[?c ...]]
:in [$ ?a]
:where [[?b :b/as ?a]
(or-join [?b]
(and [?b :b/id ?data-id]
[?c :c/b-id ?data-id]))]}
(d/db conn) ?a)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment