2012-09-18 8 views
6

Estoy tratando de hacer una 'combinación externa' en Datomic a través de la API REST. De https://github.com/Datomic/day-of-datomic/blob/master/tutorial/social_news.clj He tomado el ejemplo final:Usando una función de base de datos en una consulta dactómica

(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)) 

insertar el mejor funcionan en mi base de datos, y que puede ser consultada por lo tanto:

[:find ?n ?v :in $ :where [?e ?a ?v] [?a :db/ident :db/fn] [?e :db/ident ?n]] 

vuelve

:maybe #db/fn{:code "(seq (map :a (d/datoms db :eavt e attr)))", :params [db e attr], :requires [], :imports [], :lang :clojure} 

Sin embargo, no puedo averiguar cómo llamar a la función en una consulta. Tengo un atributo :data/user en algunas transacciones, y quiero obtener el valor donde existe. Aquí está la consulta que estoy tratando de ejecutar; Me gustaría que :maybe sea la función de base de datos definida anteriormente.

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

Estoy bastante seguro de que me falta algo bastante obvio, pero he estado atascado en esto por un día. ¡Gracias por cualquier ayuda!

Respuesta

4

Debe usar d/invoke. Así que su ejemplo sería este:

[: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

Por supuesto, puede definir una función que no sea de base de datos que llame a d/invoke por usted, y simplemente llame desde dentro de la consulta. Puede hacer que la consulta sea más legible si elige un buen nombre. – Brian

4

Según el Query Doc de Datomic, puede usar cualquier función pura en las consultas. No tiene que instalarlos primero. Las funciones que debe instalar son funciones de transacción.

Las funciones de consulta no necesitan ser instaladas porque se ejecutan en su aplicación como todas las demás funciones. En Datomic no existe tal cosa como un servidor de base de datos que ejecuta consultas. Las consultas siempre se ejecutan en su aplicación por el Peer Library.

El único tipo de funciones que necesita instalar son las funciones de transacción porque se ejecutan dentro del Transactor. The Transactor es un proceso único y especial que maneja todas las escrituras en Datomic.

+0

Esto es súper genial. Este es el nuevo enlace http://docs.datomic.com/database-functions.html Tristemente las funciones de primera clase son exclusivas de Java/Clojure. – est

Cuestiones relacionadas