Skip to content

Instantly share code, notes, and snippets.

@ivarref
Last active February 6, 2020 09:22
Show Gist options
  • Save ivarref/dc2a5698cd0b791121bfadfa934bcd74 to your computer and use it in GitHub Desktop.
Save ivarref/dc2a5698cd0b791121bfadfa934bcd74 to your computer and use it in GitHub Desktop.
(ns dato.tuples2
(:require [datomic.api :as d])) ; Datomic pro 0.9.6024
(def url "datomic:mem://test-db")
(def conn (do (d/delete-database url)
(d/create-database url)
(d/connect url)))
(def schema
[{:db/ident :student/first
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one}
{:db/ident :student/last
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one}
{:db/ident :student/email
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/unique :db.unique/identity}
{:db/ident :semester/year
:db/valueType :db.type/long
:db/cardinality :db.cardinality/one}
{:db/ident :semester/season
:db/valueType :db.type/keyword
:db/cardinality :db.cardinality/one}
{:db/ident :semester/year+season
:db/valueType :db.type/tuple
:db/tupleAttrs [:semester/year :semester/season]
:db/cardinality :db.cardinality/one
:db/unique :db.unique/identity}
{:db/ident :course/id
:db/valueType :db.type/string
:db/unique :db.unique/identity
:db/cardinality :db.cardinality/one}
{:db/ident :course/name
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one}
{:db/ident :reg/course
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one}
{:db/ident :reg/semester
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one}
{:db/ident :reg/student
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one}
{:db/ident :reg/course+semester+student
:db/valueType :db.type/tuple
:db/tupleAttrs [:reg/course :reg/semester :reg/student]
:db/cardinality :db.cardinality/one
:db/unique :db.unique/identity}])
@(d/transact conn schema)
@(d/transact conn [{:semester/year 2018
:semester/season :fall}
{:course/id "BIO-101"}
{:student/first "John"
:student/last "Doe"
:student/email "[email protected]"}])
@(d/transact conn [{:reg/course [:course/id "BIO-101"]
:reg/semester [:semester/year+season [2018 :fall]]
:reg/student [:student/email "[email protected]"]}])
(defn db-id [lookup-ref]
(d/q '[:find ?e .
:in $ ?id-attr ?value
:where
[?e ?id-attr ?value]]
(d/db conn)
(first lookup-ref)
(second lookup-ref)))
(comment
(d/q '[:find (pull ?e [*]) .
:in $ ?course-semester-student
:where
[?e :reg/course+semester+student ?course-semester-student]]
(d/db conn)
[(db-id [:course/id "BIO-101"])
(db-id [:semester/year+season [2018 :fall]])
(db-id [:student/email "[email protected]"])]))
; =>
;{:db/id 17592186045422,
; :reg/course #:db{:id 17592186045419},
; :reg/semester #:db{:id 17592186045418},
; :reg/student #:db{:id 17592186045420},
; :reg/course+semester+student [17592186045419 17592186045418 17592186045420]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment