A luxuriously simple and powerful way to make front-ends with DataScript and Reagent in Clojure.
q
. A simple case would be where q is looking for [?e :some/attrib ?v]
, then you just look for anytime any transaction with :some/attrib
occurs. The functions for figuring this out are insrc/posh/lib/q_analyze.cljc
. The simpler version is called pattern-from-eav--old
, which is more easy to understand but generates patterns that are much less specific than the query. ("eav" is an entity-attrib-value rule). The more complex function is called pattern-from-eav
and unfortunately it worked really well until we found out it missed one common case, which I couldn't figure out how to fix, so posh is just using the simpler one for now.
q-analyze
with the :datoms
flag you'll get a list of all the relevant datoms for a query, which you could run on the datomic db and then just send all the datoms over to datascript. How the :datoms
thing works, if I remember correctly, is the original query is changed so that instead of returning the stuff specified in the :find
of the q
query, it just returns all possible combinations of the ?
query vars in the :where
eav rules. Then to construct the datoms, it goes through all query eav rules and replaces all the ?
vars with every possible combos.
q
on the set of possible vars (not the whole db), so it should still be pretty fast
pull
is more efficient than q
, so you might be able to get away with a large ui if you use mostly pulls.
hey @mpdairy first of all thanks for the great work that you have done with posh !! that is definitely the missing piece in reactive programming that I was looking for.
I just started working with it and got some errors using pull
. I checked the source code and Cursive
showed me that there are three functions used with less than their declared arguments; namely
posh.plugin-base/missing-pull-result
line 20 and 22posh.plugin-base/get-db
line 127object[TypeError TypeError: null is not an object (evaluating 'new cljs.core.Keyword(null,"conn?","conn?",167224275).cljs$core$IFn$_invoke$arity$1(dcfg).call')]
posh$plugin_base$get_db
cljs$core$IFn$_invoke$arity$5
posh$plugin_base$pull
cljs$core$IFn$_invoke$arity$4
G__10589__3
G__10589
eval code
eval@[native code]
figwheel$client$utils$eval_helper
Since I just started working with posh, I am not sure if this is a problem with my configuration or an actual bug in the implementation, so I wanted to ask you first. I am happy to submit a PR to fix that if you want.
travis ci
for one of my projects. I didnt setup the auto deploy myself but I think that the file is pretty self-explanatory. The only things that you would need to change are the your encripted env vars and your release config in project.clj
. Links below
(reg-query-sub
:cur-form-def
'[:find (pull ?e [*])
:in $
:where
[_ :designer/cur-form-id ?id]
[?e :form/id ?id]
])
[:code (pr-str @conn)]
inside my root component re-render on every db change?
debug-conn
here will work. Haven’t really stress tested it though might just be getting lucky. If you want to be more efficient you could rig up a listen!
on the conn.