Created
April 22, 2016 14:09
-
-
Save benkamphaus/24bb56da776b53736f02ded28d6f9338 to your computer and use it in GitHub Desktop.
Find and retract orphans in Datomic
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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