J'ai appris de la vidéo de la conférence que les règles de clara peuvent être utilisées pour des opérations de jointure entre différentes entités, j'ai donc implémenté moi-même un exemple simple.
(ns clara-rules.join
(:require [clara.rules :refer [defrule fire-rules insert insert! mk-session]]))
(defrecord TypeA [attr-a join-key])
(defrecord TypeB [attr-b join-key])
(defrecord TypeC [attr-a attr-b join-key])
(defrule Join
[TypeA (= ?jk-a join-key) (= ?a attr-a)]
[TypeB (= join-key ?jk-a) (= ?b attr-b)]
=>
(insert! (->TypeC ?a ?b ?jk-a)))
(defrule Print
[?result <- TypeC];; Will always match
=>
(println ?result))
(-> (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))
;;#clara_rules.join.TypeC{:attr-a a1, :attr-b b1, :join-key :foo}
;;#clara_rules.join.TypeC{:attr-a a2, :attr-b b2, :join-key :bar}
;;#clara_rules.join.TypeC{:attr-a a3, :attr-b b3, :join-key :baz}
: join-key
comme prévu. Tu l'as fait!
--(-> TypeB "b4": qux)
n'apparaît pas dans le résultat car il n'y a pas de fait TypeA avec le même: join-key: qux
. Je vois.Liez le fait lui-même à une variable et non à l'attribut du fait.
En prenant [? Result <-TypeC]
comme exemple, la totalité de l'instance TypeC correspondante est liée à? Result.
Recommended Posts