Skip to content

Instantly share code, notes, and snippets.

@benkamphaus
Created April 22, 2016 14:09
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/24bb56da776b53736f02ded28d6f9338 to your computer and use it in GitHub Desktop.
Save benkamphaus/24bb56da776b53736f02ded28d6f9338 to your computer and use it in GitHub Desktop.
Find and retract orphans in Datomic
(ns datomic-manual-tests.not-unique
(:require [datomic.api :as d]))
(def db-uri "datomic:mem://not-unique")
(d/create-database db-uri)
(def conn (d/connect db-uri))
(def schema
[{:db/id (d/tempid :db.part/db)
:db/ident :parent/child
: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 :parent/name
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db.install/_attribute :db.part/db}
{:db/id (d/tempid :db.part/db)
:db/ident :child/name
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db.install/_attribute :db.part/db}])
@(d/transact conn schema)
@(d/transact conn [{:db/id (d/tempid :db.part/user -1)
:parent/name "Bill"
:parent/child (d/tempid :db.part/user -2)}
{:db/id (d/tempid :db.part/user -2)
:child/name "Jill"}])
(def bill-eid
(d/q '[:find ?e .
:where
[?e :parent/name "Bill"]]
(d/db conn)))
@(d/transact conn [{:db/id (d/tempid :db.part/user -3)
:child/name "Jill"}
[:db/add bill-eid :parent/child (d/tempid :db.part/user -3)]])
(d/q '[:find ?name (count ?p)
:where
[?p :child/name ?name]]
(d/db conn))
;; [["Jill 2"]]
(def orphan-q
'[:find ?p ?name
:where
[?p :child/name ?name]
(not [_ :parent/child ?p])])
(def q-results (d/q orphan-q (d/db conn)))
(def retractions
(mapv (fn [[eid cname]]
[:db.fn/retractEntity eid]) q-results))
(def db-after (:db-after @(d/transact conn retractions)))
(d/q orphan-q db-after)
;#{}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment