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,142 @@
|
|
|
1
|
+
(ns ^:no-doc datahike.constants)
|
|
2
|
+
|
|
3
|
+
(def ^:const e0 0x00000000)
|
|
4
|
+
(def ^:const tx0 0x20000000)
|
|
5
|
+
(def ^:const emax 0x7FFFFFFF)
|
|
6
|
+
(def ^:const txmax 0x7FFFFFFF)
|
|
7
|
+
|
|
8
|
+
(def ^:const system-schema
|
|
9
|
+
[{:db/id tx0
|
|
10
|
+
:db/txInstant #inst"1970-01-01T00:00:00.000-00:00"}
|
|
11
|
+
{:db/id 1
|
|
12
|
+
:db/ident :db/ident
|
|
13
|
+
:db/valueType :db.type/keyword
|
|
14
|
+
:db/cardinality :db.cardinality/one
|
|
15
|
+
:db/doc "An attribute's or specification's identifier"
|
|
16
|
+
:db/unique :db.unique/value}
|
|
17
|
+
{:db/id 2
|
|
18
|
+
:db/ident :db/valueType
|
|
19
|
+
:db/valueType :db.type/valueType
|
|
20
|
+
:db/cardinality :db.cardinality/one
|
|
21
|
+
:db/doc "An attribute's value type"}
|
|
22
|
+
{:db/id 3
|
|
23
|
+
:db/ident :db/cardinality
|
|
24
|
+
:db/valueType :db.type/cardinality
|
|
25
|
+
:db/cardinality :db.cardinality/one
|
|
26
|
+
:db/doc "An attribute's cardinality"}
|
|
27
|
+
{:db/id 4
|
|
28
|
+
:db/ident :db/doc
|
|
29
|
+
:db/valueType :db.type/string
|
|
30
|
+
:db/cardinality :db.cardinality/one
|
|
31
|
+
:db/doc "An attribute's documentation"}
|
|
32
|
+
{:db/id 5
|
|
33
|
+
:db/ident :db/index
|
|
34
|
+
:db/valueType :db.type/boolean
|
|
35
|
+
:db/cardinality :db.cardinality/one
|
|
36
|
+
:db/doc "An attribute's index selection"}
|
|
37
|
+
{:db/id 6
|
|
38
|
+
:db/ident :db/unique
|
|
39
|
+
:db/valueType :db.type/unique
|
|
40
|
+
:db/cardinality :db.cardinality/one
|
|
41
|
+
:db/doc "An attribute's unique selection"}
|
|
42
|
+
{:db/id 7
|
|
43
|
+
:db/ident :db/noHistory
|
|
44
|
+
:db/valueType :db.type/boolean
|
|
45
|
+
:db/cardinality :db.cardinality/one
|
|
46
|
+
:db/doc "An attribute's history selection"}
|
|
47
|
+
{:db/id 8
|
|
48
|
+
:db/ident :db.install/attribute
|
|
49
|
+
:db/valueType :db.type.install/attribute
|
|
50
|
+
:db/cardinality :db.cardinality/one
|
|
51
|
+
:db/doc "Only for interoperability with Datomic"}
|
|
52
|
+
{:db/id 9
|
|
53
|
+
:db/ident :db/txInstant
|
|
54
|
+
:db/valueType :db.type/instant
|
|
55
|
+
:db/cardinality :db.cardinality/one
|
|
56
|
+
:db/doc "A transaction's time-point"
|
|
57
|
+
:db/noHistory true
|
|
58
|
+
:db/index true}
|
|
59
|
+
{:db/id 10
|
|
60
|
+
:db/ident :db.cardinality/many}
|
|
61
|
+
{:db/id 11
|
|
62
|
+
:db/ident :db.cardinality/one}
|
|
63
|
+
{:db/id 12
|
|
64
|
+
:db/ident :db.part/sys}
|
|
65
|
+
{:db/id 13
|
|
66
|
+
:db/ident :db.part/tx}
|
|
67
|
+
{:db/id 14
|
|
68
|
+
:db/ident :db.part/user}
|
|
69
|
+
{:db/id 15
|
|
70
|
+
:db/ident :db.type/bigdec}
|
|
71
|
+
{:db/id 16
|
|
72
|
+
:db/ident :db.type/bigint}
|
|
73
|
+
{:db/id 17
|
|
74
|
+
:db/ident :db.type/boolean}
|
|
75
|
+
{:db/id 18
|
|
76
|
+
:db/ident :db.type/double}
|
|
77
|
+
{:db/id 19
|
|
78
|
+
:db/ident :db.type/cardinality}
|
|
79
|
+
{:db/id 20
|
|
80
|
+
:db/ident :db.type/float}
|
|
81
|
+
{:db/id 21
|
|
82
|
+
:db/ident :db.type/number}
|
|
83
|
+
{:db/id 22
|
|
84
|
+
:db/ident :db.type/instant}
|
|
85
|
+
{:db/id 23
|
|
86
|
+
:db/ident :db.type/keyword}
|
|
87
|
+
{:db/id 24
|
|
88
|
+
:db/ident :db.type/long}
|
|
89
|
+
{:db/id 25
|
|
90
|
+
:db/ident :db.type/ref}
|
|
91
|
+
{:db/id 26
|
|
92
|
+
:db/ident :db.type/string}
|
|
93
|
+
{:db/id 27
|
|
94
|
+
:db/ident :db.type/symbol}
|
|
95
|
+
{:db/id 28
|
|
96
|
+
:db/ident :db.type/unique}
|
|
97
|
+
{:db/id 29
|
|
98
|
+
:db/ident :db.type/uuid}
|
|
99
|
+
{:db/id 30
|
|
100
|
+
:db/ident :db.type/valueType}
|
|
101
|
+
{:db/id 31
|
|
102
|
+
:db/ident :db.type.install/attribute}
|
|
103
|
+
{:db/id 32
|
|
104
|
+
:db/ident :db.unique/identity}
|
|
105
|
+
{:db/id 33
|
|
106
|
+
:db/ident :db.unique/value}
|
|
107
|
+
{:db/id 34
|
|
108
|
+
:db/ident :db/isComponent}
|
|
109
|
+
{:db/id 35
|
|
110
|
+
:db/ident :db/tupleType}
|
|
111
|
+
{:db/id 36
|
|
112
|
+
:db/ident :db/tupleTypes}
|
|
113
|
+
{:db/id 37
|
|
114
|
+
:db/ident :db/tupleAttrs}
|
|
115
|
+
{:db/id 38
|
|
116
|
+
:db/ident :db.type/tuple}])
|
|
117
|
+
|
|
118
|
+
(def ^:const system-entities
|
|
119
|
+
"Holds the entity IDs of system attributes"
|
|
120
|
+
(set (reduce
|
|
121
|
+
(fn [m {:keys [db/ident db/id] :as attr}]
|
|
122
|
+
(when ident (conj m id)))
|
|
123
|
+
[]
|
|
124
|
+
system-schema)))
|
|
125
|
+
|
|
126
|
+
(def ^:const non-ref-implicit-schema
|
|
127
|
+
{:db/ident {:db/unique :db.unique/identity}
|
|
128
|
+
:db/txInstant {:db/noHistory true}
|
|
129
|
+
:db.entity/attrs {:db/cardinality :db.cardinality/many}
|
|
130
|
+
:db.entity/preds {:db/cardinality :db.cardinality/many}})
|
|
131
|
+
|
|
132
|
+
(def ^:const ref-implicit-schema
|
|
133
|
+
"Maps attribute names to the attribute's specification"
|
|
134
|
+
(reduce
|
|
135
|
+
(fn [m {:keys [db/ident] :as attr}]
|
|
136
|
+
(when ident
|
|
137
|
+
(assoc m ident (dissoc attr :db/ident))))
|
|
138
|
+
{}
|
|
139
|
+
system-schema))
|
|
140
|
+
|
|
141
|
+
(def ^:const ue0 (transduce (comp (map :db/id) (remove #{tx0})) max 0 system-schema))
|
|
142
|
+
(def ^:const utx0 tx0)
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
(ns ^:no-doc datahike.core
|
|
2
|
+
(:refer-clojure :exclude [filter])
|
|
3
|
+
(:require
|
|
4
|
+
[datahike.constants :as dc]
|
|
5
|
+
[datahike.datom :as dd]
|
|
6
|
+
[datahike.db :as db #?@(:cljs [:refer [FilteredDB]])]
|
|
7
|
+
[datahike.db.interface :as dbi]
|
|
8
|
+
[datahike.db.transaction :as dbt]
|
|
9
|
+
[datahike.db.utils :as dbu]
|
|
10
|
+
[datahike.impl.entity :as de]
|
|
11
|
+
[datahike.pull-api :as dp]
|
|
12
|
+
[datahike.query :as dq])
|
|
13
|
+
#?(:clj
|
|
14
|
+
(:import
|
|
15
|
+
[datahike.db FilteredDB]
|
|
16
|
+
[datahike.impl.entity Entity]
|
|
17
|
+
[java.util UUID]
|
|
18
|
+
(clojure.lang IDeref IBlockingDeref IAtom IPending))))
|
|
19
|
+
|
|
20
|
+
(def ^:const ^:no-doc tx0 dc/tx0)
|
|
21
|
+
|
|
22
|
+
; Entities
|
|
23
|
+
|
|
24
|
+
(def ^{:arglists '([db eid])}
|
|
25
|
+
|
|
26
|
+
entity de/entity)
|
|
27
|
+
|
|
28
|
+
(def ^{:arglists '([db eid])
|
|
29
|
+
:doc "Given lookup ref `[unique-attr value]`, returns numeric entity id.
|
|
30
|
+
|
|
31
|
+
If entity does not exist, returns `nil`.
|
|
32
|
+
|
|
33
|
+
For numeric `eid` returns `eid` itself (does not check for entity existence in that case)."}
|
|
34
|
+
entid dbu/entid)
|
|
35
|
+
|
|
36
|
+
(defn entity-db
|
|
37
|
+
"Returns a db that entity was created from."
|
|
38
|
+
[^Entity entity]
|
|
39
|
+
{:pre [(de/entity? entity)]}
|
|
40
|
+
(.-db entity))
|
|
41
|
+
|
|
42
|
+
(def ^{:arglists '([e])
|
|
43
|
+
:doc "Forces all entity attributes to be eagerly fetched and cached. Only usable for debug output.
|
|
44
|
+
|
|
45
|
+
Usage:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
(entity db 1) ; => {:db/id 1}
|
|
49
|
+
(touch (entity db 1)) ; => {:db/id 1, :dislikes [:pie], :likes [:pizza]}
|
|
50
|
+
```"}
|
|
51
|
+
touch de/touch)
|
|
52
|
+
|
|
53
|
+
; Pull
|
|
54
|
+
|
|
55
|
+
(def ^{:arglists '([db selector eid])}
|
|
56
|
+
pull dp/pull)
|
|
57
|
+
|
|
58
|
+
(def ^{:arglists '([db selector eids])}
|
|
59
|
+
pull-many dp/pull-many)
|
|
60
|
+
|
|
61
|
+
; Query
|
|
62
|
+
|
|
63
|
+
(def ^{:arglists '([query & inputs])}
|
|
64
|
+
q dq/q)
|
|
65
|
+
|
|
66
|
+
; Creating DB
|
|
67
|
+
|
|
68
|
+
(def ^{:arglists '([] [schema] [schema config])
|
|
69
|
+
:doc "Creates an empty database with an optional schema and configuration.
|
|
70
|
+
|
|
71
|
+
Usage:
|
|
72
|
+
```
|
|
73
|
+
(empty-db) ; => #datahike/DB {:schema {}, :datoms []}
|
|
74
|
+
|
|
75
|
+
(empty-db {:likes {:db/cardinality :db.cardinality/many}})
|
|
76
|
+
; => #datahike/DB {:schema {:likes {:db/cardinality :db.cardinality/many}}
|
|
77
|
+
; :datoms []}
|
|
78
|
+
|
|
79
|
+
(empty-db {} {:keep-history? false :index datahike.index.hitchhiker-tree :schema-flexibility :write})
|
|
80
|
+
```"}
|
|
81
|
+
empty-db db/empty-db)
|
|
82
|
+
|
|
83
|
+
(def ^{:arglists '([x])
|
|
84
|
+
:doc "Returns `true` if the given value is an immutable database, `false` otherwise."}
|
|
85
|
+
db? dbu/db?)
|
|
86
|
+
|
|
87
|
+
(def ^{:arglists '([e a v] [e a v tx] [e a v tx added])
|
|
88
|
+
:doc "Low-level fn to create raw datoms.
|
|
89
|
+
|
|
90
|
+
Optionally with transaction id (number) and `added` flag (`true` for addition, `false` for retraction).
|
|
91
|
+
|
|
92
|
+
See also [[init-db]]."}
|
|
93
|
+
datom dd/datom)
|
|
94
|
+
|
|
95
|
+
(def ^{:arglists '([x])
|
|
96
|
+
:doc "Returns `true` if the given value is a datom, `false` otherwise."}
|
|
97
|
+
datom? dd/datom?)
|
|
98
|
+
|
|
99
|
+
(def ^{:arglists '([datoms] [datoms schema] [datoms schema config])
|
|
100
|
+
:doc "Low-level fn for creating database quickly from a trusted sequence of datoms.
|
|
101
|
+
|
|
102
|
+
Does no validation on inputs, so `datoms` must be well-formed and match schema.
|
|
103
|
+
|
|
104
|
+
Used internally in db (de)serialization. See also [[datom]]."}
|
|
105
|
+
init-db db/init-db)
|
|
106
|
+
|
|
107
|
+
; Filtered db
|
|
108
|
+
|
|
109
|
+
(defn is-filtered
|
|
110
|
+
"Returns `true` if this database was filtered using [[filter]], `false` otherwise."
|
|
111
|
+
[x]
|
|
112
|
+
(instance? FilteredDB x))
|
|
113
|
+
|
|
114
|
+
(defn filter
|
|
115
|
+
[db pred]
|
|
116
|
+
{:pre [(dbu/db? db)]}
|
|
117
|
+
(if (is-filtered db)
|
|
118
|
+
(let [^FilteredDB fdb db
|
|
119
|
+
orig-pred (.-pred fdb)
|
|
120
|
+
orig-db (.-unfiltered-db fdb)]
|
|
121
|
+
(FilteredDB. orig-db #(and (orig-pred %) (pred orig-db %))))
|
|
122
|
+
(FilteredDB. db #(pred db %))))
|
|
123
|
+
|
|
124
|
+
; Changing DB
|
|
125
|
+
|
|
126
|
+
(defn with
|
|
127
|
+
"Same as [[transact!]], but applies to an immutable database value. Returns transaction report (see [[transact!]])."
|
|
128
|
+
([db tx-data] (with db tx-data nil))
|
|
129
|
+
([db tx-data tx-meta]
|
|
130
|
+
{:pre [(dbu/db? db)]}
|
|
131
|
+
(if (is-filtered db)
|
|
132
|
+
(throw (ex-info "Filtered DB cannot be modified" {:error :transaction/filtered}))
|
|
133
|
+
(dbt/transact-tx-data (db/map->TxReport
|
|
134
|
+
{:db-before db
|
|
135
|
+
:db-after db
|
|
136
|
+
:tx-data []
|
|
137
|
+
:tempids {}
|
|
138
|
+
:tx-meta tx-meta}) tx-data))))
|
|
139
|
+
|
|
140
|
+
(defn load-entities-with [db entities tx-meta]
|
|
141
|
+
(dbt/transact-entities-directly
|
|
142
|
+
(db/map->TxReport {:db-before db
|
|
143
|
+
:db-after db
|
|
144
|
+
:tx-data []
|
|
145
|
+
:tempids {}
|
|
146
|
+
:tx-meta tx-meta})
|
|
147
|
+
entities))
|
|
148
|
+
|
|
149
|
+
(defn db-with
|
|
150
|
+
"Applies transaction to an immutable db value, returning new immutable db value. Same as `(:db-after (with db tx-data))`."
|
|
151
|
+
[db tx-data]
|
|
152
|
+
{:pre [(dbu/db? db)]}
|
|
153
|
+
(:db-after (with db tx-data)))
|
|
154
|
+
|
|
155
|
+
; Index lookups
|
|
156
|
+
|
|
157
|
+
(defn datoms
|
|
158
|
+
([db index] {:pre [(dbu/db? db)]} (dbi/datoms db index []))
|
|
159
|
+
([db index c1] {:pre [(dbu/db? db)]} (dbi/datoms db index [c1]))
|
|
160
|
+
([db index c1 c2] {:pre [(dbu/db? db)]} (dbi/datoms db index [c1 c2]))
|
|
161
|
+
([db index c1 c2 c3] {:pre [(dbu/db? db)]} (dbi/datoms db index [c1 c2 c3]))
|
|
162
|
+
([db index c1 c2 c3 c4] {:pre [(dbu/db? db)]} (dbi/datoms db index [c1 c2 c3 c4])))
|
|
163
|
+
|
|
164
|
+
(defn seek-datoms
|
|
165
|
+
([db index] {:pre [(dbu/db? db)]} (dbi/seek-datoms db index []))
|
|
166
|
+
([db index c1] {:pre [(dbu/db? db)]} (dbi/seek-datoms db index [c1]))
|
|
167
|
+
([db index c1 c2] {:pre [(dbu/db? db)]} (dbi/seek-datoms db index [c1 c2]))
|
|
168
|
+
([db index c1 c2 c3] {:pre [(dbu/db? db)]} (dbi/seek-datoms db index [c1 c2 c3]))
|
|
169
|
+
([db index c1 c2 c3 c4] {:pre [(dbu/db? db)]} (dbi/seek-datoms db index [c1 c2 c3 c4])))
|
|
170
|
+
|
|
171
|
+
(defn rseek-datoms
|
|
172
|
+
"Same as [[seek-datoms]], but goes backwards until the beginning of the index."
|
|
173
|
+
([db index] {:pre [(dbu/db? db)]} (dbi/rseek-datoms db index []))
|
|
174
|
+
([db index c1] {:pre [(dbu/db? db)]} (dbi/rseek-datoms db index [c1]))
|
|
175
|
+
([db index c1 c2] {:pre [(dbu/db? db)]} (dbi/rseek-datoms db index [c1 c2]))
|
|
176
|
+
([db index c1 c2 c3] {:pre [(dbu/db? db)]} (dbi/rseek-datoms db index [c1 c2 c3]))
|
|
177
|
+
([db index c1 c2 c3 c4] {:pre [(dbu/db? db)]} (dbi/rseek-datoms db index [c1 c2 c3 c4])))
|
|
178
|
+
|
|
179
|
+
(defn index-range
|
|
180
|
+
[db attr start end]
|
|
181
|
+
{:pre [(dbu/db? db)]}
|
|
182
|
+
(dbi/index-range db attr start end))
|
|
183
|
+
|
|
184
|
+
;; Conn
|
|
185
|
+
|
|
186
|
+
(defn conn?
|
|
187
|
+
"Returns `true` if this is a connection to a DataScript db, `false` otherwise."
|
|
188
|
+
[conn]
|
|
189
|
+
(and #?(:clj (instance? IDeref conn)
|
|
190
|
+
:cljs (satisfies? cljs.core/IDeref conn))
|
|
191
|
+
(dbu/db? @conn)))
|
|
192
|
+
|
|
193
|
+
(defn- atom? [a]
|
|
194
|
+
#?(:cljs (instance? Atom a)
|
|
195
|
+
:clj (instance? IAtom a)))
|
|
196
|
+
|
|
197
|
+
(defn listen!
|
|
198
|
+
"Listen for changes on the given connection. Whenever a transaction is applied to the database via [[transact!]], the callback is called
|
|
199
|
+
with the transaction report. `key` is any opaque unique value.
|
|
200
|
+
|
|
201
|
+
Idempotent. Calling [[listen!]] with the same twice will override old callback with the new value.
|
|
202
|
+
|
|
203
|
+
Returns the key under which this listener is registered. See also [[unlisten!]]."
|
|
204
|
+
([conn callback] (listen! conn (rand) callback))
|
|
205
|
+
([conn key callback]
|
|
206
|
+
{:pre [(conn? conn) (atom? (:listeners (meta conn)))]}
|
|
207
|
+
(swap! (:listeners (meta conn)) assoc key callback)
|
|
208
|
+
key))
|
|
209
|
+
|
|
210
|
+
(defn unlisten!
|
|
211
|
+
"Removes registered listener from connection. See also [[listen!]]."
|
|
212
|
+
[conn key]
|
|
213
|
+
{:pre [(conn? conn)
|
|
214
|
+
(atom? (:listeners (meta conn)))]}
|
|
215
|
+
(swap! (:listeners (meta conn)) dissoc key))
|
|
216
|
+
|
|
217
|
+
;; Datomic compatibility layer
|
|
218
|
+
|
|
219
|
+
(def ^:private last-tempid (atom -1000000))
|
|
220
|
+
|
|
221
|
+
(defn tempid
|
|
222
|
+
"Allocates and returns a unique temporary id (a negative integer). Ignores `part`. Returns `x` if it is specified.
|
|
223
|
+
|
|
224
|
+
Exists for Datomic API compatibility. Prefer using negative integers directly if possible."
|
|
225
|
+
([part]
|
|
226
|
+
(if (= part :db.part/tx)
|
|
227
|
+
:db/current-tx
|
|
228
|
+
(swap! last-tempid dec)))
|
|
229
|
+
([part x]
|
|
230
|
+
(if (= part :db.part/tx)
|
|
231
|
+
:db/current-tx
|
|
232
|
+
x)))
|
|
233
|
+
|
|
234
|
+
(defn resolve-tempid
|
|
235
|
+
"Does a lookup in tempids map, returning an entity id that tempid was resolved to.
|
|
236
|
+
|
|
237
|
+
Exists for Datomic API compatibility. Prefer using map lookup directly if possible."
|
|
238
|
+
[_db tempids tempid]
|
|
239
|
+
(get tempids tempid))
|
|
240
|
+
|
|
241
|
+
(defn db
|
|
242
|
+
"Returns the underlying immutable database value from a connection.
|
|
243
|
+
|
|
244
|
+
Exists for Datomic API compatibility. Prefer using `@conn` directly if possible."
|
|
245
|
+
[conn]
|
|
246
|
+
{:pre [(conn? conn)]}
|
|
247
|
+
@conn)
|
|
248
|
+
|
|
249
|
+
(defn- rand-bits [pow]
|
|
250
|
+
(rand-int (bit-shift-left 1 pow)))
|
|
251
|
+
|
|
252
|
+
#?(:cljs
|
|
253
|
+
(defn- to-hex-string [n l]
|
|
254
|
+
(let [s (.toString n 16)
|
|
255
|
+
c (count s)]
|
|
256
|
+
(cond
|
|
257
|
+
(> c l) (subs s 0 l)
|
|
258
|
+
(< c l) (str (apply str (repeat (- l c) "0")) s)
|
|
259
|
+
:else s))))
|
|
260
|
+
|
|
261
|
+
(defn squuid
|
|
262
|
+
"Generates a UUID that grow with time. Such UUIDs will always go to the end of the index and that will minimize insertions in the middle.
|
|
263
|
+
|
|
264
|
+
Consist of 64 bits of current UNIX timestamp (in seconds) and 64 random bits (2^64 different unique values per second)."
|
|
265
|
+
([]
|
|
266
|
+
(squuid #?(:clj (System/currentTimeMillis)
|
|
267
|
+
:cljs (.getTime (js/Date.)))))
|
|
268
|
+
([msec]
|
|
269
|
+
#?(:clj
|
|
270
|
+
(let [uuid (UUID/randomUUID)
|
|
271
|
+
time (int (/ msec 1000))
|
|
272
|
+
high (.getMostSignificantBits uuid)
|
|
273
|
+
low (.getLeastSignificantBits uuid)
|
|
274
|
+
new-high (bit-or (bit-and high 0x00000000FFFFFFFF)
|
|
275
|
+
(bit-shift-left time 32))]
|
|
276
|
+
(UUID. new-high low))
|
|
277
|
+
:cljs
|
|
278
|
+
(uuid
|
|
279
|
+
(str
|
|
280
|
+
(-> (int (/ msec 1000))
|
|
281
|
+
(to-hex-string 8))
|
|
282
|
+
"-" (-> (rand-bits 16) (to-hex-string 4))
|
|
283
|
+
"-" (-> (rand-bits 16) (bit-and 0x0FFF) (bit-or 0x4000) (to-hex-string 4))
|
|
284
|
+
"-" (-> (rand-bits 16) (bit-and 0x3FFF) (bit-or 0x8000) (to-hex-string 4))
|
|
285
|
+
"-" (-> (rand-bits 16) (to-hex-string 4))
|
|
286
|
+
(-> (rand-bits 16) (to-hex-string 4))
|
|
287
|
+
(-> (rand-bits 16) (to-hex-string 4)))))))
|
|
288
|
+
|
|
289
|
+
(defn squuid-time-millis
|
|
290
|
+
"Returns time that was used in [[squuid]] call, in milliseconds, rounded to the closest second."
|
|
291
|
+
[uuid]
|
|
292
|
+
#?(:clj (-> (.getMostSignificantBits ^UUID uuid)
|
|
293
|
+
(bit-shift-right 32)
|
|
294
|
+
(* 1000))
|
|
295
|
+
:cljs (-> (subs (str uuid) 0 8)
|
|
296
|
+
(js/parseInt 16)
|
|
297
|
+
(* 1000))))
|