datahike-browser-tests 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/.circleci/config.yml +405 -0
  2. package/.circleci/scripts/gen_ci.clj +194 -0
  3. package/.cirrus.yml +60 -0
  4. package/.clj-kondo/babashka/sci/config.edn +1 -0
  5. package/.clj-kondo/babashka/sci/sci/core.clj +9 -0
  6. package/.clj-kondo/config.edn +95 -0
  7. package/.dir-locals.el +2 -0
  8. package/.github/FUNDING.yml +3 -0
  9. package/.github/ISSUE_TEMPLATE/1-bug-report.yml +68 -0
  10. package/.github/ISSUE_TEMPLATE/2-feature-request.yml +28 -0
  11. package/.github/ISSUE_TEMPLATE/config.yml +6 -0
  12. package/.github/pull_request_template.md +24 -0
  13. package/.github/workflows/native-image.yml +84 -0
  14. package/LICENSE +203 -0
  15. package/README.md +273 -0
  16. package/bb/deps.edn +9 -0
  17. package/bb/resources/github-fingerprints +3 -0
  18. package/bb/resources/native-image-tests/run-bb-pod-tests.clj +162 -0
  19. package/bb/resources/native-image-tests/run-libdatahike-tests +12 -0
  20. package/bb/resources/native-image-tests/run-native-image-tests +74 -0
  21. package/bb/resources/native-image-tests/run-python-tests +22 -0
  22. package/bb/resources/native-image-tests/testconfig.attr-refs.edn +6 -0
  23. package/bb/resources/native-image-tests/testconfig.edn +5 -0
  24. package/bb/resources/template/.settings/org.eclipse.jdt.apt.core.prefs +2 -0
  25. package/bb/resources/template/.settings/org.eclipse.jdt.core.prefs +9 -0
  26. package/bb/resources/template/.settings/org.eclipse.m2e.core.prefs +4 -0
  27. package/bb/resources/template/pom.xml +22 -0
  28. package/bb/src/tools/build.clj +132 -0
  29. package/bb/src/tools/clj_kondo.clj +32 -0
  30. package/bb/src/tools/deploy.clj +26 -0
  31. package/bb/src/tools/examples.clj +19 -0
  32. package/bb/src/tools/npm.clj +100 -0
  33. package/bb/src/tools/python.clj +14 -0
  34. package/bb/src/tools/release.clj +94 -0
  35. package/bb/src/tools/test.clj +148 -0
  36. package/bb/src/tools/version.clj +47 -0
  37. package/bb.edn +269 -0
  38. package/benchmark/src/benchmark/cli.clj +195 -0
  39. package/benchmark/src/benchmark/compare.clj +157 -0
  40. package/benchmark/src/benchmark/config.clj +316 -0
  41. package/benchmark/src/benchmark/measure.clj +187 -0
  42. package/benchmark/src/benchmark/store.clj +190 -0
  43. package/benchmark/test/benchmark/measure_test.clj +156 -0
  44. package/build.clj +30 -0
  45. package/config.edn +49 -0
  46. package/deps.edn +138 -0
  47. package/dev/sandbox.clj +82 -0
  48. package/dev/sandbox.cljs +127 -0
  49. package/dev/sandbox_benchmarks.clj +27 -0
  50. package/dev/sandbox_client.clj +87 -0
  51. package/dev/sandbox_transact_bench.clj +109 -0
  52. package/dev/user.clj +79 -0
  53. package/doc/README.md +96 -0
  54. package/doc/adl/README.md +6 -0
  55. package/doc/adl/adr-000-adr.org +28 -0
  56. package/doc/adl/adr-001-attribute-references.org +15 -0
  57. package/doc/adl/adr-002-build-tooling.org +54 -0
  58. package/doc/adl/adr-003-db-meta-data.md +52 -0
  59. package/doc/adl/adr-004-github-flow.md +40 -0
  60. package/doc/adl/adr-XYZ-template.md +30 -0
  61. package/doc/adl/index.org +3 -0
  62. package/doc/assets/datahike-logo.svg +3 -0
  63. package/doc/assets/datahiking-invoice.org +85 -0
  64. package/doc/assets/hhtree2.png +0 -0
  65. package/doc/assets/network_topology.svg +624 -0
  66. package/doc/assets/perf.png +0 -0
  67. package/doc/assets/schema_mindmap.mm +132 -0
  68. package/doc/assets/schema_mindmap.svg +970 -0
  69. package/doc/assets/temporal_index.mm +74 -0
  70. package/doc/backend-development.md +78 -0
  71. package/doc/bb-pod.md +89 -0
  72. package/doc/benchmarking.md +360 -0
  73. package/doc/bindings/edn-conversion.md +383 -0
  74. package/doc/cli.md +162 -0
  75. package/doc/cljdoc.edn +27 -0
  76. package/doc/cljs-support.md +133 -0
  77. package/doc/config.md +406 -0
  78. package/doc/contributing.md +114 -0
  79. package/doc/datalog-vs-sql.md +210 -0
  80. package/doc/datomic_differences.md +109 -0
  81. package/doc/development/pull-api-ns.md +186 -0
  82. package/doc/development/pull-frame-state-diagram.jpg +0 -0
  83. package/doc/distributed.md +566 -0
  84. package/doc/entity_spec.md +92 -0
  85. package/doc/gc.md +273 -0
  86. package/doc/java-api.md +808 -0
  87. package/doc/javascript-api.md +421 -0
  88. package/doc/libdatahike.md +86 -0
  89. package/doc/logging_and_error_handling.md +43 -0
  90. package/doc/norms.md +66 -0
  91. package/doc/schema-migration.md +85 -0
  92. package/doc/schema.md +287 -0
  93. package/doc/storage-backends.md +363 -0
  94. package/doc/store-id-refactoring.md +596 -0
  95. package/doc/time_variance.md +325 -0
  96. package/doc/unstructured.md +167 -0
  97. package/doc/versioning.md +261 -0
  98. package/examples/basic/README.md +19 -0
  99. package/examples/basic/deps.edn +6 -0
  100. package/examples/basic/docker-compose.yml +13 -0
  101. package/examples/basic/src/examples/core.clj +60 -0
  102. package/examples/basic/src/examples/schema.clj +155 -0
  103. package/examples/basic/src/examples/store.clj +60 -0
  104. package/examples/basic/src/examples/time_travel.clj +185 -0
  105. package/examples/java/.settings/org.eclipse.core.resources.prefs +3 -0
  106. package/examples/java/.settings/org.eclipse.jdt.apt.core.prefs +2 -0
  107. package/examples/java/.settings/org.eclipse.jdt.core.prefs +9 -0
  108. package/examples/java/.settings/org.eclipse.m2e.core.prefs +4 -0
  109. package/examples/java/README.md +162 -0
  110. package/examples/java/pom.xml +62 -0
  111. package/examples/java/src/main/java/examples/QuickStart.java +115 -0
  112. package/examples/java/src/main/java/examples/SchemaExample.java +148 -0
  113. package/examples/java/src/main/java/examples/TimeTravelExample.java +121 -0
  114. package/flake.lock +27 -0
  115. package/flake.nix +27 -0
  116. package/http-server/datahike/http/middleware.clj +75 -0
  117. package/http-server/datahike/http/server.clj +269 -0
  118. package/java/src/datahike/java/Database.java +274 -0
  119. package/java/src/datahike/java/Datahike.java +281 -0
  120. package/java/src/datahike/java/DatahikeGeneratedTest.java +349 -0
  121. package/java/src/datahike/java/DatahikeTest.java +370 -0
  122. package/java/src/datahike/java/EDN.java +170 -0
  123. package/java/src/datahike/java/IEntity.java +11 -0
  124. package/java/src/datahike/java/Keywords.java +161 -0
  125. package/java/src/datahike/java/SchemaFlexibility.java +52 -0
  126. package/java/src/datahike/java/Util.java +219 -0
  127. package/karma.conf.js +19 -0
  128. package/libdatahike/compile-cpp +7 -0
  129. package/libdatahike/src/datahike/impl/LibDatahikeBase.java +203 -0
  130. package/libdatahike/src/datahike/impl/libdatahike.clj +59 -0
  131. package/libdatahike/src/test_cpp.cpp +61 -0
  132. package/npm-package/PUBLISHING.md +140 -0
  133. package/npm-package/README.md +226 -0
  134. package/npm-package/package.template.json +34 -0
  135. package/npm-package/test-isomorphic.ts +281 -0
  136. package/npm-package/test.js +557 -0
  137. package/npm-package/typescript-test.ts +70 -0
  138. package/package.json +16 -0
  139. package/pydatahike/README.md +569 -0
  140. package/pydatahike/pyproject.toml +91 -0
  141. package/pydatahike/setup.py +42 -0
  142. package/pydatahike/src/datahike/__init__.py +134 -0
  143. package/pydatahike/src/datahike/_native.py +250 -0
  144. package/pydatahike/src/datahike/_version.py +2 -0
  145. package/pydatahike/src/datahike/database.py +722 -0
  146. package/pydatahike/src/datahike/edn.py +311 -0
  147. package/pydatahike/src/datahike/py.typed +0 -0
  148. package/pydatahike/tests/conftest.py +17 -0
  149. package/pydatahike/tests/test_basic.py +170 -0
  150. package/pydatahike/tests/test_database.py +51 -0
  151. package/pydatahike/tests/test_edn_conversion.py +299 -0
  152. package/pydatahike/tests/test_query.py +99 -0
  153. package/pydatahike/tests/test_schema.py +55 -0
  154. package/resources/clj-kondo.exports/io.replikativ/datahike/config.edn +5 -0
  155. package/resources/example_server.edn +4 -0
  156. package/shadow-cljs.edn +56 -0
  157. package/src/data_readers.clj +7 -0
  158. package/src/datahike/api/impl.cljc +176 -0
  159. package/src/datahike/api/specification.cljc +633 -0
  160. package/src/datahike/api/types.cljc +261 -0
  161. package/src/datahike/api.cljc +41 -0
  162. package/src/datahike/array.cljc +99 -0
  163. package/src/datahike/cli.clj +166 -0
  164. package/src/datahike/cljs.cljs +6 -0
  165. package/src/datahike/codegen/cli.clj +406 -0
  166. package/src/datahike/codegen/clj_kondo.clj +291 -0
  167. package/src/datahike/codegen/java.clj +403 -0
  168. package/src/datahike/codegen/naming.cljc +33 -0
  169. package/src/datahike/codegen/native.clj +559 -0
  170. package/src/datahike/codegen/pod.clj +488 -0
  171. package/src/datahike/codegen/python.clj +838 -0
  172. package/src/datahike/codegen/report.clj +55 -0
  173. package/src/datahike/codegen/typescript.clj +262 -0
  174. package/src/datahike/codegen/validation.clj +145 -0
  175. package/src/datahike/config.cljc +294 -0
  176. package/src/datahike/connections.cljc +16 -0
  177. package/src/datahike/connector.cljc +265 -0
  178. package/src/datahike/constants.cljc +142 -0
  179. package/src/datahike/core.cljc +297 -0
  180. package/src/datahike/datom.cljc +459 -0
  181. package/src/datahike/db/interface.cljc +119 -0
  182. package/src/datahike/db/search.cljc +305 -0
  183. package/src/datahike/db/transaction.cljc +937 -0
  184. package/src/datahike/db/utils.cljc +338 -0
  185. package/src/datahike/db.cljc +956 -0
  186. package/src/datahike/experimental/unstructured.cljc +126 -0
  187. package/src/datahike/experimental/versioning.cljc +172 -0
  188. package/src/datahike/externs.js +31 -0
  189. package/src/datahike/gc.cljc +69 -0
  190. package/src/datahike/http/client.clj +188 -0
  191. package/src/datahike/http/writer.clj +79 -0
  192. package/src/datahike/impl/entity.cljc +218 -0
  193. package/src/datahike/index/interface.cljc +93 -0
  194. package/src/datahike/index/persistent_set.cljc +469 -0
  195. package/src/datahike/index/utils.cljc +44 -0
  196. package/src/datahike/index.cljc +32 -0
  197. package/src/datahike/js/api.cljs +172 -0
  198. package/src/datahike/js/api_macros.clj +22 -0
  199. package/src/datahike/js.cljs +163 -0
  200. package/src/datahike/json.cljc +209 -0
  201. package/src/datahike/lru.cljc +146 -0
  202. package/src/datahike/migrate.clj +39 -0
  203. package/src/datahike/norm/norm.clj +245 -0
  204. package/src/datahike/online_gc.cljc +252 -0
  205. package/src/datahike/pod.clj +155 -0
  206. package/src/datahike/pull_api.cljc +325 -0
  207. package/src/datahike/query.cljc +1945 -0
  208. package/src/datahike/query_stats.cljc +88 -0
  209. package/src/datahike/readers.cljc +62 -0
  210. package/src/datahike/remote.cljc +218 -0
  211. package/src/datahike/schema.cljc +228 -0
  212. package/src/datahike/schema_cache.cljc +42 -0
  213. package/src/datahike/spec.cljc +101 -0
  214. package/src/datahike/store.cljc +80 -0
  215. package/src/datahike/tools.cljc +308 -0
  216. package/src/datahike/transit.cljc +80 -0
  217. package/src/datahike/writer.cljc +239 -0
  218. package/src/datahike/writing.cljc +362 -0
  219. package/src/deps.cljs +1 -0
  220. package/src-hitchhiker-tree/datahike/index/hitchhiker_tree/insert.cljc +76 -0
  221. package/src-hitchhiker-tree/datahike/index/hitchhiker_tree/upsert.cljc +128 -0
  222. package/src-hitchhiker-tree/datahike/index/hitchhiker_tree.cljc +213 -0
  223. package/test/datahike/backward_compatibility_test/src/backward_test.clj +37 -0
  224. package/test/datahike/integration_test/config_record_file_test.clj +14 -0
  225. package/test/datahike/integration_test/config_record_test.clj +14 -0
  226. package/test/datahike/integration_test/depr_config_uri_test.clj +15 -0
  227. package/test/datahike/integration_test/return_map_test.clj +62 -0
  228. package/test/datahike/integration_test.cljc +67 -0
  229. package/test/datahike/norm/norm_test.clj +124 -0
  230. package/test/datahike/norm/resources/naming-and-sorting-test/001-a1-example.edn +5 -0
  231. package/test/datahike/norm/resources/naming-and-sorting-test/002-a2-example.edn +5 -0
  232. package/test/datahike/norm/resources/naming-and-sorting-test/003-tx-fn-test.edn +1 -0
  233. package/test/datahike/norm/resources/naming-and-sorting-test/004-tx-data-and-tx-fn-test.edn +5 -0
  234. package/test/datahike/norm/resources/naming-and-sorting-test/01-transact-basic-characters.edn +2 -0
  235. package/test/datahike/norm/resources/naming-and-sorting-test/02 add occupation.edn +5 -0
  236. package/test/datahike/norm/resources/naming-and-sorting-test/checksums.edn +12 -0
  237. package/test/datahike/norm/resources/simple-test/001-a1-example.edn +5 -0
  238. package/test/datahike/norm/resources/simple-test/002-a2-example.edn +5 -0
  239. package/test/datahike/norm/resources/simple-test/checksums.edn +4 -0
  240. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/001-a1-example.edn +5 -0
  241. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/002-a2-example.edn +5 -0
  242. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/003-tx-fn-test.edn +1 -0
  243. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/checksums.edn +6 -0
  244. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/second/004-tx-data-and-tx-fn-test.edn +5 -0
  245. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/second/checksums.edn +2 -0
  246. package/test/datahike/norm/resources/tx-fn-test/first/001-a1-example.edn +5 -0
  247. package/test/datahike/norm/resources/tx-fn-test/first/002-a2-example.edn +5 -0
  248. package/test/datahike/norm/resources/tx-fn-test/first/checksums.edn +4 -0
  249. package/test/datahike/norm/resources/tx-fn-test/second/003-tx-fn-test.edn +1 -0
  250. package/test/datahike/norm/resources/tx-fn-test/second/checksums.edn +2 -0
  251. package/test/datahike/test/api_test.cljc +895 -0
  252. package/test/datahike/test/array_test.cljc +40 -0
  253. package/test/datahike/test/attribute_refs/datoms_test.cljc +140 -0
  254. package/test/datahike/test/attribute_refs/db_test.cljc +42 -0
  255. package/test/datahike/test/attribute_refs/differences_test.cljc +515 -0
  256. package/test/datahike/test/attribute_refs/entity_test.cljc +89 -0
  257. package/test/datahike/test/attribute_refs/pull_api_test.cljc +320 -0
  258. package/test/datahike/test/attribute_refs/query_find_specs_test.cljc +59 -0
  259. package/test/datahike/test/attribute_refs/query_fns_test.cljc +130 -0
  260. package/test/datahike/test/attribute_refs/query_interop_test.cljc +47 -0
  261. package/test/datahike/test/attribute_refs/query_not_test.cljc +193 -0
  262. package/test/datahike/test/attribute_refs/query_or_test.cljc +137 -0
  263. package/test/datahike/test/attribute_refs/query_pull_test.cljc +156 -0
  264. package/test/datahike/test/attribute_refs/query_rules_test.cljc +176 -0
  265. package/test/datahike/test/attribute_refs/query_test.cljc +241 -0
  266. package/test/datahike/test/attribute_refs/temporal_search.cljc +22 -0
  267. package/test/datahike/test/attribute_refs/transact_test.cljc +220 -0
  268. package/test/datahike/test/attribute_refs/utils.cljc +128 -0
  269. package/test/datahike/test/cache_test.cljc +38 -0
  270. package/test/datahike/test/components_test.cljc +92 -0
  271. package/test/datahike/test/config_test.cljc +158 -0
  272. package/test/datahike/test/core_test.cljc +105 -0
  273. package/test/datahike/test/datom_test.cljc +44 -0
  274. package/test/datahike/test/db_test.cljc +54 -0
  275. package/test/datahike/test/entity_spec_test.cljc +159 -0
  276. package/test/datahike/test/entity_test.cljc +103 -0
  277. package/test/datahike/test/explode_test.cljc +143 -0
  278. package/test/datahike/test/filter_test.cljc +75 -0
  279. package/test/datahike/test/gc_test.cljc +159 -0
  280. package/test/datahike/test/http/server_test.clj +192 -0
  281. package/test/datahike/test/http/writer_test.clj +86 -0
  282. package/test/datahike/test/ident_test.cljc +32 -0
  283. package/test/datahike/test/index_test.cljc +345 -0
  284. package/test/datahike/test/insert.cljc +125 -0
  285. package/test/datahike/test/java_bindings_test.clj +6 -0
  286. package/test/datahike/test/listen_test.cljc +41 -0
  287. package/test/datahike/test/lookup_refs_test.cljc +266 -0
  288. package/test/datahike/test/lru_test.cljc +27 -0
  289. package/test/datahike/test/migrate_test.clj +297 -0
  290. package/test/datahike/test/model/core.cljc +376 -0
  291. package/test/datahike/test/model/invariant.cljc +142 -0
  292. package/test/datahike/test/model/rng.cljc +82 -0
  293. package/test/datahike/test/model_test.clj +217 -0
  294. package/test/datahike/test/nodejs_test.cljs +262 -0
  295. package/test/datahike/test/online_gc_test.cljc +475 -0
  296. package/test/datahike/test/pod_test.clj +369 -0
  297. package/test/datahike/test/pull_api_test.cljc +474 -0
  298. package/test/datahike/test/purge_test.cljc +144 -0
  299. package/test/datahike/test/query_aggregates_test.cljc +101 -0
  300. package/test/datahike/test/query_find_specs_test.cljc +52 -0
  301. package/test/datahike/test/query_fns_test.cljc +523 -0
  302. package/test/datahike/test/query_interop_test.cljc +47 -0
  303. package/test/datahike/test/query_not_test.cljc +189 -0
  304. package/test/datahike/test/query_or_test.cljc +158 -0
  305. package/test/datahike/test/query_pull_test.cljc +147 -0
  306. package/test/datahike/test/query_rules_test.cljc +248 -0
  307. package/test/datahike/test/query_stats_test.cljc +218 -0
  308. package/test/datahike/test/query_test.cljc +984 -0
  309. package/test/datahike/test/schema_test.cljc +424 -0
  310. package/test/datahike/test/specification_test.cljc +30 -0
  311. package/test/datahike/test/store_test.cljc +78 -0
  312. package/test/datahike/test/stress_test.cljc +57 -0
  313. package/test/datahike/test/time_variance_test.cljc +518 -0
  314. package/test/datahike/test/tools_test.clj +134 -0
  315. package/test/datahike/test/transact_test.cljc +518 -0
  316. package/test/datahike/test/tuples_test.cljc +564 -0
  317. package/test/datahike/test/unstructured_test.cljc +291 -0
  318. package/test/datahike/test/upsert_impl_test.cljc +205 -0
  319. package/test/datahike/test/upsert_test.cljc +363 -0
  320. package/test/datahike/test/utils.cljc +110 -0
  321. package/test/datahike/test/validation_test.cljc +48 -0
  322. package/test/datahike/test/versioning_test.cljc +56 -0
  323. package/test/datahike/test.cljc +66 -0
  324. package/tests.edn +24 -0
