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,87 @@
1
+ (ns sandbox-client
2
+ (:require [datahike.http.client :refer :all]
3
+ [datahike.http.server :refer [start-server stop-server]]))
4
+
5
+ (comment
6
+ (def config {:port 3333
7
+ :join? false
8
+ :dev-mode false
9
+ :token "securerandompassword"})
10
+
11
+ (def server (start-server config))
12
+
13
+ (stop-server server)
14
+
15
+ (def new-config (create-database {:schema-flexibility :read
16
+ :remote-peer {:backend :datahike-server
17
+ :url "http://localhost:3333"
18
+ :token "securerandompassword"
19
+ :format :transit}}))
20
+
21
+ (def conn (connect new-config))
22
+
23
+ (:remote-peer conn)
24
+
25
+ (def test-db @conn)
26
+
27
+ (:remote-peer test-db)
28
+
29
+ (db conn)
30
+
31
+ (history test-db)
32
+
33
+ (:remote-peer (history test-db))
34
+
35
+ (type test-db)
36
+
37
+ (transact conn [{:name "Peter" :age 42}])
38
+
39
+ (def test-db (db conn))
40
+
41
+ (q '[:find ?n ?a
42
+ :in $1 $2 $3
43
+ :where
44
+ [$1 ?e :age ?a]
45
+ [$1 ?e :name ?n]]
46
+ test-db (history test-db) (entity test-db 1))
47
+
48
+ (query-stats '[:find ?n ?a :in $ $2 :where [?e :age ?a] [?e :name ?n]] test-db test-db)
49
+
50
+ (pull test-db '[:*] 1)
51
+
52
+ (pull-many test-db '[:*] [1 2])
53
+
54
+ (datoms test-db :eavt)
55
+
56
+ (seek-datoms test-db :eavt)
57
+
58
+ (metrics test-db)
59
+
60
+ (schema test-db)
61
+
62
+ (reverse-schema test-db)
63
+
64
+ ;; no export because of function passing limitation
65
+ (listen conn (fn [x] x))
66
+
67
+ (filter test-db "even?") ;; returns client-db, not filtered DB
68
+
69
+ (is-filtered (filter test-db "even?")) ;; false
70
+
71
+ (entity test-db 1)
72
+
73
+ (entity-db (entity test-db 1))
74
+
75
+ (since test-db (java.util.Date.))
76
+
77
+ (as-of test-db (java.util.Date.))
78
+
79
+ (with test-db [{:name "Petra" :age 43}]) ;; TODO works but returns same DB as input
80
+
81
+ (db-with test-db [{:name "Petra" :age 43}])
82
+
83
+ (tempid test-db)
84
+
85
+ (release conn)
86
+
87
+ (delete-database new-config))
@@ -0,0 +1,109 @@
1
+ (ns sandbox-transact-bench
2
+ (:require [datahike.api :as d]))
3
+
4
+
5
+ (comment
6
+ (log/set-level! :warn)
7
+
8
+ ;; if profiling
9
+ ;;(require '[clj-async-profiler.core :as prof])
10
+ ;;
11
+
12
+ ;; ;; The resulting flamegraph will be stored in /tmp/clj-async-profiler/results/
13
+ ;; ;; You can view the SVG directly from there or start a local webserver:
14
+ ;; (prof/serve-files 8080) ; Serve on port 8080
15
+
16
+
17
+ (defn bench
18
+ [{:keys [avet? update? decreasing? one-transaction?]} counter]
19
+ (let [schema [{:db/ident :name
20
+ :db/cardinality :db.cardinality/one
21
+ :db/index true
22
+ :db/unique :db.unique/identity
23
+ :db/valueType :db.type/string}
24
+ {:db/ident :sibling
25
+ :db/cardinality :db.cardinality/many
26
+ :db/valueType :db.type/ref}
27
+ {:db/ident :age
28
+ :db/cardinality :db.cardinality/one
29
+ :db/index avet?
30
+ :db/valueType :db.type/long}]
31
+
32
+ cfg {:store {:backend :mem :id "sandbox" :path "/tmp/benchplay"}
33
+ :keep-history? true
34
+ :schema-flexibility :read
35
+ :initial-tx []}
36
+
37
+ _ (d/delete-database cfg)
38
+ _ (d/create-database cfg)
39
+ conn (d/connect cfg)]
40
+
41
+ (d/transact conn schema)
42
+
43
+ (println "==== avet?" avet? "---- update?" update? "---- decreasing?" decreasing? "--- one-transaction?" one-transaction? " iter. num.:" counter)
44
+ (if one-transaction?
45
+ (let [txs (vec (for [i (range counter)]
46
+ [:db/add (if update? 1000 (inc i)) :age (if decreasing? (- counter i) i)]))]
47
+ (time
48
+ (d/transact conn txs)))
49
+ ;; Multiple transactions
50
+ (time
51
+ (doall
52
+ (for [i (range counter)]
53
+ (d/transact conn [[:db/add (if update? 1000 (inc i)) :age (if decreasing? (- counter i) i)]])))))))
54
+
55
+ (defn bench-all [counter]
56
+ (bench {:avet? false
57
+ :update? false
58
+ :decreasing? false
59
+ :one-transaction? true}
60
+ counter)
61
+
62
+ (bench {:avet? false
63
+ :update? true
64
+ :decreasing? true
65
+ :one-transaction? true}
66
+ counter)
67
+
68
+ (bench {:avet? true
69
+ :update? false
70
+ :decreasing? false
71
+ :one-transaction? true}
72
+ counter)
73
+
74
+ (bench {:avet? true
75
+ :update? true
76
+ :decreasing? true
77
+ :one-transaction? true}
78
+ counter))
79
+
80
+
81
+ (for [i (range 3)]
82
+ (do
83
+ (bench-all 100000)
84
+ (prn " ========================== DONE ============")))
85
+
86
+
87
+ (doall
88
+ (for [avet [false true]
89
+ decreasing [false true]
90
+ update [true false]
91
+ _ (range 3)]
92
+ (bench {:avet? avet
93
+ :update? update
94
+ :decreasing? decreasing
95
+ :one-transaction? true}
96
+ 100000)))
97
+
98
+
99
+ ;; if profiling
100
+ ;; (prof/profile (d/transact conn txs))
101
+
102
+
103
+ (d/q '[:find ?e ?a
104
+ :in $ ?a
105
+ :where [?e :age ?a]]
106
+ (d/history @conn) ;; use @conn if no history
107
+ 35)
108
+
109
+ (d/datoms @conn :eavt 35))
package/dev/user.clj ADDED
@@ -0,0 +1,79 @@
1
+ (ns user
2
+ (:require [datahike.api :as d]
3
+ [hashp.core]))
4
+
5
+ (comment
6
+
7
+ (def schema [{:db/ident :name
8
+ :db/cardinality :db.cardinality/one
9
+ :db/index true
10
+ :db/unique :db.unique/identity
11
+ :db/valueType :db.type/string}
12
+ {:db/ident :sibling
13
+ :db/cardinality :db.cardinality/many
14
+ :db/valueType :db.type/ref}
15
+ {:db/ident :age
16
+ :db/cardinality :db.cardinality/one
17
+ :db/valueType :db.type/long}])
18
+
19
+ (def cfg {:store {:backend :mem :id "sandbox"}
20
+ :keep-history? true
21
+ :schema-flexibility :write
22
+ :attribute-refs? true})
23
+
24
+ (def conn (do
25
+ (d/delete-database cfg)
26
+ (d/create-database cfg)
27
+ (d/connect cfg)))
28
+
29
+ (d/transact conn schema)
30
+
31
+ (d/datoms @conn :avet)
32
+ (d/datoms @conn :aevt)
33
+ (d/datoms @conn :eavt)
34
+
35
+ (:max-eid @conn)
36
+
37
+ (d/transact conn [{:name "Alice"
38
+ :age 25}])
39
+
40
+ (d/transact conn [{:name "Bob"
41
+ :age 25}])
42
+
43
+ (d/transact conn [{:name "Charlie"
44
+ :age 45
45
+ :sibling [[:name "Alice"] [:name "Bob"]]}])
46
+
47
+ (d/q '[:find ?e ?a ?v ?t
48
+ :in $ ?a
49
+ :where
50
+ [?e :name ?v ?t]
51
+ [?e :age ?a]]
52
+ @conn
53
+ 25)
54
+
55
+ (d/q '[:find ?e ?at ?v
56
+ :where
57
+ [?e ?a ?v]
58
+ [?a :db/ident ?at]]
59
+ @conn)
60
+
61
+
62
+ (d/q '[:find ?e :where [?e :name "Alice"]] @conn)
63
+
64
+ (do (d/transact conn (vec (repeatedly 5000 (fn [] {:age (long (rand-int 1000))
65
+ :name (str (rand-int 1000))}))))
66
+ true)
67
+
68
+ (d/q {:query '[:find ?e ?v
69
+ :in $
70
+ :where [?e :name ?v]]
71
+ :args [@conn]
72
+ :offset 0
73
+ :limit 10})
74
+
75
+ (do (d/q {:query '[:find ?v1 ?v2
76
+ :in $
77
+ :where [?e1 :name ?v1] [?e2 :name ?v2]]
78
+ :args [@conn]})
79
+ nil))
package/doc/README.md ADDED
@@ -0,0 +1,96 @@
1
+ # Datahike Documentation
2
+
3
+ Welcome to the Datahike documentation! This index organizes all documentation by topic and user level.
4
+
5
+ ## 🚀 Getting Started
6
+
7
+ New to Datahike? Start here:
8
+
9
+ - **[Main README](../README.md)** - Project overview, installation, and quick start
10
+ - **[Why Datalog?](./datalog-vs-sql.md)** - Query comparisons and when to use Datalog
11
+ - **[Configuration](./config.md)** - Database configuration options
12
+ - **[Schema Flexibility](./schema.md)** - Schema-on-read vs schema-on-write
13
+
14
+ ## 📚 Core Concepts
15
+
16
+ Essential concepts for working with Datahike:
17
+
18
+ - **[Time Variance](./time_variance.md)** - Time-travel queries (as-of, history, since), audit trails, and GDPR-compliant purging
19
+ - **[Storage Backends](./storage-backends.md)** - Choosing the right backend for your needs (file, memory, PostgreSQL, etc.)
20
+ - **[Garbage Collection](./gc.md)** - Reclaim storage by removing old database snapshots
21
+ - **[Entity Spec](./entity_spec.md)** - Entity API and specifications
22
+ - **[Logging and Error Handling](./logging_and_error_handling.md)** - Debugging and error management
23
+
24
+ ## 🔧 Language Bindings (Beta)
25
+
26
+ Datahike supports multiple languages and platforms:
27
+
28
+ ### JVM Languages
29
+ - **[Java API](./java-api.md)** - Fluent builder API, automatic collection conversion, comprehensive bindings
30
+ - Examples: [`examples/java/`](../examples/java/)
31
+ - Status: **Beta** - Functional and tested, but may receive breaking changes
32
+
33
+ ### JavaScript/TypeScript
34
+ - **[JavaScript API](./javascript-api.md)** - Promise-based API for Node.js and browsers
35
+ - npm: `npm install datahike@next`
36
+ - Status: **Beta** - Functional and tested, but may receive breaking changes
37
+
38
+ ### ClojureScript
39
+ - **[ClojureScript Support](./cljs-support.md)** - Async operations, Node.js, IndexedDB, and browser backends
40
+ - Backends: Memory, IndexedDB, TieredStore, File (Node.js)
41
+ - Status: **Beta** - Functional, please try it out and provide feedback
42
+
43
+ ### Python
44
+ - **[Python Bindings](../pydatahike/README.md)** - High-level Pythonic API with automatic EDN conversion
45
+ - Status: **Beta** - Functional and tested, but may receive breaking changes
46
+
47
+ ### CLI & Shell
48
+ - **[CLI (dthk)](./cli.md)** - Native command-line tool compiled with GraalVM
49
+ - Features: Instant startup, file backend, scriptable
50
+ - Status: **Beta** - Functional and tested, but command structure may change
51
+
52
+ - **[Babashka Pod](./bb-pod.md)** - Shell scripting with Datahike
53
+ - Integration: Native pod for Babashka
54
+ - Status: **Beta** - Functional but not yet used in production
55
+
56
+ ### Native Libraries
57
+ - **[libdatahike](./libdatahike.md)** - C/C++ native bindings for embedding in non-JVM applications
58
+ - Use cases: Embedding in C/C++/Rust/Go applications
59
+ - Status: **Beta** - Functional and tested, but API may change
60
+
61
+ - **[EDN Conversion Rules](./bindings/edn-conversion.md)** - How data types map between languages
62
+
63
+ ## 🏗️ Advanced Features
64
+
65
+ For experienced users building production systems:
66
+
67
+ - **[Distributed Architecture](./distributed.md)** - Distributed Index Space and real-time sync with Kabel
68
+ - **[Versioning](./versioning.md)** - Git-like branching and merging (beta)
69
+ - **[Norms](./norms.md)** - Database migration system
70
+ - **[Unstructured Input Support](./unstructured.md)** - Schema inference from JSON/EDN (experimental)
71
+
72
+ ## 🔍 Reference
73
+
74
+ - **[Differences to Datomic](./datomic_differences.md)** - API compatibility and differences
75
+ - **[Benchmarking](./benchmarking.md)** - Performance testing and optimization
76
+
77
+ ## 🛠️ Development
78
+
79
+ Contributing to Datahike:
80
+
81
+ - **[Contributing Guide](./contributing.md)** - How to contribute to the project
82
+ - **[Backend Development](./backend-development.md)** - Creating custom storage backends
83
+
84
+ ---
85
+
86
+ ## Feature Maturity Levels
87
+
88
+ - **Stable** - Production-ready, API unlikely to change
89
+ - **Beta** - Tested and functional, but API may receive changes
90
+ - **Experimental** - Try it out, API likely to change significantly
91
+
92
+ ## Need Help?
93
+
94
+ - 💬 **[Discussions](https://github.com/replikativ/datahike/discussions)** - Ask questions and share ideas
95
+ - 🐛 **[Issues](https://github.com/replikativ/datahike/issues)** - Report bugs or request features
96
+ - 📖 **[API Docs](https://cljdoc.org/d/org.replikativ/datahike)** - Complete API reference on cljdoc
@@ -0,0 +1,6 @@
1
+ # Architecture Decision List
2
+ This log captures all architectural decisions that are made throughout the
3
+ development process. Have a look [here](https://github.com/joelparkerhenderson/architecture_decision_record) for more information.
4
+
5
+ See [template](./adr-XYZ-template.md) for the record.
6
+
@@ -0,0 +1,28 @@
1
+ #+TITLE: Architecture Decision Record Template
2
+ * Context
3
+ Datahike enters a stage where architectural decisions have larger consequences
4
+ for the marketing and use since more and more people are integrating it into
5
+ their products. Therefore a documentation for all decisions should be written.
6
+ * Options
7
+ ** Write architecture decision records
8
+ Use the approach of [[https://github.com/joelparkerhenderson/architecture_decision_record][Architecture Decsion Records]] to document the decision-making.
9
+ *** Pro
10
+ - transparent decision-making
11
+ - architectural docs
12
+ - recorded discussion on options
13
+ *** Contra
14
+ - overhead of writings
15
+ - longer process for decision-making
16
+ - needs practice
17
+ - needs some supervision in the beginning
18
+ * Status
19
+ Pending
20
+ * Decision
21
+ All architectural decisions have to be recorded in this folder with ascending
22
+ numbering. An overview of sections to be discussed is found in the [[file:./adr-XYZ-template.org][template file]].
23
+ * Consequences
24
+ - all members need to write an ADR for a new feature
25
+ - ADR are the artifacts of our transparent decision-making
26
+ - ADL can be found in the Datahike repository
27
+ - All open discussions on architecutre can be followed and open questions can be
28
+ addressed
@@ -0,0 +1,15 @@
1
+ #+TITLE: Attribute References
2
+ * Context
3
+ - attributes in Datoms are represented and stored as keywords
4
+ - in Datomic all of the attributes are stores as references to the schema
5
+ definition of the attribute
6
+ * Options
7
+ ** Bootstrap system schema in index
8
+ *** Pro
9
+ *** Contra
10
+ ** Create system refs only in record
11
+ *** Pro
12
+ *** Contra
13
+ * Status
14
+ * Decision
15
+ * Consequences
@@ -0,0 +1,54 @@
1
+ #+TITLE: Reconsider build and dependency resolution tooling
2
+ #+DATE: 2020-09-22
3
+
4
+ * Status
5
+
6
+ Accepted
7
+
8
+ * Context
9
+
10
+ Embracing Clojurescript support for the replikativ libraries again also means
11
+ that there are some changes to the used tooling for dependency resolution and
12
+ compilation. Shadow CLJS is the current default tool for compiling ClojureScript
13
+ projects. Shadow CLJS supports Leiningen and Clojure CLI Tools.
14
+
15
+ Leiningen was for a long time the default dependency resolution and build tool
16
+ for most people in the Clojure community and still has widespread adoption. All
17
+ the replikativ libraries are using it and it worked fine for a long time. But
18
+ Clojure CLI Tools see a lot of adoption throughout the community and people see
19
+ it as the successor to Leiningen.
20
+
21
+ The Clojurescript build process took some work from the community to figure out
22
+ a simple way. For new projects Clojure CLI Tools and Shadow CLJS are probably
23
+ the defaults for new projects in that space. replikativ has a legacy in using
24
+ Leiningen. Shadow CLJS supports dependency resolution from both tools so
25
+ dependencies only need to be specified once.
26
+
27
+ ** Advantages of Clojure CLI tools:
28
+ - simpler
29
+ - faster start (leiningen starts a JVM for itself as well)
30
+ - community is gravitating towards it
31
+ - commit-shas for dependency resolution
32
+
33
+ ** Advantages of Leiningen:
34
+ - not alpha
35
+ - uberjar built in
36
+ - deploy built in
37
+ - adoption in replikativ already there
38
+ - no pom.xml needed
39
+ - diversity of plugins available
40
+
41
+ It seems that there is no obstacle in our way to switch to Clojure CLI tools
42
+ but there might be some unknowns on our way. We could stick with Leiningen
43
+ as well and avoid some work that is not yet needed.
44
+
45
+ * Decision
46
+
47
+ The decision is to use Clojure CLI tools in the future and to adopt it step by
48
+ step. First is the hasch library and the other Clojurescript-using libraries
49
+ like konserve, superv.async and incognito.
50
+
51
+ * Consequences
52
+
53
+ Harmonize the build tools and CI across all the replikativ libraries. That means
54
+ there will be built another CircleCI Orb and a change to all the libs is needed.
@@ -0,0 +1,52 @@
1
+ # DB meta data
2
+
3
+ ## Context
4
+
5
+ The database record `DB` has no information about its creation date, used versions and no unique identifier. See [discussion](https://github.com/replikativ/datahike/discussions/407).
6
+
7
+ ## Options
8
+
9
+ ### A: Extension of `:config` in DB record
10
+
11
+ Add the addtional fields to the current `:config` field in the DB record:
12
+
13
+ #### Pro
14
+
15
+ - no refactoring of current record
16
+ - Database ID could be set from outside
17
+
18
+ #### Contra
19
+ - it's bad practice to have a user set internal database data
20
+ - meta data is semantically different from configuration
21
+
22
+ ### B: Addtion of new field `meta` in DB record
23
+
24
+ Create new field `:meta` in the DB record containing a hashmap with the attributes:
25
+
26
+ - `:datahike/version`: `String`
27
+ - `:datahike/created-at`: `Date`
28
+ - `:datahike/id`: `UUID`
29
+ - `:konserve/version`: `String`
30
+ - `:hitchhiker.tree/version`: `String`
31
+
32
+ #### Pro
33
+
34
+ - clean semantic
35
+ - extensible
36
+
37
+ #### Contra
38
+
39
+ - extra implementation work
40
+ - migration might be needed
41
+
42
+ ## Status
43
+
44
+ **OPEN**
45
+
46
+ ## Decision
47
+
48
+ **NONE**
49
+
50
+ ## Consequences
51
+
52
+ - older databases need to be migrated
@@ -0,0 +1,40 @@
1
+ # Github Flow
2
+
3
+ ## Context
4
+
5
+ [GitHub Flow](https://githubflow.github.io/)
6
+
7
+ We want to release more often. Therefore we are considering the GitHub Flow as an alternative to
8
+ our current Gitflow. Everytime a merge-request gets merged a new release should be created after
9
+ running the pipeline. That means features and bugfixes are propagated faster. Apart from that
10
+ the flow is just simpler and sufficient for our and our users' needs.
11
+
12
+ [Discussion](https://github.com/replikativ/datahike/discussions/447)
13
+
14
+ ## Options
15
+
16
+ [4 branching workflows for Git](https://medium.com/@patrickporto/4-branching-workflows-for-git-30d0aaee7bf)
17
+
18
+ ## Status
19
+
20
+ **Proposed**
21
+
22
+ ## Decision
23
+
24
+ We are switching to the GitHub Flow with [PR #445](https://github.com/replikativ/datahike/pull/445).
25
+
26
+ ## Consequences
27
+
28
+ When the PR is merged into the newly created `main`-branch we are from then on only branching off
29
+ of main for feature- and bugfix-branches. `main` needs to be the new default branch where everyone
30
+ is landing on by default. Everytime a PR is merged there will be a new release on GitHub with the
31
+ patch-level set to the overall commit-count. To make a new minor or major release the number
32
+ needs to be adjusted manually in the build.clj-file.
33
+
34
+ This change needs to be announced properly so that everyone working on Datahike knows about this
35
+ new way of working. In the future all replikativ-libraries will be switched so everyone needs to
36
+ know that there will not be any long-living-branches any more.
37
+
38
+ Another consequence to consider is that CircleCI then has permission to write to our GitHub-repo.
39
+ Since it is necessary to write to the git-repo when tagging a commit CircleCI needs the full
40
+ write access. It already has the ability to release a jar to Clojars.
@@ -0,0 +1,30 @@
1
+ # Architecture Decision Record Template XYZ
2
+
3
+ ## Context
4
+ Add related entry in [discussions](https://github.com/replikativ/datahike/discussions) where possible.
5
+
6
+ ## Options
7
+
8
+ ### Option A
9
+
10
+ #### Pro
11
+
12
+ #### Contra
13
+
14
+ ### Option B
15
+
16
+ #### Pro
17
+
18
+ #### Contra
19
+
20
+ ## Status
21
+
22
+ **OPEN**
23
+
24
+ ## Decision
25
+
26
+ **NONE**
27
+
28
+ ## Consequences
29
+
30
+
@@ -0,0 +1,3 @@
1
+ #TITLE: Architecture Decision Log
2
+ This log captures all architectural decisions that are made throughout the
3
+ development process. Have a look [[https://github.com/joelparkerhenderson/architecture_decision_record][here]] for more information.
@@ -0,0 +1,3 @@
1
+ <svg width="160" height="86" viewBox="0 0 160 86" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M79.3077 3.36008C79.3662 3.14037 79.3973 2.90952 79.3973 2.67139C79.3973 1.19602 78.2013 0 76.7259 0C75.2506 0 74.0545 1.19602 74.0545 2.67139C74.0545 2.99687 74.1127 3.30876 74.2193 3.59721L54.3496 25.7595C54.1043 25.6853 53.8441 25.6454 53.5746 25.6454C53.1085 25.6454 52.6703 25.7647 52.2889 25.9745L41.9647 18.2313C41.9865 18.0939 41.9978 17.9529 41.9978 17.8093C41.9978 16.3339 40.8018 15.1379 39.3264 15.1379C37.8511 15.1379 36.655 16.3339 36.655 17.8093C36.655 18.1211 36.7085 18.4204 36.8067 18.6987L19.4756 37.474C19.2738 37.4253 19.0632 37.3995 18.8465 37.3995C17.3711 37.3995 16.1751 38.5955 16.1751 40.0709C16.1751 41.5463 17.3711 42.7423 18.8465 42.7423C20.3218 42.7423 21.5178 41.5463 21.5178 40.0709C21.5178 39.7376 21.4568 39.4186 21.3453 39.1244L38.6376 20.391C38.8574 20.4495 39.0883 20.4807 39.3264 20.4807C39.7347 20.4807 40.1217 20.3891 40.4678 20.2253L50.9153 28.0609C50.9073 28.1451 50.9032 28.2305 50.9032 28.3168C50.9032 29.7921 52.0992 30.9882 53.5746 30.9882C55.0499 30.9882 56.2459 29.7921 56.2459 28.3168C56.2459 28.0377 56.2032 27.7686 56.1238 27.5157L76.0746 5.26283C76.2831 5.31505 76.5013 5.34278 76.7259 5.34278C77.0378 5.34278 77.3372 5.28935 77.6154 5.19112L85.7198 12.6721C85.6621 12.8907 85.6313 13.1202 85.6313 13.357C85.6313 14.8323 86.8273 16.0284 88.3027 16.0284C89.778 16.0284 90.9741 14.8323 90.9741 13.357C90.9741 13.0812 90.9323 12.8152 90.8547 12.565L93.4222 9.99751C93.7614 10.1534 94.1388 10.2403 94.5366 10.2403C94.9832 10.2403 95.4043 10.1307 95.7742 9.93697L111.538 24.2673C111.483 24.4801 111.454 24.7032 111.454 24.933C111.454 26.4084 112.65 27.6044 114.125 27.6044C115.601 27.6044 116.797 26.4084 116.797 24.933C116.797 24.8669 116.794 24.8014 116.79 24.7365L127.029 18.3371C127.424 18.5676 127.883 18.6997 128.374 18.6997C128.855 18.6997 129.306 18.5725 129.696 18.3497L143.547 27.1637C143.523 27.3071 143.511 27.4543 143.511 27.6044C143.511 29.0798 144.707 30.2758 146.182 30.2758C147.658 30.2758 148.854 29.0798 148.854 27.6044C148.854 26.129 147.658 24.933 146.182 24.933C145.784 24.933 145.407 25.02 145.067 25.176L131.036 16.2469C131.042 16.1748 131.045 16.1019 131.045 16.0284C131.045 14.553 129.849 13.357 128.374 13.357C126.898 13.357 125.702 14.553 125.702 16.0284C125.702 16.0934 125.704 16.1579 125.709 16.2217L115.467 22.6227C115.073 22.3931 114.615 22.2616 114.125 22.2616C113.805 22.2616 113.498 22.318 113.214 22.4213L97.1927 7.85684C97.2028 7.76227 97.208 7.66622 97.208 7.56896C97.208 6.09359 96.012 4.89756 94.5366 4.89756C93.0612 4.89756 91.8652 6.09359 91.8652 7.56896C91.8652 7.71385 91.8767 7.85606 91.8989 7.9947L89.0901 10.8035C88.8412 10.7268 88.5767 10.6856 88.3027 10.6856C87.9894 10.6856 87.6887 10.7395 87.4094 10.8386L79.3077 3.36008ZM116.368 53.9439C116.368 55.4054 115.183 56.5902 113.722 56.5902C112.26 56.5902 111.076 55.4054 111.076 53.9439C111.076 52.4823 112.26 51.2976 113.722 51.2976C115.183 51.2976 116.368 52.4823 116.368 53.9439ZM9.45341 85.4846C12.7511 85.4846 14.8177 84.0776 15.9609 82.3627H16.1368L16.7084 85.0888H21.1493V52.5515H16.1368V65.1268H15.9609C14.8177 63.412 12.7511 62.0049 9.45341 62.0049C3.34167 62.0049 0.0439694 66.9735 0 73.7008C0.0439694 80.8238 3.60549 85.4846 9.45341 85.4846ZM10.6846 81.0437C6.5954 81.0437 5.10044 77.702 5.10044 73.7008C5.10044 69.7875 6.55143 66.4458 10.6846 66.4458C14.7297 66.4458 16.3126 69.7875 16.3126 73.7008C16.3126 77.658 14.6858 81.0437 10.6846 81.0437ZM32.01 85.4846C35.0439 85.4846 37.3743 84.3414 38.6934 82.4067H38.8693L39.221 85.0888H43.6179V69.9634C43.6179 65.4785 40.2323 62.0049 34.2525 62.0049C28.5365 62.0049 25.1508 65.2147 25.1508 69.5237H29.8995C29.9435 67.677 31.3945 66.1381 34.1645 66.1381C37.3303 66.1381 38.6494 67.8968 38.6494 70.0074V72.1179C37.4622 71.7661 35.4396 71.3704 33.3731 71.3704C26.8656 71.3704 24.0955 74.4483 24.0955 78.4055C24.0955 82.4067 26.9975 85.4846 32.01 85.4846ZM33.1532 81.4834C30.4271 81.4834 29.1081 80.0763 29.1081 78.2296C29.1081 76.207 30.691 74.9759 33.7248 74.9759C35.3957 74.9759 36.9786 75.1957 38.6494 75.7673V76.5148C38.6494 79.197 36.4949 81.4834 33.1532 81.4834ZM60.5417 85.0009C59.8382 85.2207 58.3872 85.4846 56.6724 85.4846C51.8357 85.4846 49.9451 82.8024 49.9451 78.8892V66.6657H46.2077V62.4007H50.1649V57.608L54.5179 56.3769H54.9576V62.4007H60.4537V66.6657H54.9576V78.0098C54.9576 80.1643 55.8809 81.0876 57.9035 81.0876C58.8269 81.0876 59.5304 80.9557 60.102 80.7798H60.5417V85.0009ZM70.6258 85.4846C73.6597 85.4846 75.99 84.3414 77.3091 82.4067H77.485L77.8367 85.0888H82.2337V69.9634C82.2337 65.4785 78.848 62.0049 72.8682 62.0049C67.1522 62.0049 63.7666 65.2147 63.7666 69.5237H68.5152C68.5592 67.677 70.0102 66.1381 72.7803 66.1381C75.9461 66.1381 77.2651 67.8968 77.2651 70.0074V72.1179C76.078 71.7661 74.0554 71.3704 71.9888 71.3704C65.4814 71.3704 62.7113 74.4483 62.7113 78.4055C62.7113 82.4067 65.6133 85.4846 70.6258 85.4846ZM71.769 81.4834C69.0429 81.4834 67.7238 80.0763 67.7238 78.2296C67.7238 76.207 69.3067 74.9759 72.3406 74.9759C74.0114 74.9759 75.5943 75.1957 77.2651 75.7673V76.5148C77.2651 79.197 75.1106 81.4834 71.769 81.4834ZM91.111 85.0888H87.4176V52.5515H91.111V66.1381H91.2869C92.4741 63.8516 94.6725 62.2248 98.1461 62.2248C103.115 62.2248 106.105 65.3466 106.105 70.491V85.0888H102.411V71.0626C102.411 67.5451 100.696 65.5225 97.1348 65.5225C93.4854 65.5225 91.111 68.2486 91.111 72.7774V85.0888ZM112.028 85.0888H115.722V62.6205H112.028V85.0888ZM121.654 85.0888V52.5515H125.347V72.4696V85.0888H121.654ZM125.347 72.4696L134.844 62.6205H139.197V63.0602L130.096 72.4696L139.461 84.6491V85.0888H135.196L125.347 72.4696ZM150.327 85.4846C155.119 85.4846 159.077 82.7145 159.692 78.5814H155.999C155.383 80.9557 153.273 82.1869 150.327 82.1869C146.15 82.1869 143.995 79.2409 143.995 74.9759H160V73.1731C160 66.9295 156.614 62.2248 150.283 62.2248C143.336 62.2248 140.126 67.3692 140.126 73.8767C140.126 80.4721 143.687 85.4846 150.327 85.4846ZM144.039 71.898C144.171 68.3805 146.062 65.5225 150.283 65.5225C154.284 65.5225 156.175 68.3365 156.175 71.898H144.039Z" fill="#2E3D51"/>
3
+ </svg>