Il existe une fonction de requête pour vérifier le contenu de la session clara-rules de l'extérieur, j'ai donc essayé de savoir comment l'utiliser.
(ns clara-rules.join
(:require [clara.rules :refer [defrule fire-rules insert
mk-session query defquery]]))
(defrecord TypeA [attr-a join-key])
(defrecord TypeB [attr-b join-key])
;;Queries
(defquery find-all-As
[];;parameters
[?a <- TypeA];;Matching condition
)
(defquery find-As-by-attr
[:?value];; Parameter needs to be a keyword
[?a <- TypeA (= attr-a ?value)])
(defquery find-join-key-of-As
[]
[TypeA (= ?jk join-key)])
(defquery find-A-and-B-pair-by-join-key
[:?value]
[?a <- TypeA (= join-key ?value)]
[?b <- TypeB (= join-key ?value)])
(def sess (-> (mk-session)
(insert (->TypeA "a1" :foo)
(->TypeA "a2" :bar)
(->TypeA "a3" :baz)
(->TypeB "b1" :foo)
(->TypeB "b2" :bar)
(->TypeB "b3" :baz)
(->TypeB "b4" :qux))
(fire-rules)))
(query sess find-all-As)
;; ({:?a {:attr-a "a1", :join-key :foo}}
;; {:?a {:attr-a "a2", :join-key :bar}}
;; {:?a {:attr-a "a3", :join-key :baz}})
(query sess find-As-by-attr :?value "a1")
;; => ({:?a #clara_rules.join.TypeA{:attr-a "a1", :join-key :foo}, :?value "a1"})
(query sess find-join-key-of-As)
;; => ({:?jk :foo} {:?jk :bar} {:?jk :baz})
(query sess find-A-and-B-pair-by-join-key :?value :foo)
;; => ({:?a {:attr-a "a1", :join-key :foo},
;; :?value :foo,
;; :?b {:attr-b "b1", :join-key :foo}})
--defquery
peut être écrit de la même manière que le côté gauche de defrule
, sauf que les paramètres peuvent être reçus en externe.
query
renvoie la variable liée dans defquery
comme clé de la carte résultante
--query
renvoie la correspondance sous forme de séquence de cartesDans les exemples précédents, la seule façon de voir le résultat était d'utiliser l'effet secondaire (println) sur le côté droit de la règle. Je suis heureux d'avoir pu résoudre l'une des questions que je me posais depuis que je voulais savoir s'il y avait un moyen de vérifier les résultats sans utiliser d'effets secondaires.
Recommended Posts