Skip to content

Instantly share code, notes, and snippets.

@benkamphaus
Last active August 29, 2015 14:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save benkamphaus/3be24a0ffa9090015f22 to your computer and use it in GitHub Desktop.
Save benkamphaus/3be24a0ffa9090015f22 to your computer and use it in GitHub Desktop.
A couple of or-join examples against a toy schema.
(ns datomic-manual-tests.or-join
(:require [datomic.api :as d]))
(def db-uri (apply str ["datomic:mem://test" (d/squuid)]))
(d/create-database db-uri)
(def conn (d/connect db-uri))
(def schema
[{:db/id (d/tempid :db.part/db)
:db/ident :person/name
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/unique :db.unique/identity
:db.install/_attribute :db.part/db}
{:db/id (d/tempid :db.part/db)
:db/ident :person/active
:db/valueType :db.type/boolean
:db/cardinality :db.cardinality/one
:db.install/_attribute :db.part/db}
{:db/id (d/tempid :db.part/db)
:db/ident :person/vip
:db/valueType :db.type/boolean
:db/cardinality :db.cardinality/one
:db.install/_attribute :db.part/db}
{:db/id (d/tempid :db.part/db)
:db/ident :org/contact
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one
:db.install/_attribute :db.part/db}
{:db/id (d/tempid :db.part/db)
:db/ident :org/name
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db.install/_attribute :db.part/db}])
@(d/transact conn schema)
(def tx [{:db/id (d/tempid :db.part/user)
:person/name "Jim"
:person/vip false
:person/active true}
{:db/id (d/tempid :db.part/user)
:person/name "Joan"
:person/vip true
:person/active true}
{:db/id (d/tempid :db.part/user)
:person/name "Bob"
:person/vip false
:person/active false}
{:db/id (d/tempid :db.part/user)
:person/name "Ben"
:person/vip true
:person/active false}])
@(d/transact conn tx)
(def orgs-tx [{:db/id (d/tempid :db.part/user)
:org/name "Synergy Corp"
:org/contact [:person/name "Ben"]}
{:db/id (d/tempid :db.part/user)
:org/name "Our Astounding Journey"
:org/contact [:person/name "Bob"]}
{:db/id (d/tempid :db.part/user)
:org/name "Active 500 Corp"
:org/contact [:person/name "Joan"]}
{:db/id (d/tempid :db.part/user)
:org/name "Bootstrap Startup, Inc."
:org/contact [:person/name "Jim"]}])
@(d/transact conn orgs-tx)
; Straight forward case of getting active or vip user.
(d/q '[:find (pull ?p [*])
:where [?p :person/name]
(or-join [?p]
[?p :person/vip true]
[?p :person/active true])]
(d/db conn))
; Less straight forward case of getting org w/active or vip user
(d/q '[:find [(pull ?o [:org/name]) ...]
:where [?o :org/contact ?p]
(or-join [?p]
[?p :person/vip true]
[?p :person/active true])]
(d/db conn))
; Returns [{:org/name "Synergy Corp"} {:org/name "Active 500 Corp"} {:org/name "Bootstrap Startup, Inc."}]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment