yes, I’ve upvoted that but it doesn’t seem to have more info
At work we tried both suggestions, and switched from the postwalk approach to the xforms. Mostly because of performance. We tend to def our pull expressions for re-use, so the xforms are in 1 place. Needing to remember it's a db/ident isn't much of a problem for us, it's required to pull db/ident anyway. But one could always write a linter make sure that xforms is used for idents.
is walk so slow? I’ve used it heavily and never had it be a problem in my work loads
We had a specific usecase where we had very big resultsets (~150,000 entities + nesting). That's when we replaced the postwalk. Generally it's fine for sure.2😅
that is a big result, out of curiosity, how much was the difference between walk and xform with that result?
Great thanks, that makes a lot of sense
Unfortuinely I don't have exact numbers. We also optimised the query at that time.
I was going to post this question here, and then I thought the forum might be a better place. Happy to have any input! https://forum.datomic.com/t/query-populous-business-entity-where-there-are-changes-at-any-level/1830
that looks quite tricky, can’t really say how make the query faster, but if you could update some attr on the root every time you update some descendant (like
:root/recursive-modification-time timestamp), you could simply query all roots based on that
in effect moving the “has some descendant changed” determination from query time to tx time
Hey, I never thanked you for this response, so thank you! When we discussed it on the team that was definitely a solution that came up when we asked "how would we have done this in SQL-land". I personally suspect that something may be wrong with my recursive rules, but I'm still working through some of the details. Jaret posted a great set of questions for us, which I'm working on answering
We also have very big query results.
To give a very rough idea about our postwalk approach vs a direct update fn;
(corpus is a list of 150,000 maps btw)1👍
(time (do (map (fn [x] (update x :field :db/ident)) corpus) nil)) "Elapsed time: 0.093924 msecs" => nil (time (do (walk/postwalk (fn [x] (if (and (map? x) (:db/ident x)) (:db/ident x) x)) corpus) nil)) "Elapsed time: 552.667018 msecs" => nil