@@ -0,0 +1,142 @@
1
+ (ns ^:no-doc datahike.constants)
2
+
3
+ (def ^:const e0 0x00000000)
4
+ (def ^:const tx0 0x20000000)
5
+ (def ^:const emax 0x7FFFFFFF)
6
+ (def ^:const txmax 0x7FFFFFFF)
7
+
8
+ (def ^:const system-schema
9
+ [{:db/id tx0
10
+ :db/txInstant #inst"1970-01-01T00:00:00.000-00:00"}
11
+ {:db/id 1
12
+ :db/ident :db/ident
13
+ :db/valueType :db.type/keyword
14
+ :db/cardinality :db.cardinality/one
15
+ :db/doc "An attribute's or specification's identifier"
16
+ :db/unique :db.unique/value}
17
+ {:db/id 2
18
+ :db/ident :db/valueType
19
+ :db/valueType :db.type/valueType
20
+ :db/cardinality :db.cardinality/one
21
+ :db/doc "An attribute's value type"}
22
+ {:db/id 3
23
+ :db/ident :db/cardinality
24
+ :db/valueType :db.type/cardinality
25
+ :db/cardinality :db.cardinality/one
26
+ :db/doc "An attribute's cardinality"}
27
+ {:db/id 4
28
+ :db/ident :db/doc
29
+ :db/valueType :db.type/string
30
+ :db/cardinality :db.cardinality/one
31
+ :db/doc "An attribute's documentation"}
32
+ {:db/id 5
33
+ :db/ident :db/index
34
+ :db/valueType :db.type/boolean
35
+ :db/cardinality :db.cardinality/one
36
+ :db/doc "An attribute's index selection"}
37
+ {:db/id 6
38
+ :db/ident :db/unique
39
+ :db/valueType :db.type/unique
40
+ :db/cardinality :db.cardinality/one
41
+ :db/doc "An attribute's unique selection"}
42
+ {:db/id 7
43
+ :db/ident :db/noHistory
44
+ :db/valueType :db.type/boolean
45
+ :db/cardinality :db.cardinality/one
46
+ :db/doc "An attribute's history selection"}
47
+ {:db/id 8
48
+ :db/ident :db.install/attribute
49
+ :db/valueType :db.type.install/attribute
50
+ :db/cardinality :db.cardinality/one
51
+ :db/doc "Only for interoperability with Datomic"}
52
+ {:db/id 9
53
+ :db/ident :db/txInstant
54
+ :db/valueType :db.type/instant
55
+ :db/cardinality :db.cardinality/one
56
+ :db/doc "A transaction's time-point"
57
+ :db/noHistory true
58
+ :db/index true}
59
+ {:db/id 10
60
+ :db/ident :db.cardinality/many}
61
+ {:db/id 11
62
+ :db/ident :db.cardinality/one}
63
+ {:db/id 12
64
+ :db/ident :db.part/sys}
65
+ {:db/id 13
66
+ :db/ident :db.part/tx}
67
+ {:db/id 14
68
+ :db/ident :db.part/user}
69
+ {:db/id 15
70
+ :db/ident :db.type/bigdec}
71
+ {:db/id 16
72
+ :db/ident :db.type/bigint}
73
+ {:db/id 17
74
+ :db/ident :db.type/boolean}
75
+ {:db/id 18
76
+ :db/ident :db.type/double}
77
+ {:db/id 19
78
+ :db/ident :db.type/cardinality}
79
+ {:db/id 20
80
+ :db/ident :db.type/float}
81
+ {:db/id 21
82
+ :db/ident :db.type/number}
83
+ {:db/id 22
84
+ :db/ident :db.type/instant}
85
+ {:db/id 23
86
+ :db/ident :db.type/keyword}
87
+ {:db/id 24
88
+ :db/ident :db.type/long}
89
+ {:db/id 25
90
+ :db/ident :db.type/ref}
91
+ {:db/id 26
92
+ :db/ident :db.type/string}
93
+ {:db/id 27
94
+ :db/ident :db.type/symbol}
95
+ {:db/id 28
96
+ :db/ident :db.type/unique}
97
+ {:db/id 29
98
+ :db/ident :db.type/uuid}
99
+ {:db/id 30
100
+ :db/ident :db.type/valueType}
101
+ {:db/id 31
102
+ :db/ident :db.type.install/attribute}
103
+ {:db/id 32
104
+ :db/ident :db.unique/identity}
105
+ {:db/id 33
106
+ :db/ident :db.unique/value}
107
+ {:db/id 34
108
+ :db/ident :db/isComponent}
109
+ {:db/id 35
110
+ :db/ident :db/tupleType}
111
+ {:db/id 36
112
+ :db/ident :db/tupleTypes}
113
+ {:db/id 37
114
+ :db/ident :db/tupleAttrs}
115
+ {:db/id 38
116
+ :db/ident :db.type/tuple}])
117
+
118
+ (def ^:const system-entities
119
+ "Holds the entity IDs of system attributes"
120
+ (set (reduce
121
+ (fn [m {:keys [db/ident db/id] :as attr}]
122
+ (when ident (conj m id)))
123
+ []
124
+ system-schema)))
125
+
126
+ (def ^:const non-ref-implicit-schema
127
+ {:db/ident {:db/unique :db.unique/identity}
128
+ :db/txInstant {:db/noHistory true}
129
+ :db.entity/attrs {:db/cardinality :db.cardinality/many}
130
+ :db.entity/preds {:db/cardinality :db.cardinality/many}})
131
+
132
+ (def ^:const ref-implicit-schema
133
+ "Maps attribute names to the attribute's specification"
134
+ (reduce
135
+ (fn [m {:keys [db/ident] :as attr}]
136
+ (when ident
137
+ (assoc m ident (dissoc attr :db/ident))))
138
+ {}
139
+ system-schema))
140
+
141
+ (def ^:const ue0 (transduce (comp (map :db/id) (remove #{tx0})) max 0 system-schema))
142
+ (def ^:const utx0 tx0)
@@ -0,0 +1,297 @@
1
+ (ns ^:no-doc datahike.core
2
+ (:refer-clojure :exclude [filter])
3
+ (:require
4
+ [datahike.constants :as dc]
5
+ [datahike.datom :as dd]
6
+ [datahike.db :as db #?@(:cljs [:refer [FilteredDB]])]
7
+ [datahike.db.interface :as dbi]
8
+ [datahike.db.transaction :as dbt]
9
+ [datahike.db.utils :as dbu]
10
+ [datahike.impl.entity :as de]
11
+ [datahike.pull-api :as dp]
12
+ [datahike.query :as dq])
13
+ #?(:clj
14
+ (:import
15
+ [datahike.db FilteredDB]
16
+ [datahike.impl.entity Entity]
17
+ [java.util UUID]
18
+ (clojure.lang IDeref IBlockingDeref IAtom IPending))))
19
+
20
+ (def ^:const ^:no-doc tx0 dc/tx0)
21
+
22
+ ; Entities
23
+
24
+ (def ^{:arglists '([db eid])}
25
+
26
+ entity de/entity)
27
+
28
+ (def ^{:arglists '([db eid])
29
+ :doc "Given lookup ref `[unique-attr value]`, returns numeric entity id.
30
+
31
+ If entity does not exist, returns `nil`.
32
+
33
+ For numeric `eid` returns `eid` itself (does not check for entity existence in that case)."}
34
+ entid dbu/entid)
35
+
36
+ (defn entity-db
37
+ "Returns a db that entity was created from."
38
+ [^Entity entity]
39
+ {:pre [(de/entity? entity)]}
40
+ (.-db entity))
41
+
42
+ (def ^{:arglists '([e])
43
+ :doc "Forces all entity attributes to be eagerly fetched and cached. Only usable for debug output.
44
+
45
+ Usage:
46
+
47
+ ```
48
+ (entity db 1) ; => {:db/id 1}
49
+ (touch (entity db 1)) ; => {:db/id 1, :dislikes [:pie], :likes [:pizza]}
50
+ ```"}
51
+ touch de/touch)
52
+
53
+ ; Pull
54
+
55
+ (def ^{:arglists '([db selector eid])}
56
+ pull dp/pull)
57
+
58
+ (def ^{:arglists '([db selector eids])}
59
+ pull-many dp/pull-many)
60
+
61
+ ; Query
62
+
63
+ (def ^{:arglists '([query & inputs])}
64
+ q dq/q)
65
+
66
+ ; Creating DB
67
+
68
+ (def ^{:arglists '([] [schema] [schema config])
69
+ :doc "Creates an empty database with an optional schema and configuration.
70
+
71
+ Usage:
72
+ ```
73
+ (empty-db) ; => #datahike/DB {:schema {}, :datoms []}
74
+
75
+ (empty-db {:likes {:db/cardinality :db.cardinality/many}})
76
+ ; => #datahike/DB {:schema {:likes {:db/cardinality :db.cardinality/many}}
77
+ ; :datoms []}
78
+
79
+ (empty-db {} {:keep-history? false :index datahike.index.hitchhiker-tree :schema-flexibility :write})
80
+ ```"}
81
+ empty-db db/empty-db)
82
+
83
+ (def ^{:arglists '([x])
84
+ :doc "Returns `true` if the given value is an immutable database, `false` otherwise."}
85
+ db? dbu/db?)
86
+
87
+ (def ^{:arglists '([e a v] [e a v tx] [e a v tx added])
88
+ :doc "Low-level fn to create raw datoms.
89
+
90
+ Optionally with transaction id (number) and `added` flag (`true` for addition, `false` for retraction).
91
+
92
+ See also [[init-db]]."}
93
+ datom dd/datom)
94
+
95
+ (def ^{:arglists '([x])
96
+ :doc "Returns `true` if the given value is a datom, `false` otherwise."}
97
+ datom? dd/datom?)
98
+
99
+ (def ^{:arglists '([datoms] [datoms schema] [datoms schema config])
100
+ :doc "Low-level fn for creating database quickly from a trusted sequence of datoms.
101
+
102
+ Does no validation on inputs, so `datoms` must be well-formed and match schema.
103
+
104
+ Used internally in db (de)serialization. See also [[datom]]."}
105
+ init-db db/init-db)
106
+
107
+ ; Filtered db
108
+
109
+ (defn is-filtered
110
+ "Returns `true` if this database was filtered using [[filter]], `false` otherwise."
111
+ [x]
112
+ (instance? FilteredDB x))
113
+
114
+ (defn filter
115
+ [db pred]
116
+ {:pre [(dbu/db? db)]}
117
+ (if (is-filtered db)
118
+ (let [^FilteredDB fdb db
119
+ orig-pred (.-pred fdb)
120
+ orig-db (.-unfiltered-db fdb)]
121
+ (FilteredDB. orig-db #(and (orig-pred %) (pred orig-db %))))
122
+ (FilteredDB. db #(pred db %))))
123
+
124
+ ; Changing DB
125
+
126
+ (defn with
127
+ "Same as [[transact!]], but applies to an immutable database value. Returns transaction report (see [[transact!]])."
128
+ ([db tx-data] (with db tx-data nil))
129
+ ([db tx-data tx-meta]
130
+ {:pre [(dbu/db? db)]}
131
+ (if (is-filtered db)
132
+ (throw (ex-info "Filtered DB cannot be modified" {:error :transaction/filtered}))
133
+ (dbt/transact-tx-data (db/map->TxReport
134
+ {:db-before db
135
+ :db-after db
136
+ :tx-data []
137
+ :tempids {}
138
+ :tx-meta tx-meta}) tx-data))))
139
+
140
+ (defn load-entities-with [db entities tx-meta]
141
+ (dbt/transact-entities-directly
142
+ (db/map->TxReport {:db-before db
143
+ :db-after db
144
+ :tx-data []
145
+ :tempids {}
146
+ :tx-meta tx-meta})
147
+ entities))
148
+
149
+ (defn db-with
150
+ "Applies transaction to an immutable db value, returning new immutable db value. Same as `(:db-after (with db tx-data))`."
151
+ [db tx-data]
152
+ {:pre [(dbu/db? db)]}
153
+ (:db-after (with db tx-data)))
154
+
155
+ ; Index lookups
156
+
157
+ (defn datoms
158
+ ([db index] {:pre [(dbu/db? db)]} (dbi/datoms db index []))
159
+ ([db index c1] {:pre [(dbu/db? db)]} (dbi/datoms db index [c1]))
160
+ ([db index c1 c2] {:pre [(dbu/db? db)]} (dbi/datoms db index [c1 c2]))
161
+ ([db index c1 c2 c3] {:pre [(dbu/db? db)]} (dbi/datoms db index [c1 c2 c3]))
162
+ ([db index c1 c2 c3 c4] {:pre [(dbu/db? db)]} (dbi/datoms db index [c1 c2 c3 c4])))
163
+
164
+ (defn seek-datoms
165
+ ([db index] {:pre [(dbu/db? db)]} (dbi/seek-datoms db index []))
166
+ ([db index c1] {:pre [(dbu/db? db)]} (dbi/seek-datoms db index [c1]))
167
+ ([db index c1 c2] {:pre [(dbu/db? db)]} (dbi/seek-datoms db index [c1 c2]))
168
+ ([db index c1 c2 c3] {:pre [(dbu/db? db)]} (dbi/seek-datoms db index [c1 c2 c3]))
169
+ ([db index c1 c2 c3 c4] {:pre [(dbu/db? db)]} (dbi/seek-datoms db index [c1 c2 c3 c4])))
170
+
171
+ (defn rseek-datoms
172
+ "Same as [[seek-datoms]], but goes backwards until the beginning of the index."
173
+ ([db index] {:pre [(dbu/db? db)]} (dbi/rseek-datoms db index []))
174
+ ([db index c1] {:pre [(dbu/db? db)]} (dbi/rseek-datoms db index [c1]))
175
+ ([db index c1 c2] {:pre [(dbu/db? db)]} (dbi/rseek-datoms db index [c1 c2]))
176
+ ([db index c1 c2 c3] {:pre [(dbu/db? db)]} (dbi/rseek-datoms db index [c1 c2 c3]))
177
+ ([db index c1 c2 c3 c4] {:pre [(dbu/db? db)]} (dbi/rseek-datoms db index [c1 c2 c3 c4])))
178
+
179
+ (defn index-range
180
+ [db attr start end]
181
+ {:pre [(dbu/db? db)]}
182
+ (dbi/index-range db attr start end))
183
+
184
+ ;; Conn
185
+
186
+ (defn conn?
187
+ "Returns `true` if this is a connection to a DataScript db, `false` otherwise."
188
+ [conn]
189
+ (and #?(:clj (instance? IDeref conn)
190
+ :cljs (satisfies? cljs.core/IDeref conn))
191
+ (dbu/db? @conn)))
192
+
193
+ (defn- atom? [a]
194
+ #?(:cljs (instance? Atom a)
195
+ :clj (instance? IAtom a)))
196
+
197
+ (defn listen!
198
+ "Listen for changes on the given connection. Whenever a transaction is applied to the database via [[transact!]], the callback is called
199
+ with the transaction report. `key` is any opaque unique value.
200
+
201
+ Idempotent. Calling [[listen!]] with the same twice will override old callback with the new value.
202
+
203
+ Returns the key under which this listener is registered. See also [[unlisten!]]."
204
+ ([conn callback] (listen! conn (rand) callback))
205
+ ([conn key callback]
206
+ {:pre [(conn? conn) (atom? (:listeners (meta conn)))]}
207
+ (swap! (:listeners (meta conn)) assoc key callback)
208
+ key))
209
+
210
+ (defn unlisten!
211
+ "Removes registered listener from connection. See also [[listen!]]."
212
+ [conn key]
213
+ {:pre [(conn? conn)
214
+ (atom? (:listeners (meta conn)))]}
215
+ (swap! (:listeners (meta conn)) dissoc key))
216
+
217
+ ;; Datomic compatibility layer
218
+
219
+ (def ^:private last-tempid (atom -1000000))
220
+
221
+ (defn tempid
222
+ "Allocates and returns a unique temporary id (a negative integer). Ignores `part`. Returns `x` if it is specified.
223
+
224
+ Exists for Datomic API compatibility. Prefer using negative integers directly if possible."
225
+ ([part]
226
+ (if (= part :db.part/tx)
227
+ :db/current-tx
228
+ (swap! last-tempid dec)))
229
+ ([part x]
230
+ (if (= part :db.part/tx)
231
+ :db/current-tx
232
+ x)))
233
+
234
+ (defn resolve-tempid
235
+ "Does a lookup in tempids map, returning an entity id that tempid was resolved to.
236
+
237
+ Exists for Datomic API compatibility. Prefer using map lookup directly if possible."
238
+ [_db tempids tempid]
239
+ (get tempids tempid))
240
+
241
+ (defn db
242
+ "Returns the underlying immutable database value from a connection.
243
+
244
+ Exists for Datomic API compatibility. Prefer using `@conn` directly if possible."
245
+ [conn]
246
+ {:pre [(conn? conn)]}
247
+ @conn)
248
+
249
+ (defn- rand-bits [pow]
250
+ (rand-int (bit-shift-left 1 pow)))
251
+
252
+ #?(:cljs
253
+ (defn- to-hex-string [n l]
254
+ (let [s (.toString n 16)
255
+ c (count s)]
256
+ (cond
257
+ (> c l) (subs s 0 l)
258
+ (< c l) (str (apply str (repeat (- l c) "0")) s)
259
+ :else s))))
260
+
261
+ (defn squuid
262
+ "Generates a UUID that grow with time. Such UUIDs will always go to the end of the index and that will minimize insertions in the middle.
263
+
264
+ Consist of 64 bits of current UNIX timestamp (in seconds) and 64 random bits (2^64 different unique values per second)."
265
+ ([]
266
+ (squuid #?(:clj (System/currentTimeMillis)
267
+ :cljs (.getTime (js/Date.)))))
268
+ ([msec]
269
+ #?(:clj
270
+ (let [uuid (UUID/randomUUID)
271
+ time (int (/ msec 1000))
272
+ high (.getMostSignificantBits uuid)
273
+ low (.getLeastSignificantBits uuid)
274
+ new-high (bit-or (bit-and high 0x00000000FFFFFFFF)
275
+ (bit-shift-left time 32))]
276
+ (UUID. new-high low))
277
+ :cljs
278
+ (uuid
279
+ (str
280
+ (-> (int (/ msec 1000))
281
+ (to-hex-string 8))
282
+ "-" (-> (rand-bits 16) (to-hex-string 4))
283
+ "-" (-> (rand-bits 16) (bit-and 0x0FFF) (bit-or 0x4000) (to-hex-string 4))
284
+ "-" (-> (rand-bits 16) (bit-and 0x3FFF) (bit-or 0x8000) (to-hex-string 4))
285
+ "-" (-> (rand-bits 16) (to-hex-string 4))
286
+ (-> (rand-bits 16) (to-hex-string 4))
287
+ (-> (rand-bits 16) (to-hex-string 4)))))))
288
+
289
+ (defn squuid-time-millis
290
+ "Returns time that was used in [[squuid]] call, in milliseconds, rounded to the closest second."
291
+ [uuid]
292
+ #?(:clj (-> (.getMostSignificantBits ^UUID uuid)
293
+ (bit-shift-right 32)
294
+ (* 1000))
295
+ :cljs (-> (subs (str uuid) 0 8)
296
+ (js/parseInt 16)
297
+ (* 1000))))