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,218 @@
1
+ (ns ^:no-doc datahike.impl.entity
2
+ (:refer-clojure :exclude [keys get])
3
+ (:require [#?(:cljs cljs.core :clj clojure.core)]
4
+ [datahike.db :as db]
5
+ [datahike.db.interface :as dbi]
6
+ [datahike.db.utils :as dbu])
7
+ #?(:clj (:import [datahike.java IEntity])))
8
+
9
+ (declare entity ->Entity equiv-entity lookup-entity touch)
10
+
11
+ (defn- entid [db eid]
12
+ (when (or (number? eid)
13
+ (sequential? eid)
14
+ (keyword? eid))
15
+ (dbu/entid db eid)))
16
+
17
+ (defn entity [db eid]
18
+ {:pre [(dbu/db? db)]}
19
+ (when-let [e (entid db eid)]
20
+ (->Entity db e (volatile! false) (volatile! {}))))
21
+
22
+ (defn- entity-attr [db a-ident datoms]
23
+ (if (dbu/multival? db a-ident)
24
+ (if (dbu/ref? db a-ident)
25
+ (reduce #(conj %1 (entity db (:v %2))) #{} datoms)
26
+ (reduce #(conj %1 (:v %2)) #{} datoms))
27
+ (if (dbu/ref? db a-ident)
28
+ (entity db (:v (first datoms)))
29
+ (:v (first datoms)))))
30
+
31
+ (defn- -lookup-backwards
32
+ "Translate reverse attribute recording to database and find datoms"
33
+ [db eid a-ident not-found]
34
+ (let [a-db (if (:attribute-refs? (dbi/-config db)) (dbi/-ref-for db a-ident) a-ident)]
35
+ (if-let [datoms (not-empty (dbi/search db [nil a-db eid]))]
36
+ (if (dbu/component? db a-ident)
37
+ (entity db (:e (first datoms)))
38
+ (reduce #(conj %1 (entity db (:e %2))) #{} datoms))
39
+ not-found)))
40
+
41
+ #?(:cljs
42
+ (defn- multival->js [val]
43
+ (when val (to-array val))))
44
+
45
+ #?(:cljs
46
+ (defn- js-seq [e]
47
+ (touch e)
48
+ (for [[a v] @(.-cache e)]
49
+ (if (dbu/multival? (.-db e) a)
50
+ [a (multival->js v)]
51
+ [a v]))))
52
+
53
+ (deftype Entity [db eid touched cache]
54
+ #?@(:cljs
55
+ [Object
56
+ (toString [this]
57
+ (pr-str* this))
58
+ (equiv [this other]
59
+ (equiv-entity this other))
60
+
61
+ ;; js/map interface
62
+ (keys [this]
63
+ (es6-iterator (cljs.core/keys this)))
64
+ (entries [this]
65
+ (es6-entries-iterator (js-seq this)))
66
+ (values [this]
67
+ (es6-iterator (map second (js-seq this))))
68
+ (has [this a-ident]
69
+ (not (nil? (.get this a-ident))))
70
+ (get [this a-ident]
71
+ (if (= a-ident ":db/id")
72
+ eid
73
+ (if (dbu/reverse-ref? a-ident)
74
+ (-> (-lookup-backwards db eid (dbu/reverse-ref a-ident) nil)
75
+ multival->js)
76
+ (cond-> (lookup-entity this a-ident)
77
+ (dbu/multival? db a-ident) multival->js))))
78
+ (forEach [this f]
79
+ (doseq [[a v] (js-seq this)]
80
+ (f v a this)))
81
+ (forEach [this f use-as-this]
82
+ (doseq [[a v] (js-seq this)]
83
+ (.call f use-as-this v a this)))
84
+
85
+ ;; js fallbacks
86
+ (key_set [this] (to-array (cljs.core/keys this)))
87
+ (entry_set [this] (to-array (map to-array (js-seq this))))
88
+ (value_set [this] (to-array (map second (js-seq this))))
89
+
90
+ IEquiv
91
+ (-equiv [this o] (equiv-entity this o))
92
+
93
+ IHash
94
+ (-hash [_]
95
+ (hash eid)) ;; db?
96
+
97
+ ISeqable
98
+ (-seq [this]
99
+ (touch this)
100
+ (seq @cache))
101
+
102
+ ICounted
103
+ (-count [this]
104
+ (touch this)
105
+ (count @cache))
106
+
107
+ ILookup
108
+ (-lookup [this a-ident] (lookup-entity this a-ident nil))
109
+ (-lookup [this a-ident not-found] (lookup-entity this a-ident not-found))
110
+
111
+ IAssociative
112
+ (-contains-key? [this k]
113
+ (not= ::nf (lookup-entity this k ::nf)))
114
+
115
+ IFn
116
+ (-invoke [this k]
117
+ (lookup-entity this k))
118
+ (-invoke [this k not-found]
119
+ (lookup-entity this k not-found))
120
+
121
+ IPrintWithWriter
122
+ (-pr-writer [_ writer opts]
123
+ (-pr-writer (assoc @cache :db/id eid) writer opts))]
124
+
125
+ :clj
126
+ [Object
127
+ IEntity
128
+ (toString [e] (pr-str (assoc @cache :db/id eid)))
129
+ (hashCode [e] (hash eid)) ; db?
130
+ (equals [e o] (equiv-entity e o))
131
+
132
+ clojure.lang.Seqable
133
+ (seq [e] (touch e) (seq @cache))
134
+
135
+ clojure.lang.Associative
136
+ (equiv [e o] (equiv-entity e o))
137
+ (containsKey [e k] (not= ::nf (lookup-entity e k ::nf)))
138
+ (entryAt [e k] (some->> (lookup-entity e k) (clojure.lang.MapEntry. k)))
139
+
140
+ (empty [e] {})
141
+ (assoc [e k v] (throw (UnsupportedOperationException.)))
142
+ (cons [e [k v]] (throw (UnsupportedOperationException.)))
143
+ (count [e] (touch e) (count @(.-cache e)))
144
+
145
+ clojure.lang.ILookup
146
+ (valAt [e k] (lookup-entity e k))
147
+ (valAt [e k not-found] (lookup-entity e k not-found))
148
+
149
+ clojure.lang.IFn
150
+ (invoke [e k] (lookup-entity e k))
151
+ (invoke [e k not-found] (lookup-entity e k not-found))]))
152
+
153
+ (defn entity? [x] (instance? Entity x))
154
+
155
+ #?(:clj
156
+ (defmethod print-method Entity [e, ^java.io.Writer w]
157
+ (.write w (str e))))
158
+
159
+ (defn- equiv-entity [^Entity this that]
160
+ (and
161
+ (instance? Entity that)
162
+ (= (.-db ^Entity this) (.-db ^Entity that))
163
+ (= (.-eid this) (.-eid ^Entity that))))
164
+
165
+ (defn- lookup-entity
166
+ ([this a-ident] (lookup-entity this a-ident nil))
167
+ ([^Entity this a-ident not-found]
168
+ (if (= a-ident :db/id)
169
+ (.-eid this)
170
+ (if (dbu/reverse-ref? a-ident)
171
+ (-lookup-backwards (.-db this) (.-eid this) (dbu/reverse-ref a-ident) not-found)
172
+ (if-some [v (@(.-cache this) a-ident)]
173
+ v
174
+ (if @(.-touched this)
175
+ not-found
176
+ (if-let [a-db (if (:attribute-refs? (dbi/-config (.-db this)))
177
+ (dbi/-ref-for (.-db this) a-ident)
178
+ a-ident)]
179
+ (if-some [datoms (not-empty (dbi/search (.-db this) [(.-eid this) a-db]))]
180
+ (let [value (entity-attr (.-db this) a-ident datoms)]
181
+ (vreset! (.-cache this) (assoc @(.-cache this) a-ident value))
182
+ value)
183
+ not-found)
184
+ not-found)))))))
185
+
186
+ (defn touch-components [db a->v]
187
+ (reduce-kv (fn [acc a-ident v]
188
+ (assoc acc a-ident
189
+ (if (dbu/component? db a-ident)
190
+ (if (dbu/multival? db a-ident)
191
+ (set (map touch v))
192
+ (touch v))
193
+ v)))
194
+ {} a->v))
195
+
196
+ (defn- datoms->cache [db datoms]
197
+ (reduce (fn [acc partition]
198
+ (let [a-db (:a (first partition))
199
+ a-ident (if (:attribute-refs? (dbi/-config db))
200
+ (dbi/-ident-for db a-db)
201
+ a-db)]
202
+ (assoc acc a-ident (entity-attr db a-ident partition))))
203
+ {} (partition-by :a datoms)))
204
+
205
+ (defn touch [^Entity e]
206
+ {:pre [(entity? e)]}
207
+ (when-not @(.-touched e)
208
+ (when-let [datoms (not-empty (dbi/search (.-db e) [(.-eid e)]))]
209
+ (vreset! (.-cache e) (->> datoms
210
+ (datoms->cache (.-db e))
211
+ (touch-components (.-db e))))
212
+ (vreset! (.-touched e) true)))
213
+ e)
214
+
215
+ #?(:cljs (goog/exportSymbol "datahike.impl.entity.Entity" Entity))
216
+
217
+ (defn entity-db [^Entity entity]
218
+ (.-db entity))
@@ -0,0 +1,93 @@
1
+ (ns datahike.index.interface
2
+ "All the functions in this namespace must be implemented for each index type"
3
+ #?(:cljs (:refer-clojure :exclude [-seq -count -persistent! -flush])))
4
+
5
+ (defprotocol IIndex
6
+ (-all [index] "Returns a sequence of all datoms in the index")
7
+ (-seq [index] "Returns a sequence of all datoms in the index")
8
+ (-count [index] "Returns the number of datoms in the index")
9
+ (-insert [index datom index-type op-count] "Inserts a datom into the index")
10
+ (-temporal-insert [index datom index-type op-count] "Inserts a datom in a history index")
11
+ (-upsert [index datom index-type op-count old-datom] "Inserts or updates a datom into the index")
12
+ (-temporal-upsert [index datom index-type op-count old-datom] "Inserts or updates a datom in a history index")
13
+ (-remove [index datom index-type op-count] "Removes a datom from the index")
14
+ (-slice [index from to index-type] "Returns a slice of the index")
15
+ (-flush [index backend] "Saves the changes to the index to the given konserve backend")
16
+ (-transient [index] "Returns a transient version of the index")
17
+ (-persistent! [index] "Returns a persistent version of the index")
18
+ (-mark [index] "Return konserve addresses that should be whitelisted for mark and sweep gc."))
19
+
20
+ (defmulti empty-index
21
+ "Creates an empty index"
22
+ (fn [index-name _store _index-type _index-config]
23
+ index-name))
24
+
25
+ (defmulti init-index
26
+ "Creates an index with datoms"
27
+ (fn [index-name _store _datoms _index-type _op-count _index-config]
28
+ index-name))
29
+
30
+ (defmulti add-konserve-handlers
31
+ "Adds read and write handlers for the index data types."
32
+ (fn [config _store] (:index config)))
33
+
34
+ (defmulti konserve-backend
35
+ "Returns a konserve store capable of handling the index. Used for flushing."
36
+ (fn [index-name _store] index-name))
37
+
38
+ (defmulti default-index-config
39
+ "Returns the default index configuration."
40
+ (fn [index-name] index-name))
41
+
42
+ ;; Default handlers for missing index implementations
43
+
44
+ (defn- hitchhiker-tree-missing-error []
45
+ (ex-info
46
+ "Hitchhiker-tree index requires explicit setup:
47
+ 1. Add io.replikativ/hitchhiker-tree to your deps.edn
48
+ 2. Require datahike.index.hitchhiker-tree in your namespace
49
+ Or use the default :datahike.index/persistent-set index."
50
+ {:type :missing-index-implementation
51
+ :index :datahike.index/hitchhiker-tree
52
+ :available-indexes (disj (set (keys (methods empty-index))) :default)}))
53
+
54
+ (defmethod empty-index :default [index-name _ _ _]
55
+ (if (= index-name :datahike.index/hitchhiker-tree)
56
+ (throw (hitchhiker-tree-missing-error))
57
+ (throw (ex-info (str "Unknown index type: " index-name)
58
+ {:type :unknown-index-type
59
+ :index index-name
60
+ :available-indexes (disj (set (keys (methods empty-index))) :default)}))))
61
+
62
+ (defmethod init-index :default [index-name _ _ _ _ _]
63
+ (if (= index-name :datahike.index/hitchhiker-tree)
64
+ (throw (hitchhiker-tree-missing-error))
65
+ (throw (ex-info (str "Unknown index type: " index-name)
66
+ {:type :unknown-index-type
67
+ :index index-name
68
+ :available-indexes (disj (set (keys (methods init-index))) :default)}))))
69
+
70
+ (defmethod add-konserve-handlers :default [config _]
71
+ (let [index-name (:index config)]
72
+ (if (= index-name :datahike.index/hitchhiker-tree)
73
+ (throw (hitchhiker-tree-missing-error))
74
+ (throw (ex-info (str "Unknown index type: " index-name)
75
+ {:type :unknown-index-type
76
+ :index index-name
77
+ :available-indexes (disj (set (keys (methods add-konserve-handlers))) :default)})))))
78
+
79
+ (defmethod konserve-backend :default [index-name _]
80
+ (if (= index-name :datahike.index/hitchhiker-tree)
81
+ (throw (hitchhiker-tree-missing-error))
82
+ (throw (ex-info (str "Unknown index type: " index-name)
83
+ {:type :unknown-index-type
84
+ :index index-name
85
+ :available-indexes (disj (set (keys (methods konserve-backend))) :default)}))))
86
+
87
+ (defmethod default-index-config :default [index-name]
88
+ (if (= index-name :datahike.index/hitchhiker-tree)
89
+ (throw (hitchhiker-tree-missing-error))
90
+ (throw (ex-info (str "Unknown index type: " index-name)
91
+ {:type :unknown-index-type
92
+ :index index-name
93
+ :available-indexes (disj (set (keys (methods default-index-config))) :default)}))))