computesoftware / datomic-client-memdb Goto Github PK
View Code? Open in Web Editor NEWDatomic Client protocols for Datomic Peer databases
License: Eclipse Public License 1.0
Datomic Client protocols for Datomic Peer databases
License: Eclipse Public License 1.0
I don't quite understand why is this library has been deprecated in favour of dev-local
.
I haven't found a way to use dev-local
to manage an in-memory DB.
If that's true, then this library is still fulfilling a very important use-case, isn't it?
I did ask about this on the Datomic forum too just now:
https://forum.datomic.com/t/dev-and-test-locally-with-dev-local/1518/11?u=onetom
When I run
(d/q {:query '[:find [(pull ?e [*]) ...]
:in $
:where
[?e :db/ident]]
:args [db]})
it should throw something like:
#error{:cause "Only find-rel elements are allowed in client find-spec, see http://docs.datomic.com/query.html#grammar",
:data {:cognitect.anomalies/category :cognitect.anomalies/incorrect,
:cognitect.anomalies/message "Only find-rel elements are allowed in client find-spec, see http://docs.datomic.com/query.html#grammar",
:dbs [{:database-id "6a32fd06-cfad-4a8c-998d-934fb909fda4", :t 7, :next-t 8, :history false}]},
:via [{:type clojure.lang.ExceptionInfo,
:message "Only find-rel elements are allowed in client find-spec, see http://docs.datomic.com/query.html#grammar",
:data {:cognitect.anomalies/category :cognitect.anomalies/incorrect,
:cognitect.anomalies/message "Only find-rel elements are allowed in client find-spec, see http://docs.datomic.com/query.html#grammar",
:dbs [{:database-id "6a32fd06-cfad-4a8c-998d-934fb909fda4", :t 7, :next-t 8, :history false}]},
:at [datomic.client.api.async$ares invokeStatic "async.clj" 56]}],
Datomic cloud version:
"group-cft-version":"616",
"group-cloud-version":"8879",
Repro:
(let [db (d/db conn)
attrs nil]
(d/q
{:query '[:find ?e
:in $ ?attrs]
:args [db attrs]}))
attrs
can also be absent from the in
clause and it will throw this same error.
Stack trace:
Execution error (IllegalArgumentException) at datomic.client.impl.shared/eval42582$fn$G (shared.clj:219).
No implementation of method: :->query-arg of protocol: #'datomic.client.impl.shared/QueryArg found for class: nil
I didn't see this behavior locally, but saw it once I deployed my query to production.
My project includes some inexperienced developers who use Windows. I just realized that the Clojure CLI tools don't work on Windows (also see the official Jira issue). Yes, the Windows users can install a Linux environment, but that turns out to be a significant obstacle for beginners.
If you pushed a versioned artifact to Clojars or Maven, Leiningen (which works on Windows) could fetch the artifact. It looks like the standard way to push to Clojars these days is to use a tool like depstar or cambada to create a JAR, then use Maven as described on the Clojars wiki to push it to Clojars. (Also, Alex Miller mentioned in the #tools-deps
channel of the Clojurians Slack that the -Spom
option to clojure
/clj
will create (or update) a pom.xml
file for you based on the contents of deps.edn
.)
Let me know if this is something you're not interested in doing it, and I may just fork + push it myself.
I love the idea of this project, but it doesn't seem to work with the as-of-now latest version of the com.datomic/client-cloud
library, v0.8.66. It does, however, work with the next-latest version, v0.8.63. Here's a reproducible test case.
deps.edn
:
{:deps
{compute/datomic-client-memdb
{:git/url "https://github.com/ComputeSoftware/datomic-client-memdb.git"
:sha "c17b57597c9f442adef931b653175b4341330bad"}
;; com.datomic/client-cloud {:mvn/version "0.8.66"}
}}
test.clj
:
(require '[datomic.client.api :as d])
(require '[compute.datomic-client-memdb.core :as memdb])
(def client (memdb/client {}))
(def db-name "test")
(d/create-database client {:db-name db-name})
(def conn (d/connect client {:db-name db-name}))
(def schema
[{:db/ident :clojure/version
:db/valueType :db.type/string
:db/unique :db.unique/value
:db/cardinality :db.cardinality/one}])
(d/transact conn {:tx-data schema})
(d/transact conn {:tx-data [{:clojure/version (clojure-version)}]})
(def query '[:find ?v, :where [_ :clojure/version ?v]])
(def db (d/db conn))
(prn (d/q query db))
When I run the above code with the command clojure -Srepro -Sforce test.clj
, I get:
#{["1.9.0"]}
However, if I uncomment the line in deps.edn
(so that it depends on com.datomic/client-cloud {:mvn/version "0.8.66"}
, I get an error, which I've appended below. If I change the version to "0.8.63"
, it again prints #{["1.9.0"]}
.
Here's the error I get:
Exception in thread "main" java.lang.RuntimeException: No such var: client/Db, compiling:(compute/datomic_client_memdb/core.clj:21:1)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7010)
at clojure.lang.Compiler.analyze(Compiler.java:6773)
at clojure.lang.Compiler.analyze(Compiler.java:6729)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:6100)
at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6420)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7003)
at clojure.lang.Compiler.analyze(Compiler.java:6773)
at clojure.lang.Compiler.analyze(Compiler.java:6729)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:6100)
at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5460)
at clojure.lang.Compiler$FnExpr.parse(Compiler.java:4022)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7001)
at clojure.lang.Compiler.analyze(Compiler.java:6773)
at clojure.lang.Compiler.eval(Compiler.java:7059)
at clojure.lang.Compiler.load(Compiler.java:7514)
at clojure.lang.RT.loadResourceScript(RT.java:379)
at clojure.lang.RT.loadResourceScript(RT.java:370)
at clojure.lang.RT.load(RT.java:460)
at clojure.lang.RT.load(RT.java:426)
at clojure.core$load$fn__6548.invoke(core.clj:6046)
at clojure.core$load.invokeStatic(core.clj:6045)
at clojure.core$load.doInvoke(core.clj:6029)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invokeStatic(core.clj:5848)
at clojure.core$load_one.invoke(core.clj:5843)
at clojure.core$load_lib$fn__6493.invoke(core.clj:5888)
at clojure.core$load_lib.invokeStatic(core.clj:5887)
at clojure.core$load_lib.doInvoke(core.clj:5868)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invokeStatic(core.clj:659)
at clojure.core$load_libs.invokeStatic(core.clj:5925)
at clojure.core$load_libs.doInvoke(core.clj:5909)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invokeStatic(core.clj:659)
at clojure.core$require.invokeStatic(core.clj:5947)
at clojure.core$require.doInvoke(core.clj:5947)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at user$eval544.invokeStatic(test.clj:2)
at user$eval544.invoke(test.clj:2)
at clojure.lang.Compiler.eval(Compiler.java:7062)
at clojure.lang.Compiler.load(Compiler.java:7514)
at clojure.lang.Compiler.loadFile(Compiler.java:7452)
at clojure.main$load_script.invokeStatic(main.clj:278)
at clojure.main$script_opt.invokeStatic(main.clj:338)
at clojure.main$script_opt.invoke(main.clj:333)
at clojure.main$main.invokeStatic(main.clj:424)
at clojure.main$main.doInvoke(main.clj:387)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.lang.Var.applyTo(Var.java:702)
at clojure.main.main(main.java:37)
Caused by: java.lang.RuntimeException: No such var: client/Db
at clojure.lang.Util.runtimeException(Util.java:221)
at clojure.lang.Compiler.resolveIn(Compiler.java:7273)
at clojure.lang.Compiler.resolve(Compiler.java:7243)
at clojure.lang.Compiler$NewInstanceExpr.build(Compiler.java:7893)
at clojure.lang.Compiler$NewInstanceExpr$DeftypeParser.parse(Compiler.java:7813)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7003)
... 49 more
The following exception occurs when transacting tuple attributes such as:
{:db/ident :document/country+type+vendor-tax-id+fiscal-year+number+environment
:db/valueType :db.type/tuple
:db/tupleAttrs [:document/country
:document/type
:document/vendor-tax-id
:document/fiscal-year
:document/number
:document/environment]
:db/cardinality :db.cardinality/one
:db/unique :db.unique/value
:db/doc "Document number uniqueness is composed of multiple attributes."}
Exception:
Unhandled java.util.concurrent.ExecutionException
java.lang.IllegalArgumentException: :db.error/not-an-entity Unable to resolve
entity: :db/tupleAttrs
promise.clj: 10 datomic.promise/throw-executionexception-if-throwable
promise.clj: 6 datomic.promise/throw-executionexception-if-throwable
promise.clj: 54 datomic.promise/settable-future/reify
core.clj: 2320 clojure.core/deref
core.clj: 2306 clojure.core/deref
core.clj: 75 compute.datomic-client-memdb.core.LocalConnection/transact
api.clj: 179 datomic.client.api/transact
api.clj: 162 datomic.client.api/transact
database.clj: 89 datil.infrastructure.database/ensure-schema
database.clj: 86 datil.infrastructure.database/ensure-schema
transactions_test.clj: 17 datil.finance.tax-clearance.transactions-test/install-schema
transactions_test.clj: 14 datil.finance.tax-clearance.transactions-test/install-schema
transactions_test.clj: 26 datil.finance.tax-clearance.transactions-test/setup-db
transactions_test.clj: 23 datil.finance.tax-clearance.transactions-test/setup-db
transactions_test.clj: 35 datil.finance.tax-clearance.transactions-test/db-fixture
transactions_test.clj: 33 datil.finance.tax-clearance.transactions-test/db-fixture
test.clj: 694 clojure.test/compose-fixtures/fn/fn
test.clj: 687 clojure.test/default-fixture
test.clj: 683 clojure.test/default-fixture
test.clj: 694 clojure.test/compose-fixtures/fn
test.clj: 215 cider.nrepl.middleware.test/test-vars
test.clj: 209 cider.nrepl.middleware.test/test-vars
test.clj: 231 cider.nrepl.middleware.test/test-ns
test.clj: 222 cider.nrepl.middleware.test/test-ns
test.clj: 242 cider.nrepl.middleware.test/test-var-query
test.clj: 235 cider.nrepl.middleware.test/test-var-query
test.clj: 280 cider.nrepl.middleware.test/handle-test-var-query-op/fn/fn
AFn.java: 152 clojure.lang.AFn/applyToHelper
AFn.java: 144 clojure.lang.AFn/applyTo
core.clj: 665 clojure.core/apply
core.clj: 1973 clojure.core/with-bindings*
core.clj: 1973 clojure.core/with-bindings*
RestFn.java: 425 clojure.lang.RestFn/invoke
test.clj: 272 cider.nrepl.middleware.test/handle-test-var-query-op/fn
AFn.java: 22 clojure.lang.AFn/run
session.clj: 171 nrepl.middleware.session/session-exec/main-loop/fn
session.clj: 170 nrepl.middleware.session/session-exec/main-loop
AFn.java: 22 clojure.lang.AFn/run
Thread.java: 830 java.lang.Thread/run
1. Caused by datomic.impl.Exceptions$IllegalArgumentExceptionInfo
:db.error/not-an-entity Unable to resolve entity: :db/tupleAttrs
{:entity :db/tupleAttrs, :db/error :db.error/not-an-entity}
error.clj: 57 datomic.error/arg
error.clj: 52 datomic.error/arg
db.clj: 589 datomic.db/require-id
db.clj: -1 datomic.db/require-id
db.clj: 689 datomic.db/require-attrid
db.clj: 686 datomic.db/require-attrid
db.clj: 2436 datomic.db/expand-map/fn
protocols.clj: 168 clojure.core.protocols/fn
protocols.clj: 124 clojure.core.protocols/fn
protocols.clj: 19 clojure.core.protocols/fn/G
protocols.clj: 31 clojure.core.protocols/seq-reduce
protocols.clj: 75 clojure.core.protocols/fn
protocols.clj: 75 clojure.core.protocols/fn
protocols.clj: 13 clojure.core.protocols/fn/G
core.clj: 6828 clojure.core/reduce
core.clj: 6810 clojure.core/reduce
db.clj: 2431 datomic.db/expand-map
db.clj: 2425 datomic.db/expand-map
db.clj: 2479 datomic.db.ProcessInpoint/inject
db.clj: 2729 datomic.db/with-tx/inject-all/fn
PersistentVector.java: 343 clojure.lang.PersistentVector/reduce
core.clj: 6827 clojure.core/reduce
core.clj: 6810 clojure.core/reduce
db.clj: 2729 datomic.db/with-tx/inject-all
db.clj: 2733 datomic.db/with-tx
db.clj: 2722 datomic.db/with-tx
peer.clj: 563 datomic.peer.LocalConnection/fn
peer.clj: 563 datomic.peer.LocalConnection/transactAsync
peer.clj: 555 datomic.peer.LocalConnection/transact
api.clj: 94 datomic.api/transact
api.clj: 92 datomic.api/transact
core.clj: 74 compute.datomic-client-memdb.core.LocalConnection/transact
api.clj: 179 datomic.client.api/transact
api.clj: 162 datomic.client.api/transact
database.clj: 89 datil.infrastructure.database/ensure-schema
database.clj: 86 datil.infrastructure.database/ensure-schema
transactions_test.clj: 17 datil.finance.tax-clearance.transactions-test/install-schema
transactions_test.clj: 14 datil.finance.tax-clearance.transactions-test/install-schema
transactions_test.clj: 26 datil.finance.tax-clearance.transactions-test/setup-db
transactions_test.clj: 23 datil.finance.tax-clearance.transactions-test/setup-db
transactions_test.clj: 35 datil.finance.tax-clearance.transactions-test/db-fixture
transactions_test.clj: 33 datil.finance.tax-clearance.transactions-test/db-fixture
test.clj: 694 clojure.test/compose-fixtures/fn/fn
test.clj: 687 clojure.test/default-fixture
test.clj: 683 clojure.test/default-fixture
test.clj: 694 clojure.test/compose-fixtures/fn
test.clj: 215 cider.nrepl.middleware.test/test-vars
test.clj: 209 cider.nrepl.middleware.test/test-vars
test.clj: 231 cider.nrepl.middleware.test/test-ns
test.clj: 222 cider.nrepl.middleware.test/test-ns
test.clj: 242 cider.nrepl.middleware.test/test-var-query
test.clj: 235 cider.nrepl.middleware.test/test-var-query
test.clj: 280 cider.nrepl.middleware.test/handle-test-var-query-op/fn/fn
AFn.java: 152 clojure.lang.AFn/applyToHelper
AFn.java: 144 clojure.lang.AFn/applyTo
core.clj: 665 clojure.core/apply
core.clj: 1973 clojure.core/with-bindings*
core.clj: 1973 clojure.core/with-bindings*
RestFn.java: 425 clojure.lang.RestFn/invoke
test.clj: 272 cider.nrepl.middleware.test/handle-test-var-query-op/fn
AFn.java: 22 clojure.lang.AFn/run
session.clj: 171 nrepl.middleware.session/session-exec/main-loop/fn
session.clj: 170 nrepl.middleware.session/session-exec/main-loop
AFn.java: 22 clojure.lang.AFn/run
Thread.java: 830 java.lang.Thread/run
I guess this is expected behavior. I would really like to work on this but not at this moment, so I want to document it here.
See #14 for a test demonstrating this issue.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.