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.
- package/.circleci/config.yml +405 -0
- package/.circleci/scripts/gen_ci.clj +194 -0
- package/.cirrus.yml +60 -0
- package/.clj-kondo/babashka/sci/config.edn +1 -0
- package/.clj-kondo/babashka/sci/sci/core.clj +9 -0
- package/.clj-kondo/config.edn +95 -0
- package/.dir-locals.el +2 -0
- package/.github/FUNDING.yml +3 -0
- package/.github/ISSUE_TEMPLATE/1-bug-report.yml +68 -0
- package/.github/ISSUE_TEMPLATE/2-feature-request.yml +28 -0
- package/.github/ISSUE_TEMPLATE/config.yml +6 -0
- package/.github/pull_request_template.md +24 -0
- package/.github/workflows/native-image.yml +84 -0
- package/LICENSE +203 -0
- package/README.md +273 -0
- package/bb/deps.edn +9 -0
- package/bb/resources/github-fingerprints +3 -0
- package/bb/resources/native-image-tests/run-bb-pod-tests.clj +162 -0
- package/bb/resources/native-image-tests/run-libdatahike-tests +12 -0
- package/bb/resources/native-image-tests/run-native-image-tests +74 -0
- package/bb/resources/native-image-tests/run-python-tests +22 -0
- package/bb/resources/native-image-tests/testconfig.attr-refs.edn +6 -0
- package/bb/resources/native-image-tests/testconfig.edn +5 -0
- package/bb/resources/template/.settings/org.eclipse.jdt.apt.core.prefs +2 -0
- package/bb/resources/template/.settings/org.eclipse.jdt.core.prefs +9 -0
- package/bb/resources/template/.settings/org.eclipse.m2e.core.prefs +4 -0
- package/bb/resources/template/pom.xml +22 -0
- package/bb/src/tools/build.clj +132 -0
- package/bb/src/tools/clj_kondo.clj +32 -0
- package/bb/src/tools/deploy.clj +26 -0
- package/bb/src/tools/examples.clj +19 -0
- package/bb/src/tools/npm.clj +100 -0
- package/bb/src/tools/python.clj +14 -0
- package/bb/src/tools/release.clj +94 -0
- package/bb/src/tools/test.clj +148 -0
- package/bb/src/tools/version.clj +47 -0
- package/bb.edn +269 -0
- package/benchmark/src/benchmark/cli.clj +195 -0
- package/benchmark/src/benchmark/compare.clj +157 -0
- package/benchmark/src/benchmark/config.clj +316 -0
- package/benchmark/src/benchmark/measure.clj +187 -0
- package/benchmark/src/benchmark/store.clj +190 -0
- package/benchmark/test/benchmark/measure_test.clj +156 -0
- package/build.clj +30 -0
- package/config.edn +49 -0
- package/deps.edn +138 -0
- package/dev/sandbox.clj +82 -0
- package/dev/sandbox.cljs +127 -0
- package/dev/sandbox_benchmarks.clj +27 -0
- package/dev/sandbox_client.clj +87 -0
- package/dev/sandbox_transact_bench.clj +109 -0
- package/dev/user.clj +79 -0
- package/doc/README.md +96 -0
- package/doc/adl/README.md +6 -0
- package/doc/adl/adr-000-adr.org +28 -0
- package/doc/adl/adr-001-attribute-references.org +15 -0
- package/doc/adl/adr-002-build-tooling.org +54 -0
- package/doc/adl/adr-003-db-meta-data.md +52 -0
- package/doc/adl/adr-004-github-flow.md +40 -0
- package/doc/adl/adr-XYZ-template.md +30 -0
- package/doc/adl/index.org +3 -0
- package/doc/assets/datahike-logo.svg +3 -0
- package/doc/assets/datahiking-invoice.org +85 -0
- package/doc/assets/hhtree2.png +0 -0
- package/doc/assets/network_topology.svg +624 -0
- package/doc/assets/perf.png +0 -0
- package/doc/assets/schema_mindmap.mm +132 -0
- package/doc/assets/schema_mindmap.svg +970 -0
- package/doc/assets/temporal_index.mm +74 -0
- package/doc/backend-development.md +78 -0
- package/doc/bb-pod.md +89 -0
- package/doc/benchmarking.md +360 -0
- package/doc/bindings/edn-conversion.md +383 -0
- package/doc/cli.md +162 -0
- package/doc/cljdoc.edn +27 -0
- package/doc/cljs-support.md +133 -0
- package/doc/config.md +406 -0
- package/doc/contributing.md +114 -0
- package/doc/datalog-vs-sql.md +210 -0
- package/doc/datomic_differences.md +109 -0
- package/doc/development/pull-api-ns.md +186 -0
- package/doc/development/pull-frame-state-diagram.jpg +0 -0
- package/doc/distributed.md +566 -0
- package/doc/entity_spec.md +92 -0
- package/doc/gc.md +273 -0
- package/doc/java-api.md +808 -0
- package/doc/javascript-api.md +421 -0
- package/doc/libdatahike.md +86 -0
- package/doc/logging_and_error_handling.md +43 -0
- package/doc/norms.md +66 -0
- package/doc/schema-migration.md +85 -0
- package/doc/schema.md +287 -0
- package/doc/storage-backends.md +363 -0
- package/doc/store-id-refactoring.md +596 -0
- package/doc/time_variance.md +325 -0
- package/doc/unstructured.md +167 -0
- package/doc/versioning.md +261 -0
- package/examples/basic/README.md +19 -0
- package/examples/basic/deps.edn +6 -0
- package/examples/basic/docker-compose.yml +13 -0
- package/examples/basic/src/examples/core.clj +60 -0
- package/examples/basic/src/examples/schema.clj +155 -0
- package/examples/basic/src/examples/store.clj +60 -0
- package/examples/basic/src/examples/time_travel.clj +185 -0
- package/examples/java/.settings/org.eclipse.core.resources.prefs +3 -0
- package/examples/java/.settings/org.eclipse.jdt.apt.core.prefs +2 -0
- package/examples/java/.settings/org.eclipse.jdt.core.prefs +9 -0
- package/examples/java/.settings/org.eclipse.m2e.core.prefs +4 -0
- package/examples/java/README.md +162 -0
- package/examples/java/pom.xml +62 -0
- package/examples/java/src/main/java/examples/QuickStart.java +115 -0
- package/examples/java/src/main/java/examples/SchemaExample.java +148 -0
- package/examples/java/src/main/java/examples/TimeTravelExample.java +121 -0
- package/flake.lock +27 -0
- package/flake.nix +27 -0
- package/http-server/datahike/http/middleware.clj +75 -0
- package/http-server/datahike/http/server.clj +269 -0
- package/java/src/datahike/java/Database.java +274 -0
- package/java/src/datahike/java/Datahike.java +281 -0
- package/java/src/datahike/java/DatahikeGeneratedTest.java +349 -0
- package/java/src/datahike/java/DatahikeTest.java +370 -0
- package/java/src/datahike/java/EDN.java +170 -0
- package/java/src/datahike/java/IEntity.java +11 -0
- package/java/src/datahike/java/Keywords.java +161 -0
- package/java/src/datahike/java/SchemaFlexibility.java +52 -0
- package/java/src/datahike/java/Util.java +219 -0
- package/karma.conf.js +19 -0
- package/libdatahike/compile-cpp +7 -0
- package/libdatahike/src/datahike/impl/LibDatahikeBase.java +203 -0
- package/libdatahike/src/datahike/impl/libdatahike.clj +59 -0
- package/libdatahike/src/test_cpp.cpp +61 -0
- package/npm-package/PUBLISHING.md +140 -0
- package/npm-package/README.md +226 -0
- package/npm-package/package.template.json +34 -0
- package/npm-package/test-isomorphic.ts +281 -0
- package/npm-package/test.js +557 -0
- package/npm-package/typescript-test.ts +70 -0
- package/package.json +16 -0
- package/pydatahike/README.md +569 -0
- package/pydatahike/pyproject.toml +91 -0
- package/pydatahike/setup.py +42 -0
- package/pydatahike/src/datahike/__init__.py +134 -0
- package/pydatahike/src/datahike/_native.py +250 -0
- package/pydatahike/src/datahike/_version.py +2 -0
- package/pydatahike/src/datahike/database.py +722 -0
- package/pydatahike/src/datahike/edn.py +311 -0
- package/pydatahike/src/datahike/py.typed +0 -0
- package/pydatahike/tests/conftest.py +17 -0
- package/pydatahike/tests/test_basic.py +170 -0
- package/pydatahike/tests/test_database.py +51 -0
- package/pydatahike/tests/test_edn_conversion.py +299 -0
- package/pydatahike/tests/test_query.py +99 -0
- package/pydatahike/tests/test_schema.py +55 -0
- package/resources/clj-kondo.exports/io.replikativ/datahike/config.edn +5 -0
- package/resources/example_server.edn +4 -0
- package/shadow-cljs.edn +56 -0
- package/src/data_readers.clj +7 -0
- package/src/datahike/api/impl.cljc +176 -0
- package/src/datahike/api/specification.cljc +633 -0
- package/src/datahike/api/types.cljc +261 -0
- package/src/datahike/api.cljc +41 -0
- package/src/datahike/array.cljc +99 -0
- package/src/datahike/cli.clj +166 -0
- package/src/datahike/cljs.cljs +6 -0
- package/src/datahike/codegen/cli.clj +406 -0
- package/src/datahike/codegen/clj_kondo.clj +291 -0
- package/src/datahike/codegen/java.clj +403 -0
- package/src/datahike/codegen/naming.cljc +33 -0
- package/src/datahike/codegen/native.clj +559 -0
- package/src/datahike/codegen/pod.clj +488 -0
- package/src/datahike/codegen/python.clj +838 -0
- package/src/datahike/codegen/report.clj +55 -0
- package/src/datahike/codegen/typescript.clj +262 -0
- package/src/datahike/codegen/validation.clj +145 -0
- package/src/datahike/config.cljc +294 -0
- package/src/datahike/connections.cljc +16 -0
- package/src/datahike/connector.cljc +265 -0
- package/src/datahike/constants.cljc +142 -0
- package/src/datahike/core.cljc +297 -0
- package/src/datahike/datom.cljc +459 -0
- package/src/datahike/db/interface.cljc +119 -0
- package/src/datahike/db/search.cljc +305 -0
- package/src/datahike/db/transaction.cljc +937 -0
- package/src/datahike/db/utils.cljc +338 -0
- package/src/datahike/db.cljc +956 -0
- package/src/datahike/experimental/unstructured.cljc +126 -0
- package/src/datahike/experimental/versioning.cljc +172 -0
- package/src/datahike/externs.js +31 -0
- package/src/datahike/gc.cljc +69 -0
- package/src/datahike/http/client.clj +188 -0
- package/src/datahike/http/writer.clj +79 -0
- package/src/datahike/impl/entity.cljc +218 -0
- package/src/datahike/index/interface.cljc +93 -0
- package/src/datahike/index/persistent_set.cljc +469 -0
- package/src/datahike/index/utils.cljc +44 -0
- package/src/datahike/index.cljc +32 -0
- package/src/datahike/js/api.cljs +172 -0
- package/src/datahike/js/api_macros.clj +22 -0
- package/src/datahike/js.cljs +163 -0
- package/src/datahike/json.cljc +209 -0
- package/src/datahike/lru.cljc +146 -0
- package/src/datahike/migrate.clj +39 -0
- package/src/datahike/norm/norm.clj +245 -0
- package/src/datahike/online_gc.cljc +252 -0
- package/src/datahike/pod.clj +155 -0
- package/src/datahike/pull_api.cljc +325 -0
- package/src/datahike/query.cljc +1945 -0
- package/src/datahike/query_stats.cljc +88 -0
- package/src/datahike/readers.cljc +62 -0
- package/src/datahike/remote.cljc +218 -0
- package/src/datahike/schema.cljc +228 -0
- package/src/datahike/schema_cache.cljc +42 -0
- package/src/datahike/spec.cljc +101 -0
- package/src/datahike/store.cljc +80 -0
- package/src/datahike/tools.cljc +308 -0
- package/src/datahike/transit.cljc +80 -0
- package/src/datahike/writer.cljc +239 -0
- package/src/datahike/writing.cljc +362 -0
- package/src/deps.cljs +1 -0
- package/src-hitchhiker-tree/datahike/index/hitchhiker_tree/insert.cljc +76 -0
- package/src-hitchhiker-tree/datahike/index/hitchhiker_tree/upsert.cljc +128 -0
- package/src-hitchhiker-tree/datahike/index/hitchhiker_tree.cljc +213 -0
- package/test/datahike/backward_compatibility_test/src/backward_test.clj +37 -0
- package/test/datahike/integration_test/config_record_file_test.clj +14 -0
- package/test/datahike/integration_test/config_record_test.clj +14 -0
- package/test/datahike/integration_test/depr_config_uri_test.clj +15 -0
- package/test/datahike/integration_test/return_map_test.clj +62 -0
- package/test/datahike/integration_test.cljc +67 -0
- package/test/datahike/norm/norm_test.clj +124 -0
- package/test/datahike/norm/resources/naming-and-sorting-test/001-a1-example.edn +5 -0
- package/test/datahike/norm/resources/naming-and-sorting-test/002-a2-example.edn +5 -0
- package/test/datahike/norm/resources/naming-and-sorting-test/003-tx-fn-test.edn +1 -0
- package/test/datahike/norm/resources/naming-and-sorting-test/004-tx-data-and-tx-fn-test.edn +5 -0
- package/test/datahike/norm/resources/naming-and-sorting-test/01-transact-basic-characters.edn +2 -0
- package/test/datahike/norm/resources/naming-and-sorting-test/02 add occupation.edn +5 -0
- package/test/datahike/norm/resources/naming-and-sorting-test/checksums.edn +12 -0
- package/test/datahike/norm/resources/simple-test/001-a1-example.edn +5 -0
- package/test/datahike/norm/resources/simple-test/002-a2-example.edn +5 -0
- package/test/datahike/norm/resources/simple-test/checksums.edn +4 -0
- package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/001-a1-example.edn +5 -0
- package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/002-a2-example.edn +5 -0
- package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/003-tx-fn-test.edn +1 -0
- package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/checksums.edn +6 -0
- package/test/datahike/norm/resources/tx-data-and-tx-fn-test/second/004-tx-data-and-tx-fn-test.edn +5 -0
- package/test/datahike/norm/resources/tx-data-and-tx-fn-test/second/checksums.edn +2 -0
- package/test/datahike/norm/resources/tx-fn-test/first/001-a1-example.edn +5 -0
- package/test/datahike/norm/resources/tx-fn-test/first/002-a2-example.edn +5 -0
- package/test/datahike/norm/resources/tx-fn-test/first/checksums.edn +4 -0
- package/test/datahike/norm/resources/tx-fn-test/second/003-tx-fn-test.edn +1 -0
- package/test/datahike/norm/resources/tx-fn-test/second/checksums.edn +2 -0
- package/test/datahike/test/api_test.cljc +895 -0
- package/test/datahike/test/array_test.cljc +40 -0
- package/test/datahike/test/attribute_refs/datoms_test.cljc +140 -0
- package/test/datahike/test/attribute_refs/db_test.cljc +42 -0
- package/test/datahike/test/attribute_refs/differences_test.cljc +515 -0
- package/test/datahike/test/attribute_refs/entity_test.cljc +89 -0
- package/test/datahike/test/attribute_refs/pull_api_test.cljc +320 -0
- package/test/datahike/test/attribute_refs/query_find_specs_test.cljc +59 -0
- package/test/datahike/test/attribute_refs/query_fns_test.cljc +130 -0
- package/test/datahike/test/attribute_refs/query_interop_test.cljc +47 -0
- package/test/datahike/test/attribute_refs/query_not_test.cljc +193 -0
- package/test/datahike/test/attribute_refs/query_or_test.cljc +137 -0
- package/test/datahike/test/attribute_refs/query_pull_test.cljc +156 -0
- package/test/datahike/test/attribute_refs/query_rules_test.cljc +176 -0
- package/test/datahike/test/attribute_refs/query_test.cljc +241 -0
- package/test/datahike/test/attribute_refs/temporal_search.cljc +22 -0
- package/test/datahike/test/attribute_refs/transact_test.cljc +220 -0
- package/test/datahike/test/attribute_refs/utils.cljc +128 -0
- package/test/datahike/test/cache_test.cljc +38 -0
- package/test/datahike/test/components_test.cljc +92 -0
- package/test/datahike/test/config_test.cljc +158 -0
- package/test/datahike/test/core_test.cljc +105 -0
- package/test/datahike/test/datom_test.cljc +44 -0
- package/test/datahike/test/db_test.cljc +54 -0
- package/test/datahike/test/entity_spec_test.cljc +159 -0
- package/test/datahike/test/entity_test.cljc +103 -0
- package/test/datahike/test/explode_test.cljc +143 -0
- package/test/datahike/test/filter_test.cljc +75 -0
- package/test/datahike/test/gc_test.cljc +159 -0
- package/test/datahike/test/http/server_test.clj +192 -0
- package/test/datahike/test/http/writer_test.clj +86 -0
- package/test/datahike/test/ident_test.cljc +32 -0
- package/test/datahike/test/index_test.cljc +345 -0
- package/test/datahike/test/insert.cljc +125 -0
- package/test/datahike/test/java_bindings_test.clj +6 -0
- package/test/datahike/test/listen_test.cljc +41 -0
- package/test/datahike/test/lookup_refs_test.cljc +266 -0
- package/test/datahike/test/lru_test.cljc +27 -0
- package/test/datahike/test/migrate_test.clj +297 -0
- package/test/datahike/test/model/core.cljc +376 -0
- package/test/datahike/test/model/invariant.cljc +142 -0
- package/test/datahike/test/model/rng.cljc +82 -0
- package/test/datahike/test/model_test.clj +217 -0
- package/test/datahike/test/nodejs_test.cljs +262 -0
- package/test/datahike/test/online_gc_test.cljc +475 -0
- package/test/datahike/test/pod_test.clj +369 -0
- package/test/datahike/test/pull_api_test.cljc +474 -0
- package/test/datahike/test/purge_test.cljc +144 -0
- package/test/datahike/test/query_aggregates_test.cljc +101 -0
- package/test/datahike/test/query_find_specs_test.cljc +52 -0
- package/test/datahike/test/query_fns_test.cljc +523 -0
- package/test/datahike/test/query_interop_test.cljc +47 -0
- package/test/datahike/test/query_not_test.cljc +189 -0
- package/test/datahike/test/query_or_test.cljc +158 -0
- package/test/datahike/test/query_pull_test.cljc +147 -0
- package/test/datahike/test/query_rules_test.cljc +248 -0
- package/test/datahike/test/query_stats_test.cljc +218 -0
- package/test/datahike/test/query_test.cljc +984 -0
- package/test/datahike/test/schema_test.cljc +424 -0
- package/test/datahike/test/specification_test.cljc +30 -0
- package/test/datahike/test/store_test.cljc +78 -0
- package/test/datahike/test/stress_test.cljc +57 -0
- package/test/datahike/test/time_variance_test.cljc +518 -0
- package/test/datahike/test/tools_test.clj +134 -0
- package/test/datahike/test/transact_test.cljc +518 -0
- package/test/datahike/test/tuples_test.cljc +564 -0
- package/test/datahike/test/unstructured_test.cljc +291 -0
- package/test/datahike/test/upsert_impl_test.cljc +205 -0
- package/test/datahike/test/upsert_test.cljc +363 -0
- package/test/datahike/test/utils.cljc +110 -0
- package/test/datahike/test/validation_test.cljc +48 -0
- package/test/datahike/test/versioning_test.cljc +56 -0
- package/test/datahike/test.cljc +66 -0
- 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))))
|