Guest User

Untitled

a guest
Nov 24th, 2017
368
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.46 KB | None | 0 0
  1. (ns clj-10kft.demo1
  2. (:require [datomic.api :as d]))
  3.  
  4. ;; create/connect to db
  5.  
  6. (def uri "datomic:dev://localhost:4334/employees")
  7.  
  8. (d/create-database uri)
  9.  
  10. (def conn (d/connect uri))
  11.  
  12.  
  13. ;; schema
  14.  
  15. (def employee-schema
  16. [{:db/ident :employee/id
  17. :db/valueType :db.type/long
  18. :db/unique :db.unique/identity
  19. :db/cardinality :db.cardinality/one}
  20.  
  21. {:db/ident :employee/name
  22. :db/valueType :db.type/string
  23. :db/cardinality :db.cardinality/one}
  24.  
  25. {:db/ident :employee/email
  26. :db/index true
  27. :db/valueType :db.type/string
  28. :db/cardinality :db.cardinality/one}
  29.  
  30. {:db/ident :employee/salary
  31. :db/valueType :db.type/double
  32. :db/cardinality :db.cardinality/one}])
  33.  
  34. (d/transact conn employee-schema)
  35.  
  36.  
  37. ;; add employee
  38.  
  39. (d/transact conn [{:employee/id 123
  40. :employee/name "John Jones"
  41. :employee/email "jones@work.co"
  42. :employee/salary 22000.0}])
  43.  
  44.  
  45. ;; query the employee
  46.  
  47. (d/q '[:find ?e .
  48. :where
  49. [?e :employee/id]]
  50. (d/db conn))
  51.  
  52. ;; query and pull
  53.  
  54. (d/q '[:find (pull ?e [*]) .
  55. :where
  56. [?e :employee/id]]
  57. (d/db conn))
  58.  
  59. ;; combining multiple datalog entries
  60.  
  61. (d/q '[:find (pull ?e [*]) .
  62. :where
  63. [?e :employee/id]
  64. [?e :employee/salary 25000.0]]
  65. (d/db conn))
  66.  
  67. ;; better
  68.  
  69. (d/q '[:find (pull ?e [*]) .
  70. :where
  71. [?e :employee/id]
  72. [?e :employee/salary ?s]
  73. [(> ?s 10000.00)]]
  74. (d/db conn))
  75.  
  76. ;; even better
  77.  
  78. (d/q '[:find (pull ?e [*]) .
  79. :in $ ?greater-than
  80. :where
  81. [?e :employee/id]
  82. [?e :employee/salary ?s]
  83. [(> ?s ?greater-than)]]
  84. (d/db conn)
  85. 10000.00)
  86.  
  87. ;; the reason being...
  88.  
  89. (def query-making-more-than
  90. '[:find (pull ?e [*]) .
  91. :in $ ?greater-than
  92. :where
  93. [?e :employee/id]
  94. [?e :employee/salary ?s]
  95. [(> ?s ?greater-than)]])
  96.  
  97. (d/q query-making-more-than (d/db conn) 10000.0)
  98.  
  99. ;; salary change
  100.  
  101. (d/transact conn [{:employee/id 123
  102. :employee/salary 25000.0}])
  103.  
  104. ;; seeing history
  105.  
  106. (def hdb (d/history (d/db conn)))
  107.  
  108. ;; naive query
  109.  
  110. (vec (d/q '[:find ?e ?a ?v ?t
  111. :where
  112. [?e :employee/id]
  113. [?e ?a ?v ?t]]
  114. hdb))
  115.  
  116. ;; plus op
  117.  
  118. (vec (d/q '[:find ?e ?a ?v ?t ?op
  119. :where
  120. [?e :employee/id]
  121. [?e ?a ?v ?t ?op]]
  122. hdb))
  123.  
  124. ;; giving it a name
  125.  
  126. (vec (d/q '[:find ?an ?v ?t ?op
  127. :where
  128. [?e :employee/id]
  129. [?e ?a ?v ?t ?op]
  130. [?a :db/ident ?an]]
  131. hdb))
Add Comment
Please, Sign In to add comment