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,424 @@
1
+ (ns datahike.test.schema-test
2
+ (:require
3
+ #?(:cljs [cljs.test :as t :refer-macros [is deftest testing]]
4
+ :clj [clojure.test :as t :refer [is deftest testing]])
5
+ [datahike.api :as d]
6
+ [datahike.db.interface :as dbi]
7
+ [datahike.db.transaction :as dbt]
8
+ [datahike.datom :as da]
9
+ [datahike.constants :as const])
10
+ (:import [java.lang System]
11
+ [java.util UUID]))
12
+
13
+ #?(:cljs (def Throwable js/Error))
14
+
15
+ #?(:clj
16
+ (defn random-uuid []
17
+ (UUID/randomUUID)))
18
+
19
+ (def name-schema {:db/ident :name
20
+ :db/valueType :db.type/string
21
+ :db/cardinality :db.cardinality/one})
22
+
23
+ (def personal-id-schema {:db/ident :id
24
+ :db/valueType :db.type/long
25
+ :db/unique :db.unique/identity
26
+ :db/cardinality :db.cardinality/many})
27
+
28
+ (def find-name-q '[:find ?n
29
+ :where [_ :name ?n]])
30
+
31
+ (def find-schema-q '[:find ?n ?vt ?c
32
+ :where
33
+ [?e :db/ident ?n]
34
+ [?e :db/valueType ?vt]
35
+ [?e :db/cardinality ?c]])
36
+
37
+ (deftest test-empty-db
38
+ (let [cfg {:store {:backend :memory
39
+ :id #uuid "5c100000-0000-0000-0000-000000000001"}}
40
+ _ (d/delete-database cfg)
41
+ _ (d/create-database cfg)
42
+ conn (d/connect cfg)
43
+ db (d/db conn)
44
+ tx [{:name "Alice"}]]
45
+
46
+ (is (= const/non-ref-implicit-schema (dbi/-schema db)))
47
+
48
+ (testing "transact without schema present"
49
+ (is (thrown-with-msg? Throwable
50
+ #"Bad entity attribute :name at \{:db/id 1, :name \"Alice\"\}, not defined in current schema"
51
+ (d/transact conn tx))))
52
+
53
+ (testing "transacting new schema"
54
+ (d/transact conn [name-schema])
55
+ (is (= #{[:name :db.type/string :db.cardinality/one]}
56
+ (d/q find-schema-q (d/db conn))))
57
+ (is (= (merge const/non-ref-implicit-schema
58
+ {:name #:db{:ident :name
59
+ :valueType :db.type/string
60
+ :cardinality :db.cardinality/one}
61
+ 1 :name})
62
+ (dbi/-schema (d/db conn)))))
63
+
64
+ (testing "transacting data with schema present"
65
+ (d/transact conn tx)
66
+ (is (= #{["Alice"]}
67
+ (d/q find-name-q (d/db conn)))))
68
+
69
+ (testing "insert new data with wrong data type"
70
+ (is (thrown-with-msg? Throwable
71
+ #"Bad entity value 42 at \[:db/add 3 :name 42\], value does not match schema definition. Must be conform to: string\?"
72
+ (d/transact conn [{:name 42}]))))
73
+
74
+ (testing "insert new data with additional attributes not in schema"
75
+ (is (thrown-with-msg? Throwable
76
+ #"Bad entity attribute :age at \{:db/id 3, :age 42\}, not defined in current schema"
77
+ (d/transact conn [{:name "Bob" :age 42}]))))
78
+
79
+ (testing "insert incomplete schema :db/valueType"
80
+ (is (thrown-with-msg? Throwable
81
+ #"Incomplete schema transaction attributes, expected :db/ident, :db/valueType, :db/cardinality"
82
+ (d/transact conn [{:db/valueType :db.type/string}]))))
83
+
84
+ (testing "insert incomplete schema :db/cardinality"
85
+ (is (thrown-with-msg? Throwable
86
+ #"Incomplete schema transaction attributes, expected :db/ident, :db/valueType, :db/cardinality"
87
+ (d/transact conn [{:db/cardinality :db.cardinality/many}]))))
88
+
89
+ (testing "insert incomplete schema :db/cardinality, :db/ident"
90
+ (is (thrown-with-msg? Throwable
91
+ #"Incomplete schema transaction attributes, expected :db/ident, :db/valueType, :db/cardinality"
92
+ (d/transact conn [{:db/ident :phone :db/cardinality :db.cardinality/many}]))))
93
+
94
+ (testing "insert schema with incorrect value type"
95
+ (is (thrown-with-msg? Throwable
96
+ (re-pattern (str "Bad entity value " :string " at \\[:db/add 3 :db/valueType :string\\], "
97
+ "value does not match schema definition. "
98
+ "Must be conform to: "
99
+ "#\\{:db.type/number :db.type/unique :db.type/instant :db.type/cardinality "
100
+ ":db.type/tuple :db.type/boolean :db.type/bytes :db.type/uuid :db.type/value "
101
+ ":db.type/string :db.type/keyword :db.type/ref :db.type/bigdec "
102
+ ":db.type.install/attribute :db.type/float :db.type/bigint :db.type/double "
103
+ ":db.type/long :db.type/valueType :db.type/symbol\\}"))
104
+ (d/transact conn [{:db/ident :phone
105
+ :db/cardinality :db.cardinality/one
106
+ :db/valueType :string}]))))
107
+ (d/release conn)))
108
+
109
+ (deftest test-db-with-initial-schema
110
+ (let [cfg {:store {:backend :memory
111
+ :id #uuid "5c100000-0000-0000-0000-000000000002"}
112
+ :initial-tx [name-schema]}
113
+ _ (d/delete-database cfg)
114
+ _ (d/create-database cfg)
115
+ conn (d/connect cfg)]
116
+
117
+ (testing "schema existence"
118
+ (let [db (d/db conn)]
119
+ (is (= (merge const/non-ref-implicit-schema
120
+ {:name #:db{:ident :name
121
+ :valueType :db.type/string
122
+ :cardinality :db.cardinality/one}
123
+ 1 :name})
124
+ (dbi/-schema db)))
125
+ (is (= #{[:name :db.type/string :db.cardinality/one]} (d/q find-schema-q db)))))
126
+
127
+ (testing "insert new data according to schema"
128
+ (d/transact conn [{:name "Alice"}])
129
+ (is (= #{["Alice"]} (d/q find-name-q (d/db conn)))))
130
+
131
+ (testing "extend schema with :age"
132
+ (d/transact conn [{:db/ident :age
133
+ :db/valueType :db.type/long
134
+ :db/cardinality :db.cardinality/one}])
135
+ (let [db (d/db conn)]
136
+ (is (= (merge const/non-ref-implicit-schema
137
+ {:name #:db{:ident :name
138
+ :valueType :db.type/string
139
+ :cardinality :db.cardinality/one}
140
+ 1 :name
141
+ :age #:db{:ident :age
142
+ :valueType :db.type/long
143
+ :cardinality :db.cardinality/one}
144
+ 3 :age})
145
+ (dbi/-schema db)))
146
+ (is (= #{[:name :db.type/string :db.cardinality/one] [:age :db.type/long :db.cardinality/one]}
147
+ (d/q find-schema-q db)))))
148
+
149
+ (testing "insert new data"
150
+ (d/transact conn [{:name "Bob" :age 42}])
151
+ (is (= #{["Alice"] ["Bob"]} (d/q find-name-q (d/db conn)))))
152
+
153
+ (testing "change cardinality for :name"
154
+ (d/transact conn [{:db/ident :name
155
+ :db/cardinality :db.cardinality/many}])
156
+ (let [db (d/db conn)]
157
+ (is (= (merge const/non-ref-implicit-schema
158
+ {:name #:db{:ident :name
159
+ :valueType :db.type/string
160
+ :cardinality :db.cardinality/many}
161
+ 1 :name
162
+ :age #:db{:ident :age
163
+ :valueType :db.type/long
164
+ :cardinality :db.cardinality/one}
165
+ 3 :age})
166
+ (dbi/-schema db)))
167
+ (is (= #{[:name :db.type/string :db.cardinality/many] [:age :db.type/long :db.cardinality/one]}
168
+ (d/q find-schema-q db)))))
169
+ (d/release conn)))
170
+
171
+ (defn testing-type [conn type-name tx-val tx-id wrong-val]
172
+ (testing type-name
173
+ (let [schema-name (keyword "value" type-name)]
174
+ (d/transact conn [{schema-name tx-val}])
175
+ (is (= #{[tx-val]}
176
+ (d/q '[:find ?v :in $ ?sn :where [?e ?sn ?v]] (d/db conn) schema-name)))
177
+ (is (thrown-with-msg? Throwable
178
+ (re-pattern (str "Bad entity value "
179
+ wrong-val
180
+ " at \\[:db/add "
181
+ tx-id
182
+ " "
183
+ schema-name
184
+ " "
185
+ wrong-val
186
+ "\\], value does not match schema definition"))
187
+ (d/transact conn [{schema-name wrong-val}]))))))
188
+
189
+ (deftest test-schema-types
190
+ (let [schema-tx [{:db/ident :value/bigdec
191
+ :db/valueType :db.type/bigdec
192
+ :db/cardinality :db.cardinality/one}
193
+ {:db/ident :value/bigint
194
+ :db/valueType :db.type/bigint
195
+ :db/cardinality :db.cardinality/one}
196
+ {:db/ident :value/boolean
197
+ :db/valueType :db.type/boolean
198
+ :db/cardinality :db.cardinality/one}
199
+ {:db/ident :value/double
200
+ :db/valueType :db.type/double
201
+ :db/cardinality :db.cardinality/one}
202
+ {:db/ident :value/float
203
+ :db/valueType :db.type/float
204
+ :db/cardinality :db.cardinality/one}
205
+ {:db/ident :value/instant
206
+ :db/valueType :db.type/instant
207
+ :db/cardinality :db.cardinality/one}
208
+ {:db/ident :value/keyword
209
+ :db/valueType :db.type/keyword
210
+ :db/cardinality :db.cardinality/one}
211
+ {:db/ident :value/long
212
+ :db/valueType :db.type/long
213
+ :db/cardinality :db.cardinality/one}
214
+ {:db/ident :value/string
215
+ :db/valueType :db.type/string
216
+ :db/cardinality :db.cardinality/one}
217
+ {:db/ident :value/symbol
218
+ :db/valueType :db.type/symbol
219
+ :db/cardinality :db.cardinality/one}
220
+ {:db/ident :value/uuid
221
+ :db/valueType :db.type/uuid
222
+ :db/cardinality :db.cardinality/one}]
223
+ cfg {:store {:backend :memory
224
+ :id #uuid "5c100000-0000-0000-0000-000000000003"}
225
+ :initial-tx schema-tx}
226
+ _ (d/delete-database cfg)
227
+ _ (d/create-database cfg)
228
+ conn (d/connect cfg)]
229
+
230
+ (testing-type conn "bigdec" (bigdec 1) 13 1)
231
+ (testing-type conn "bigint" (biginteger 1) 14 1.0)
232
+ (testing-type conn "boolean" true 15 0)
233
+ (testing-type conn "double" (double 1) 16 1)
234
+ (testing-type conn "float" (float 1) 17 1)
235
+ (testing-type conn "instant" (java.util.Date.) 18 1)
236
+ (testing-type conn "keyword" :one 19 1)
237
+ (testing-type conn "long" (long 2) 20 :2)
238
+ (testing-type conn "string" "one" 21 :one)
239
+ (testing-type conn "symbol" 'one 22 :one)
240
+ (testing-type conn "uuid" (random-uuid) 23 1)
241
+ (d/release conn)))
242
+
243
+ (deftest test-schema-cardinality
244
+ (let [schema-tx [{:db/ident :owner
245
+ :db/valueType :db.type/string
246
+ :db/index true
247
+ :db/unique :db.unique/identity
248
+ :db/cardinality :db.cardinality/one}
249
+ {:db/ident :cars
250
+ :db/valueType :db.type/keyword
251
+ :db/cardinality :db.cardinality/many}]
252
+ cfg {:store {:backend :memory
253
+ :id #uuid "5c100000-0000-0000-0000-000000000004"}
254
+ :initial-tx schema-tx}
255
+ _ (d/delete-database cfg)
256
+ _ (d/create-database cfg)
257
+ conn (d/connect cfg)]
258
+
259
+ (testing "insert :owner and :cars one by one"
260
+ (d/transact conn [{:db/id -1
261
+ :owner "Alice"}
262
+ {:db/id -1
263
+ :cars :audi}
264
+ {:db/id -1
265
+ :cars :bmw}])
266
+ (is (= #{["Alice" :audi] ["Alice" :bmw]}
267
+ (d/q '[:find ?o ?c :where [?e :owner ?o] [?e :cars ?c]] (d/db conn)))))
268
+
269
+ (testing "insert :cars as list"
270
+ (d/transact conn [{:db/id -2
271
+ :owner "Bob"
272
+ :cars [:chrysler :daimler]}])
273
+ (is (= #{["Alice" :audi] ["Alice" :bmw] ["Bob" :chrysler] ["Bob" :daimler]}
274
+ (d/q '[:find ?o ?c :where [?e :owner ?o] [?e :cars ?c]] (d/db conn)))))
275
+
276
+ (testing "insert to cardinality one"
277
+ (d/transact conn [{:db/id [:owner "Alice"]
278
+ :owner "Charlie"}])
279
+ (is (= #{["Charlie" :audi] ["Charlie" :bmw] ["Bob" :chrysler] ["Bob" :daimler]}
280
+ (d/q '[:find ?o ?c :where [?e :owner ?o] [?e :cars ?c]] (d/db conn)))))
281
+
282
+ (testing "test cardinality change if unique is set"
283
+ (is (thrown-with-msg? Throwable
284
+ #"Update not supported for these schema attributes"
285
+ (d/transact conn [{:db/ident :owner
286
+ :db/cardinality :db.cardinality/many}])))
287
+ (is (thrown-with-msg? Throwable
288
+ #"Update not supported for these schema attributes"
289
+ (d/transact conn [{:db/id [:db/ident :owner]
290
+ :db/cardinality :db.cardinality/many}]))))
291
+ (d/release conn)))
292
+
293
+ (deftest test-schema-persistence
294
+ (testing "test file persistence"
295
+ (let [os (System/getProperty "os.name")
296
+ path (case os
297
+ "Windows 10" (str (System/getProperty "java.io.tmpdir") "dh-test-persistence")
298
+ "/tmp/dh-test-persistence")
299
+ cfg {:store {:backend :file
300
+ :path path
301
+ :id #uuid "5c6e0000-0000-0000-0000-000000000001"}
302
+ :initial-tx [name-schema]}
303
+ _ (d/delete-database cfg)
304
+ _ (d/create-database cfg)
305
+ conn (d/connect cfg)]
306
+ (testing "schema exists on creation and first connection"
307
+ (is (= #{[:name :db.type/string :db.cardinality/one]} (d/q find-schema-q (d/db conn)))))
308
+ (testing "reconnect with db"
309
+ (let [new-conn (d/connect cfg)]
310
+ (is (= #{[:name :db.type/string :db.cardinality/one]} (d/q find-schema-q (d/db new-conn))))
311
+ (d/release new-conn)))
312
+ (d/release conn)
313
+ (d/delete-database cfg)))
314
+ (testing "test mem persistence"
315
+ (let [cfg {:store {:backend :memory
316
+ :id #uuid "5c100000-0000-0000-0000-000000000005"}
317
+ :initial-tx [name-schema]}
318
+ _ (d/create-database cfg)
319
+ conn (d/connect cfg)]
320
+ (testing "schema exists on creation and first connection"
321
+ (is (= #{[:name :db.type/string :db.cardinality/one]} (d/q find-schema-q (d/db conn)))))
322
+ (testing "reconnect with db"
323
+ (let [new-conn (d/connect cfg)]
324
+ (is (= #{[:name :db.type/string :db.cardinality/one]} (d/q find-schema-q (d/db new-conn))))))
325
+ (d/release conn)
326
+ (d/delete-database cfg))))
327
+
328
+ (deftest test-schema-on-read-db
329
+ (testing "test database creation with schema-on-read"
330
+ (let [cfg {:store {:backend :memory
331
+ :id #uuid "d0000000-0000-0000-0000-00000000000d"}
332
+ :schema-flexibility :read}
333
+ _ (d/delete-database cfg)
334
+ _ (d/create-database cfg)
335
+ conn (d/connect cfg)]
336
+ (testing "insert any data"
337
+ (d/transact conn [{:name "Alice" :age 26} {:age "12" :car :bmw}])
338
+ (is (= #{[1 "Alice" 26]}
339
+ (d/q '[:find ?e ?n ?a :where [?e :name ?n] [?e :age ?a]] (d/db conn))))
340
+ (is (= #{[2 "12" :bmw]}
341
+ (d/q '[:find ?e ?a ?c :where [?e :age ?a] [?e :car ?c]] (d/db conn)))))
342
+ (d/release conn))))
343
+
344
+ (deftest test-ident
345
+ (testing "use db/ident as enum"
346
+ (let [schema [{:db/ident :important}
347
+ {:db/ident :archive}
348
+ {:db/ident :message
349
+ :db/valueType :db.type/string
350
+ :db/cardinality :db.cardinality/one}
351
+ {:db/ident :tag
352
+ :db/valueType :db.type/ref
353
+ :db/cardinality :db.cardinality/many}]
354
+ cfg {:store {:backend :memory
355
+ :id #uuid "5c100000-0000-0000-0000-000000000006"}
356
+ :initial-tx schema}
357
+ _ (d/delete-database cfg)
358
+ _ (d/create-database cfg)
359
+ conn (d/connect cfg)]
360
+ (testing "insert data with enums"
361
+ (d/transact conn [{:message "important" :tag :important} {:message "archive" :tag [:important :archive]}])
362
+ (is (= #{["important" :important] ["archive" :important] ["archive" :archive]}
363
+ (d/q '[:find ?m ?t :where [?e :message ?m] [?e :tag ?te] [?te :db/ident ?t]] (d/db conn))))
364
+ (d/release conn)))))
365
+
366
+ (deftest test-remove-schema
367
+ (let [cfg {:store {:backend :memory
368
+ :id #uuid "5c100000-0000-0000-0000-000000000007"}}
369
+ _ (d/delete-database cfg)
370
+ _ (d/create-database cfg)
371
+ conn (d/connect cfg)
372
+ db (d/db conn)]
373
+ (testing "non existing schema should throw exception"
374
+ (is (thrown-with-msg? Throwable
375
+ #"Schema with attribute :name does not exist"
376
+ (dbt/remove-schema db (da/datom 1 :db/ident :name)))))
377
+ (testing "when upserting a non existing schema, it should not throw an exception"
378
+ (is (d/transact conn [name-schema])))
379
+ (d/release conn)))
380
+
381
+ (deftest test-update-schema
382
+ (let [cfg {:store {:backend :memory
383
+ :id #uuid "5c100000-0000-0000-0000-000000000008"}
384
+ :initial-tx [name-schema personal-id-schema]}
385
+ _ (d/delete-database cfg)
386
+ _ (d/create-database cfg)
387
+ conn (d/connect cfg)
388
+ update-name-attr (fn [attr new-value] (d/transact conn {:tx-data [(assoc name-schema attr new-value)]}))]
389
+ (testing "Allow to update doc"
390
+ (is (update-name-attr :db/doc "Some doc") "It should be allowed to add :db/doc.")
391
+ (is (update-name-attr :db/doc "Some new doc") "It should be allowed to update :db/doc.")
392
+ (is (d/transact conn {:tx-data [[:db/retract :name :db/doc]]}) "It should be allowed to retract :db/doc."))
393
+
394
+ (testing "Allow to toggle noHistory"
395
+ (is (update-name-attr :db/noHistory true) "It should be allowed to enable :db/noHistory.")
396
+ (is (update-name-attr :db/noHistory false) "It should be allowed to disable :db/noHistory."))
397
+
398
+ (testing "Allow to toggle isComponent"
399
+ (is (update-name-attr :db/isComponent true) "It should be allowed to enable :db/isComponent.")
400
+ (is (update-name-attr :db/isComponent false) "It should be allowed to disable :db/isComponent."))
401
+
402
+ (testing "Allow to update :db/unique only if it already exists"
403
+ (is (thrown-with-msg? Throwable
404
+ #"Update not supported for these schema attributes"
405
+ (d/transact conn {:tx-data [(assoc name-schema :db/unique :db.unique/value)]}))
406
+ "It shouldn't be allowed to update :db/unique if it doesn't exist already.")
407
+ (is (d/transact conn {:tx-data [(assoc personal-id-schema :db/unique :db.unique/value)]})
408
+ "It should be allowed to update :db/unique if it exists already."))
409
+
410
+ (testing "Allow to update :db/cardinality "
411
+ (testing "if :db/unique is not set"
412
+ (is (update-name-attr :db/cardinality :db.cardinality/many)
413
+ "It should be allowed to update :db/cardinality to :db.cardinality/many.")
414
+ (is (update-name-attr :db/cardinality :db.cardinality/one)
415
+ "It should be allowed to update :db/cardinality to :db.cardinality/one."))
416
+
417
+ (testing "if :db/unique is set"
418
+ (is (d/transact conn {:tx-data [(assoc personal-id-schema :db/cardinality :db.cardinality/one)]})
419
+ "It should be allowed to update :db/cardinality to :db.cardinality/one.")
420
+ (is (thrown-with-msg? Throwable
421
+ #"Update not supported for these schema attributes"
422
+ (d/transact conn {:tx-data [(assoc personal-id-schema :db/cardinality :db.cardinality/many)]}))
423
+ "It shouldn't be allowed to update :db/cardinality to :db.cardinality/many")))
424
+ (d/release conn)))
@@ -0,0 +1,30 @@
1
+ (ns datahike.test.specification-test
2
+ (:require
3
+ #?(:cljs [cljs.test :as t :refer-macros [is are deftest testing]]
4
+ :clj [clojure.test :as t :refer [is are deftest testing]])
5
+ [datahike.api.specification :refer [malli-schema->argslist]]
6
+ [datahike.api.types :as types]))
7
+
8
+ (deftest malli-to-argslist-translation
9
+ (testing "Testing core cases of malli to argslist translator."
10
+ ;; Multi-arity: [:function [:=> [:cat Type1] ret] [:=> [:cat] ret]]
11
+ (is (= (malli-schema->argslist '[:function
12
+ [:=> [:cat :datahike/SConfig] :any]
13
+ [:=> [:cat] :any]])
14
+ '([arg0] [])))
15
+
16
+ ;; Single arity: [:=> [:cat Type1 Type2] ret]
17
+ (is (= (malli-schema->argslist '[:=> [:cat :datahike/SConnection :datahike/STransactions] :any])
18
+ '([arg0 arg1])))
19
+
20
+ ;; Multi-arity with rest args: [:function [:=> [:cat Type] ret] [:=> [:cat [:or ...] [:* :any]] ret]]
21
+ (is (= (malli-schema->argslist '[:function
22
+ [:=> [:cat :datahike/SQueryArgs] :any]
23
+ [:=> [:cat [:or :vector :map] [:* :any]] :any]])
24
+ '([arg0] [arg0 arg1])))
25
+
26
+ ;; Multi-arity simple: [:function [:=> [:cat Type1 Type2] ret] [:=> [:cat Type1 Type3 Type4] ret]]
27
+ (is (= (malli-schema->argslist '[:function
28
+ [:=> [:cat :datahike/SDB :datahike/SPullOptions] :any]
29
+ [:=> [:cat :datahike/SDB :any :datahike/SEId] :any]])
30
+ '([arg0 arg1] [arg0 arg1 arg2])))))
@@ -0,0 +1,78 @@
1
+ (ns datahike.test.store-test
2
+ (:require
3
+ #?(:cljs [cljs.test :as t :refer-macros [is deftest testing]]
4
+ :clj [clojure.test :as t :refer [is deftest testing]])
5
+ [datahike.api :as d])
6
+ (:import [java.lang System]))
7
+
8
+ (defn test-store [cfg]
9
+ (let [_ (d/delete-database cfg)]
10
+ (is (not (d/database-exists? cfg)))
11
+ (let [cfg (merge cfg {:schema-flexibility :read})
12
+ _ (d/create-database cfg)
13
+ conn (d/connect cfg)]
14
+ (d/transact conn [{:db/id 1, :name "Ivan", :age 15}
15
+ {:db/id 2, :name "Petr", :age 37}
16
+ {:db/id 3, :name "Ivan", :age 37}
17
+ {:db/id 4, :age 15}])
18
+ (is (= (d/q '[:find ?e :where [?e :name]] @conn)
19
+ #{[3] [2] [1]}))
20
+
21
+ (d/release conn)
22
+ (is (d/database-exists? cfg)))))
23
+
24
+ (deftest test-db-file-store
25
+ (test-store {:store {:backend :file
26
+ :path (case (System/getProperty "os.name")
27
+ "Windows 10" (str (System/getProperty "java.io.tmpdir") "api-fs")
28
+ "/tmp/api-fs")
29
+ :id #uuid "f11e0000-0000-0000-0000-00000000000f"}}))
30
+
31
+ (deftest test-db-mem-store
32
+ (test-store {:store {:backend :memory :id #uuid "e0000000-0000-0000-0000-00000000000e"}}))
33
+
34
+ (deftest test-index
35
+ (let [config {:store {:backend :memory
36
+ :id #uuid "f0000000-0000-0000-0000-00000000000f"}
37
+ :schema-flexibility :read
38
+ :keep-history? false}]
39
+ (d/delete-database config)
40
+ (d/create-database config)
41
+ (let [conn (d/connect config)]
42
+ (testing "root node type"
43
+ (d/transact conn [{:db/id 1, :name "Alice"}])
44
+ (is (= (if (= :datahike.index/persistent-set (-> @conn :config :index))
45
+ org.replikativ.persistent_sorted_set.PersistentSortedSet
46
+ hitchhiker.tree.DataNode)
47
+ (-> @conn :eavt type))))
48
+ (testing "upsert"
49
+ (d/transact conn [{:db/id 1, :name "Paula"}])
50
+ (is (= "Paula" (:name (d/entity @conn 1)))))
51
+ (d/release conn))))
52
+
53
+ (deftest test-binary-support
54
+ (let [config {:store {:backend :memory
55
+ :id #uuid "00100000-0000-0000-0000-000000000010"}
56
+ :schema-flexibility :read
57
+ :keep-history? false}]
58
+ (d/delete-database config)
59
+ (d/create-database config)
60
+ (let [conn (d/connect config)]
61
+ (d/transact conn [{:db/id 1, :name "Jiayi", :payload (byte-array [0 2 3])}
62
+ {:db/id 2, :name "Peter", :payload (byte-array [1 2 3])}])
63
+ (is (= "Jiayi"
64
+ (d/q '[:find ?n .
65
+ :in $ ?arr
66
+ :where
67
+ [?e :payload ?arr]
68
+ [?e :name ?n]]
69
+ @conn
70
+ (byte-array [0 2 3]))))
71
+ (d/release conn))))
72
+
73
+ (deftest test-database-exists-with-invalid-store
74
+ (testing "Store with missing :id"
75
+ (is (thrown-with-msg? #?(:clj Exception :cljs js/Error)
76
+ #"\s+:id\s+"
77
+ (d/database-exists?
78
+ {:store {:backend :memory}})))))
@@ -0,0 +1,57 @@
1
+ (ns datahike.test.stress-test
2
+ (:require [datahike.api :as d]
3
+ #?(:cljs [cljs.test :as t :refer-macros [is deftest testing]]
4
+ :clj [clojure.test :as t :refer [is deftest testing]])))
5
+
6
+ (deftest ^:no-spec stress-test
7
+ (testing "Test lots of parallel reads and writes."
8
+ (let [avet? true
9
+ num-writes 10000
10
+ num-reads 1000
11
+
12
+ schema [{:db/ident :name
13
+ :db/cardinality :db.cardinality/one
14
+ :db/index true
15
+ :db/unique :db.unique/identity
16
+ :db/valueType :db.type/string}
17
+ {:db/ident :sibling
18
+ :db/cardinality :db.cardinality/many
19
+ :db/valueType :db.type/ref}
20
+ {:db/ident :age
21
+ :db/cardinality :db.cardinality/one
22
+ :db/index avet?
23
+ :db/valueType :db.type/long}]
24
+
25
+ cfg {:store {:backend :file :path "/tmp/dh-stress"
26
+ :id #uuid "57e55000-0000-0000-0000-000000000001"
27
+ :config {:sync-blob? true :in-place? false}}
28
+ :keep-history? false
29
+ :schema-flexibility :read
30
+ :initial-tx []}
31
+
32
+ _ (d/delete-database cfg)
33
+ _ (d/create-database cfg)
34
+ conn (d/connect cfg)
35
+
36
+ _ (d/transact conn schema)
37
+
38
+ ;; write in parallel and force the transactor to keep flusing
39
+ last-transact
40
+ (last
41
+ (for [i (shuffle (range num-writes))]
42
+ (do #_(prn "write")
43
+ (d/transact! conn {:tx-data [[:db/add (inc i) :age i]]}))))]
44
+
45
+ ;; read while we are writing
46
+ (dotimes [_ num-reads]
47
+ #_(prn "read")
48
+ (d/q '[:find ?e :where [?e :age ?a]]
49
+ @conn))
50
+
51
+ @last-transact
52
+ (is (= num-writes
53
+ (d/q '[:find (count ?e) .
54
+ :where
55
+ [?e :age ?a]]
56
+ @conn)))
57
+ (d/release conn true))))