GithubHelp home page GithubHelp logo

computesoftware / datomic-client-memdb Goto Github PK

View Code? Open in Web Editor NEW
57.0 6.0 11.0 60 KB

Datomic Client protocols for Datomic Peer databases

License: Eclipse Public License 1.0

Clojure 98.80% Shell 1.20%
datomic

datomic-client-memdb's People

Contributors

kennyjwilli avatar madstap avatar souenzzo avatar theronic avatar tothda avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

datomic-client-memdb's Issues

collection queries should fail

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]}],

Newest version not published to clojars

Hey there,

I noticed that @kyptin published this library to Clojars in ~October, however, the newer changes such as #7 are not included on Clojars.

Given that @kyptin is the one who published, should he update? Otherwise, would it be possible for you to publish a new version ^^?

Divergent behavior for nil query args

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.

Publish on Clojars

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.

Fails with co-dependency com.datomic/client-cloud v0.8.66: "No such var: client/Db"

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

Exception when transacting tuple attributes

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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.