Próbuję wykonać "sprzężenie zewnętrzne" w Datomic za pomocą interfejsu API REST. Od https://github.com/Datomic/day-of-datomic/blob/master/tutorial/social_news.clj I podjęły ostateczną przykład:Używanie funkcji bazy danych w zapytaniu o dane
(defn maybe
"Returns the set of attr for e, or nil if e does not possess
any values for attr."
[db e attr]
(seq (map :a (d/datoms db :eavt e attr))))
;; find all users
(q '[:find ?e ?upvote
:where
[?e :user/email]
[(user/maybe $ ?e :user/upVotes) ?upvote]]
(db conn))
włożeniu może funkcjonować do mojej bazy danych, a to może być sprawdzony sposób:
[:find ?n ?v :in $ :where [?e ?a ?v] [?a :db/ident :db/fn] [?e :db/ident ?n]]
powraca
:maybe #db/fn{:code "(seq (map :a (d/datoms db :eavt e attr)))", :params [db e attr], :requires [], :imports [], :lang :clojure}
Jednak ja nie jestem w stanie ustalić, jak wywołać funkcję w zapytaniu. Mam pewne atrybuty :data/user
dla niektórych transakcji, dla których chcę uzyskać wartość tam, gdzie istnieje. Oto zapytanie, które próbuję uruchomić; Chciałbym, aby :maybe
była funkcją bazy danych zdefiniowaną powyżej.
[:find ?attr ?v ?when ?who :where
[17592186045423 ?a ?v ?tx true]
[?a :db/ident ?attr]
[(:maybe $ ?tx :data/user) ?who]
[?tx :db/txInstant ?when]]
Jestem prawie pewien, że brakuje mi czegoś oczywistego, ale utknąłem na tym przez jeden dzień. Dzięki za pomoc!
Można oczywiście zdefiniować funkcję nie będącą bazą danych, która wywołuje d/invoke dla ciebie i po prostu wywołaj ją z poziomu zapytania. Może sprawić, że zapytanie będzie bardziej czytelne, jeśli wybierzesz dobre imię. – Brian