Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (ns clj-10kft.demo1
- (:require [datomic.api :as d]))
- ;; create/connect to db
- (def uri "datomic:dev://localhost:4334/employees")
- (d/create-database uri)
- (def conn (d/connect uri))
- ;; schema
- (def employee-schema
- [{:db/ident :employee/id
- :db/valueType :db.type/long
- :db/unique :db.unique/identity
- :db/cardinality :db.cardinality/one}
- {:db/ident :employee/name
- :db/valueType :db.type/string
- :db/cardinality :db.cardinality/one}
- {:db/ident :employee/email
- :db/index true
- :db/valueType :db.type/string
- :db/cardinality :db.cardinality/one}
- {:db/ident :employee/salary
- :db/valueType :db.type/double
- :db/cardinality :db.cardinality/one}])
- (d/transact conn employee-schema)
- ;; add employee
- (d/transact conn [{:employee/id 123
- :employee/name "John Jones"
- :employee/email "jones@work.co"
- :employee/salary 22000.0}])
- ;; query the employee
- (d/q '[:find ?e .
- :where
- [?e :employee/id]]
- (d/db conn))
- ;; query and pull
- (d/q '[:find (pull ?e [*]) .
- :where
- [?e :employee/id]]
- (d/db conn))
- ;; combining multiple datalog entries
- (d/q '[:find (pull ?e [*]) .
- :where
- [?e :employee/id]
- [?e :employee/salary 25000.0]]
- (d/db conn))
- ;; better
- (d/q '[:find (pull ?e [*]) .
- :where
- [?e :employee/id]
- [?e :employee/salary ?s]
- [(> ?s 10000.00)]]
- (d/db conn))
- ;; even better
- (d/q '[:find (pull ?e [*]) .
- :in $ ?greater-than
- :where
- [?e :employee/id]
- [?e :employee/salary ?s]
- [(> ?s ?greater-than)]]
- (d/db conn)
- 10000.00)
- ;; the reason being...
- (def query-making-more-than
- '[:find (pull ?e [*]) .
- :in $ ?greater-than
- :where
- [?e :employee/id]
- [?e :employee/salary ?s]
- [(> ?s ?greater-than)]])
- (d/q query-making-more-than (d/db conn) 10000.0)
- ;; salary change
- (d/transact conn [{:employee/id 123
- :employee/salary 25000.0}])
- ;; seeing history
- (def hdb (d/history (d/db conn)))
- ;; naive query
- (vec (d/q '[:find ?e ?a ?v ?t
- :where
- [?e :employee/id]
- [?e ?a ?v ?t]]
- hdb))
- ;; plus op
- (vec (d/q '[:find ?e ?a ?v ?t ?op
- :where
- [?e :employee/id]
- [?e ?a ?v ?t ?op]]
- hdb))
- ;; giving it a name
- (vec (d/q '[:find ?an ?v ?t ?op
- :where
- [?e :employee/id]
- [?e ?a ?v ?t ?op]
- [?a :db/ident ?an]]
- hdb))
Add Comment
Please, Sign In to add comment