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