2012-09-18 9 views
6

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!

Odpowiedz

4

Musisz użyć d/invoke. Twój przykład będzie wyglądał następująco:

[:find ?attr ?v ?when ?who :where 
[17592186045423 ?a ?v ?tx true] 
[?a :db/ident ?attr] 
[(d/invoke $ :maybe ?tx :data/user) ?who] 
[?tx :db/txInstant ?when]] 
+0

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

4

Zgodnie z Query Doc z Datomic, możesz użyć dowolnej czystej funkcji w zapytaniach. Nie musisz ich instalować w pierwszej kolejności. Funkcje, które musisz zainstalować, to funkcje transakcyjne.

Funkcje zapytania nie muszą być instalowane, ponieważ działają w aplikacji, podobnie jak wszystkie inne funkcje. W Datomic nie ma czegoś takiego jak serwer bazy danych, który wykonuje kwerendy. Zapytania są zawsze wykonywane w aplikacji przez Peer Library.

Jedyny typ funkcji, które należy zainstalować, to funkcje transakcyjne, ponieważ działają one wewnątrz Transactor. Transactor jest pojedynczym, specjalnym procesem, który obsługuje wszystkie zapisy w Datomic.

+0

To jest super fajne. To jest nowy link http://docs.datomic.com/database-functions.html Niestety, pierwszorzędne funkcje to wyłączność Java/Clojure. – est

Powiązane problemy